- N=5
- スコアは以下の合計(少ないほど良い)
- M0: ターン数
- M1: 搬出の順番が違う個数(転倒数).100倍される
- M2: 搬出口が誤った個数.10,000倍される
- M3: 搬出されなかった個数.1,000,000倍される
- すべてのコンテナが正しい搬出口から正しい順番で搬出されることが前提で、ターン数をいかに短くできるか
- コンテナが搬入される順番によって難易度が違う
- 得点が最大となる配置(一番楽、理想的な配置)
- 搬入と搬出が同じiで、搬入の順番と正しい搬出の順番が同じ場合
- 0 1 2 3 4
- 5 6 7 8 9
- 10 11 12 13 14
- 15 16 17 18 19
- 20 21 22 23 24
- クレーンで右から左に搬出を繰り返すだけ.一往復に10ターン(PRRRRQLLLL)かかり4往復し、最後は6ターン(PRRRRQ).合計46ターン
- スコア46
- 搬入と搬出が同じiで、搬入の順番と正しい搬出の順番が同じ場合
- 難易度が高い配置
- 正しい搬出の順番と逆の搬入であり、搬入と搬出のiが違い入り混じっている
- 得点が最大となる配置(一番楽、理想的な配置)
- すべてのコンテナが正しい搬出口から正しい順番で搬出することが出来る方法
- 大きいクレーンを使い、正しい搬出口1つずつ処理することを考える
- その際、一時配置が一番少なくなる搬出口から処理するとすべて搬出することができるのではないか
- 最初の搬出口から搬出する際に、一番最悪な一時配置は20個、二番目は15個となるため、一番少なくなる搬出口から搬出すればできそう
- 5つの搬出口が同時に最悪な一時配置のパターンは10個.最後から一番目に一番最初の搬出、二番目に二番目の搬出...で、4+3+2+1=10個
- つまり10個以下の一時配置で1つ目の搬出口をすべて搬出できるはず
- 1つ目の搬出口の分をすべて搬出できたら、同じように残り4つの搬出口で一時配置が一番少なくなる搬出口から処理する
- その際にすでに一時配置しているコンテナは再度一時配置不要なため、一時配置の使用マスはないと考えて一時配置が最小となる搬出口から処理する
- 2つ目の搬出口は10個一時配置されているとして、余ったマス5個に一時配置すると、搬入口からすべて出てきて、残りの全20個一時配置されることになる
- 大きいクレーンを使えば、順番に搬出するだけになる
- 今回のコンテストの難しい点
- すべて正しく搬出できるか
- ターン数を縮めるため、クレーンを並行稼働する
- その際クレーン同士がぶつからないようにする
- 低いクレーンはコンテナを掴んだ状態でコンテナが配置しているマスに移動できない
- そのためコンテナの一時配置により低いクレーンを並行稼働できるか影響する
- 目標スコア
- 搬入口と搬出口が決まっているため、理想的な搬出は算出可能
- 搬出: 6+abs(in-out)ターン
- 一時配置: 2ターン
- 一時配置が必要なコンテナ
- 同じ搬出口の搬出の順番が遅いコンテナ
- 違う搬出口の搬出の順番が遅しコンテナ
- ただし搬出の仕方、配置などで必ずしも一時配置が必要なわけではない
- 一時配置が必要なコンテナ
- 搬入口に戻る: 4ターン+α
- 最適な戻る搬入口が等確率で発生すると考えるとα=(4+3+2+1+0)/5=2ターン
- 実際は近い方に戻った方が最適になりやすいので、もう少し少ないターンになりそう
- 搬入口と搬出口が決まっているため、理想的な搬出は算出可能
- 戦略1: 搬出口を1つずつ処理していく
- メリット: 確実に正しく搬出できそう
- デメリット: 理想的な配置のように、他の搬出口も並行して処理した方が効率が良い場合がある
- 1つの搬入口、搬出口に集合するため移動のロスがある
- つまり左から右に移動するだけなら、クレーンの縦移動が不要
- と思ったが、実際はどうか?
- 搬入口から搬出口の縦移動はどのような場合でも必要.つまり搬入口まで移動してしまえば、クレーンの衝突や一時配置のコンテナを避けることを考えなければ同じ
- 初期配置or搬出口から搬入口までの移動はロスが出そう.初期配置のまま処理をする、搬出口からまっすぐ搬入口に戻るが理想
- 処理する場所が固定化されることで、搬入口までの移動が最適化されない
- 戦略2: 焼きなまし
- プレイアウト(最後まで処理)するのは大変?
- ベースがあって、改善?
- どの搬入口を処理するか、どのクレーンを使うか、どこに一時配置するか
- 搬出できる場合は搬出した方が効率がよい?一時配置すると配置・再度つかむの2ターンは増える
- ただクレーンのすれ違いの待ち、コンテナが配置してあって回り道するなど、一概には言えないか
- 評価関数
- コンテナが搬出できるまでのターン数の合計
- 搬入口までに出るまでのターン数.ただしクレーンで運ぶので前に残っている搬出していないコンテナの考慮が必要
- 一時配置されている(搬入口含む)コンテナの搬出までのターン数.ただし先に搬出が必要なコンテナの考慮が必要
- 大きいクレーンか小さいクレーンを使うかによる考慮が必要
- コンテナが搬出できるまでのターン数の合計
- コンテナの搬入口や搬出口、位置、一時配置のコストはクラス、メソッドで容易に判定できるようにする
- Monitor
- コンテナが今どこにいるかを保持
- id(Aij, N×i+j), (i, j)(搬出口iからj番目に出すコンテナ)の両方で検索
- 搬入口iの残コンテナ、次のコンテナを検索
- マスの一時配置状況を検索
- コンテナが今どこにいるかを保持
- Container
- コンテナの状態を保持
- 位置、搬入口、搬出口
- id(Aij, N×i+j), (i, j)(搬出口iからj番目に出すコンテナ)の両方
- コンテナの状態を保持
- 戦略1
- 大きいクレーンですべて正しく搬出する(Done)
- 一時配置を搬出口の近くに置く(Done)
- 搬出できるコンテナは搬出する
- 並行で一時配置や搬出を行う
- v1: 大きいクレーンですべて正しく搬出する(RE 3つ)
- v2: v1のfree_spaceのバグを修正(提出: 19,273, 評価: 19,149)
- v3: 一時配置を搬出口の近くに置く(提出: 17,659, 評価: 17,589)