ICFP Programming Contest 2012

http://icfpcontest2012.wordpress.com/

今年は一人で参加してました。

問題は Boulder Dash 風のゲームを解く AI を作れというもの。TopCoder のマラソン(Marathon Match)にありそうな問題だなーという印象でした。マラソンと違うのは、コンテストの途中でルールの追加が予告されていることと、スコアボードがないので終了まで他のチームの状況がわからないこと。

え、じゃあ適当なマラソンに参加したほうが楽しいんじゃ…などということは考えないようにして、金曜の夜はシミュレータを実装して終わり。

土曜は朝起きたら最初の仕様追加(マップが水没していく)がアナウンスされていたのでシミュレータに実装して、後は lightning division 用に適当な局面評価で探索するソルバーをでっちあげました。

日曜起きると、新たにルールが2つ追加されていました。トランポリンとヒゲ。何だヒゲって。とりあえず追加仕様は置いておいて、寝ている間に思いついた(?)詰み検知ルーチンを実装。やっとまともに問題が解けるようになってきました。

引き続きトランポリンとヒゲの対応をシミュレータと AI に組み込んで、再度全マップを試してみたら contest*.map が解けなくなってる…。初めて git bisect のお世話になりました。これはいかんと思いテストスクリプトを整備。

そうこうしているうちに、次の追加ルールが発表されました。高階岩。これを実装して日曜は終了。

最終日はちょっとモチベーションの維持に失敗した感じでした。だらだらと AI のパラメータをチューニングして、大きいマップで壊れないようにして、駆け込みで幾つかのハックを追加して提出。

提出したソースコード

配布されたマップでの成績はこんな感じでした。得点/ハイスコア の平均は86%。

マップ 得点 ハイスコア
contest1.map 212 212
contest2.map 281 281
contest3.map 275 275
contest4.map 575 575
contest5.map 1297 1303
contest6.map 1177 1177
contest7.map 869 869
contest8.map 1915 1973
contest9.map 3083 3095
contest10.map 3588 3634
flood1.map 945 945
flood2.map 281 281
flood3.map 846 1303
flood4.map 653 1594
flood5.map 575 575
trampoline1.map 426 426
trampoline2.map 1742 1742
trampoline3.map 554 5477
beard1.map 860 860
beard2.map 4461 4522
beard3.map 628 1789
beard4.map 1830 3103
beard5.map 655 946
horock1.map 745 762
horock2.map 747 747
horock3.map 1582 2406

感想

なんだか不完全燃焼な感じで終わってしまいました。ネタに走るという方向も一瞬考えたのですが、今回の問題で Unlambda とかで何かするのはちょっと難しそうなので諦めました。Befunge 力を上げておけばよかったのか…!
仕様変更に関しては、ゆるい作りにしていたお陰でそれほど困りませんでした。最適化が終わってからひっくり返されてたら発狂してたかもしれませんが。
次回はあまりマラソンっぽくない問題がいいなー。