第9回 Asprova プログラミングコンテスト やったこと

 

大まかな流れ

  1. 全ての設備の初期稼働パターンを平日は全て 7、休日は全て 6 とする。
  2. 全ての設備の全稼働パターンを 1 ずつ上げ下げして、遅れ作業有り/無しの境界線を探す。
  3. 今までの遅れ作業無しのパターンのうちスコアが最も高いパターンから...
    1. 〜 X-2 週目: 一つの設備の稼働パターンを下げる(詳細は後述)。
    2. X-1 週目: 各設備について、設備負荷率が 0 の週の稼働パターンを 1 にする。
    3. X 週目: 各設備について、稼働パターンが 1 でない最後の週の設備負荷率が十分に低い場合、その週の稼働パターンを 1 下げる。

※ いずれの処理においても、稼働パターン変更回数の上限をオーバーする操作はスキップする。

3-a の詳細

どの設備を選ぶ?

  • 各設備は、次に稼働パターンを下げるとしたらどの週の {平日, 休日, 両方} の稼働パターンを下げるかあらかじめ決めている。
  • (それを実行に移した時に削減されるコスト) × (1 - 稼働パターンの修正が行われる週の平均設備負荷率) の値が最も高い設備を選ぶ。
    • 削減されるコストの期待値が高い設備を選びたかったが、稼働パターンを下げた時に遅れが発生しない確率は分からないので、代わりに「1 - 稼働パターンの修正が行われる週の平均設備負荷率」を用いた。

各設備の次の稼働パターンの下げ方は?

失敗したら次の下げ方へ移る。

  1. 平日/休日の両方について、全ての週の稼働パターンを 1 下げる。
  2. 平日について、a 週目以降の稼働パターンを 1 下げる。
    • a の初期値は 1
  3. 休日について、a 週目以降の稼働パターンを 1 下げる。
  4. 遅れ作業が発生している週のうち最も遅い週を x としたとき、a = max(a + 1, x * 0.666) として 2. に移る。

ただし、上記の処理の途中で前節の削減コストの期待値っぽい値が閾値より小さくなった場合、「a 週目以降の稼働パターンを 1 下げる」をやめ、「特定のある週の稼働パターンを 1 下げる」に変更する。これについても削減コストの期待値っぽい値を計算しベストな週を選択する。