AHC064参加記
はじめに AtCoder Heuristic Contest 064 に参加し、440位(perf 1298)でした。 成績は芳しくないですが、参加記を残そうと思います。 問題 https://atcoder.jp/contests/ahc064/tasks/ahc064_a ルールベースで車両を1台ずつ順番に揃えていく方法を採用しました。 指定された線路に車両を指定された順番に少ないターン数で並べていくのが目的。 線路には最終的に列車がならぶ出発線のほか、バッファ的な意味合いの待機線がある 車両は全部で100台、出発線・待機線はそれぞれ10列。 列車は出発線ー待機線間を移動可能(出発線同士、待機線同士の直接移動は不可) 1ターンに車両が衝突しない限り(=移動線が交錯しない限り)同時に複数の移動が可能 解法 ルールベースで車両を1台ずつ順番に揃えていく方法を採用しました。 ターゲットとする車両(以下、対象車両)を以下の3ステップで目的の場所へ運びます。 1. 対象車両を待機線の先頭へ移動 対象車両が出発線、待機線のどちらにいるかで分岐します。 出発線にいる場合:その列の末尾から対象車両までを待機線へ移動。 待機線にいる場合:対象車両より前にある車両を、目的以外の出発線へ一時退避 2. 目的地の整理 目的の出発線にある邪魔な車両を、対象車両がいる待機線とは別の待機線へ移動。 3. 目的地への移動 対象車両を待機線から目的の出発線へ移動。 出発線・待機線間の移動は、物理的な距離が近くなるものを優先して選択しました 。 処理順は「IDの下1桁(=格納先の列番号)」が小さい順とし、同グループ内はランダムに決定。制限時間いっぱい試行してベストなスコアを採用しました。 最後に、全手順を見直して独立して行える(=移動線が交錯しない)操作を1ターンに集約する後処理を行っています。 反省点 車両をひとつずつ処理することに縛られてしまった この手順に縛られている限り、一つの車両を正しい位置に移動させ終わるまで、ほかの車両のことを考慮することが全くできません。 この手順の制約が大きすぎて改善する余地がほとんどありませんでした。 車両の処理順を一部ランダム化して山登り(あるいは多点スタート)のような形を試しま...