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 力を上げておけばよかったのか…!
仕様変更に関しては、ゆるい作りにしていたお陰でそれほど困りませんでした。最適化が終わってからひっくり返されてたら発狂してたかもしれませんが。
次回はあまりマラソンっぽくない問題がいいなー。