HACK TO THE FUTURE 2019予選の反省
beta.atcoder.jp
7位/519でした。
今回は、意地でも定番解答にはならない問題をchokudaiさんが作ってくるかなと思ったら、わりと定番だった。見えることを1つ1つ改善していけば、点が増えていきやすいタイプ。
…と思いきや、後半に、いろいろ考察をちゃんとしてれば、加点できる要素があったので、上位から下位まで、実力が出やすい問題だった気もする。
tsukammoさん、chokudaiさん、ありがとうございました!
良かったこと
- 天才解法を考える誘惑に負けず、簡単なところから行ったのが良かった。
- 決勝に出れないのは分かっていたけど、ちゃんと最後までがんばった。もう衰える一方の年齢なので、老化防止のために、がんばるべきときにがんばるのは重要。
反省すべきこと
- 残り2時間で伸びなかったのだけど、条件が変わった後の再考察が足りなかった気がする。
- 焼きなまし法のマスの状態遷移の調整(開始5時間経過あたり)で、"#TD"はいらないということに気づく。ここで、TD#がなくなったことで問題の条件が大きくかわったので、高速化できる要素等がないか改めて考えるべき。今回の場合、TD#がなくなったことにより、命令Sはマスが.LRどれでも直進1歩になったので、マス変更の影響がなくなる。
- 2Dフィールドで、何かを動かすというのは、マラソンマッチでは定番。それなのに、経路を圧縮するのを思いつかないのは、ダメ。
- せめて焼きなましの温度調整は、自動化したほうが良かった気がする。30ケースで軽いからと、自動化しなかった。
- 一部ソースコードが大変に汚い(ムダなif文など)。コード汚いと、基本遅いし、また、いろいろ試すのをためらう原因になるので、ちゃんと書きましょう。
解法
マスを'..LR'の割合で遷移させる焼きなまし法。10万ループぐらい。5度→0度で線形変化。評価関数はスコアのまま。
やったこと
- 変更マスを通ったロボットだけ、経路を更新する。
- ロボット経路を保存して、ロボットの途中位置から計算
- マスは1次元配列で持つ
- 遷移状態の調整。TD#を使わない。
- 焼きなまし、変化スコアが悪くなったら計算途中早期打ち切り。
- わりと重要テクニックで。これで焼きなまし回数が2万→10万ぐらいまで増え、13万到達。
やったけどボツ
- 中央付近にLR少なめ
- 中央付近はあまり変えない
- ロボット0の箇所の評価点を、最初は高めに
- 初期盤面を、高スコアのときの割合の'L''R'に合わせて配置
やらずにボツ
- ロボットが4個・5個重なるケースにわずかに加点。そもそも、初期状態でも、ほぼ4,5がなかった。でも、やって損はなかったのでは。
- 'S'の数の偶奇でロボットを分ける(壁にぶつかると無意味)
気づかなかったこと
- 移動コマンドの圧縮。
- 変更マスを通り、回転するロボットだけの経路を更新する。(上記の説明)
- 初期L盤面。
hakomoさんの解析なるほどじゃ。
— nico_shindannin (@nico_shindannin) 2018年11月12日
ロボットをバラバラにする問題だから、最初からバラしていくのが良く、LRはむしろ悪いマスぐらいに思っていたのじゃ。
最終的にバラければいいし、ロボットの途中の場所はあまり重要でないので(最後にバラければ良い)、速度の恩恵のほうがでかいのか #HTTF
- kimiyukiさんの解答によると、「中央にDで縦棒を引いて土管のようなものを作るとLが実質小さくなるので速い」。kimiyukiさん、面白い形状をつくった改善が得意な印象があります。
最重要
復習しないとムダ。復習しないとムダ。復習しないとムダ。