A - Single Controller Multiple Robots Editorial
by
bowwowforeach
解法
基本方針は、まずロボットをそれぞれの持ち場へ移動させ、その後「ジグザグ移動」を3つのボタンで実行させる、というものです。
ジグザグ移動とは、RRRRDLLLLDRRRRDLLLLD… のように横移動と縦移動を交互に繰り返す動きです。
このジグザグには、方向の組み合わせとして 8種類のパターン があります。
手順
1. ジグザグの移動回数を決める
まずは試しに「横に8回、縦に10回」など、ジグザグの移動回数を仮で設定します。
2. 開始点と方向パターンを決める
各ロボットについて以下をランダムに決定します。
- ジグザグを始める位置(開始点)
- ジグザグの方向パターン
決定した組み合わせでシミュレーションを行い、「濡らせたマスの数」を評価値とします。
これを使って山登り法で開始点とパターンを改良していきます。
遷移のルール:
- 各ロボットについて開始点と方向パターンを全通り試し、一番多くのマスを濡らせるものを採用。
- 濡れるマス数が同じなら、初期位置から開始点までの距離が短い方を選ぶ。
更新できなくなった時点で山登り終了。
全てのマスが濡れなかった場合は、手順1に戻って移動回数を増やして再挑戦します。
3. ボタンへの行動割り当て
次に、各ロボットを「初期位置 → ジグザグ開始点」に移動させるためにボタンを割り当てます。
- ジグザグ移動用の3ボタンはすでに確保済み。残り7ボタンを自由に割り当て可能です。
- 各ロボットの現在位置を初期位置に設定し、ジグザグ開始点までの距離を計算します。
- 最大距離を d とすると、「押すと距離が d→d-1 になる」ようなボタンがあればそれを押します。
- そうしたボタンがなければ、未使用のボタンに新たな行動を割り当てて押します(できるだけ全員が開始点に近づく方向を選ぶ)。
- 最大距離を d とすると、「押すと距離が d→d-1 になる」ようなボタンがあればそれを押します。
これを繰り返して全ロボットが開始点に到達すれば成功です。
もしボタンが足りなくなった場合は、手順1に戻って移動回数を増やして再挑戦します。
4. 改善の繰り返し
時間がある限り、
- ジグザグの移動回数を調整したり
- 開始点や方向パターンを変えたり
を繰り返して、より良い結果を探索します。
posted:
last update: