第30回全国高等専門学校プログラミングコンテスト参加記

Lafolia です。都立品川代表として高専プロコン競技部門に参加しました。結果は2回戦敗退です。
弊校の半年間の虚無を綴ります。

問題公開以前

先輩と「前回は大炎上しましたけど2年連続来ますかね?」「さすがに来ないやろw」とか盛大にフラグを立てる。

4 月

とりあえずルールを読む。2年連続同じ問題でした。絶望。
読み進めていくと、去年の 無駄な 人力が消え、エージェントの数 だけ が増えたことが分かる。

この段階でモチベが限りなく 0 になる。

先輩が早々とソルバ書くことを拒否したため、UI を全てぶん投げて僕一人でソルバを書くことに。
僕自身も書く気が全く起きなかったので、とりあえず Google C++ Style Guide に則って書くことにする。

5 月

去年のプログラムを漁った結果、謎最適化が横行しており書いた本人(僕ではない)ですらそれがどうなっているかを把握できていなかったので流用を断念。おとなしく自力で実装します。

スタイルガイドに適当な相槌を入れながら実装を進める。書きづらいね。
到底速いプログラムができるとは思えないが(それはそう?)、初読での可読性が向上する点は評価していい(そもそも競プロ like なプログラムはそれを犠牲にしやすい)。

6 月

完成。案の定遅い。
ビームサーチは定数倍高速化がものを言うと思ったので(あと単純に書く気が失せた)、全体の設計を開始する。

「盤面データを直接 priority_queue に入れるよりも適当な key で保存して、 key と evaluation だけ priority_queue に入れた方が速そう」とか、「大量に呼び出される箇所のオブジェクトは static にしたほうが速そう」とか実験して遊び始める。

7 月

無。記憶がないけど Github の Network が言うんだから間違いない。

多分 6 月の遊びを続けてたんじゃないですかね。

8 月

あと 2ヶ月しかないじゃん、やばい。

9 月

覚醒する(モチベがあるとは言っていない)。

とりあえず(ちゃんと速い)普通のビームサーチを書く。書き終える。

書き終えたのでエージェントの数が多くても対応できるのを書く。書き終える。

検証する。得点のみの評価でまあまあ動くことがわかる。
逆に得点に関係しない評価を強くすると一気に雑魚くなるので虚無になる。

この段階でできることがビームサーチの改善と評価関数の作成・パラメータサーチだけだったので後者をやる。得点に関係しない評価は弱くすればそれなりの効果を持つのが存在したのでちょっとうれしくなる。

10 月

評価関数作成の進捗が全くでなくなったのでパラメータサーチをする。

たまにビームサーチの改善案が思いつくので実装すると、特別強くならないことがわかって悲しくなる。

本選

強い AI が作れないまま移動が始まる。

1日目(移動)

新幹線に揺られて鹿児島に。

移動の都合上 40 分だけ空き時間が出たので駅周辺をぐるっとする。

都城に着弾する。

お腹が空いたのでラーメンを食べる。

ホテル内に岩盤浴の設備があったので行く。
これすごかったです。90 分暇だから有益なこと考えてようと思ったら何も考えられずに時間が過ぎ去ってた。

2日目(受付)

宮崎駅に行って SUGOCA と土産を買う。

寝る。

受付に行く。

最後のパラメータサーチをする。

3日目(大会1日目)

予行練習で周りがほぼ動かなくてびっくりする。

通信も先輩にぶん投げてたのでなにか言える立場にないが、流石に事故りすぎでしょみたいな気持ち。
やっぱり鯖は仕様のみを公開するんじゃなくて実態も公開したほうが事故が減って嬉しいと思います。

1st ステージで勝つ。 2チーム動いてなかったのでまぁみたいな気持ち。
ちなみにリーグ内には熊本(熊本)さんがいました。全勝したので実質弊校も特別賞だと思います。

ホテルに戻って意識が落ちる。他校の人と夜飯を食べる約束を盛大にすっぽかす。
大変申し訳ありませんでした。

4日目(大会2日目)

2nd ステージで弓削高専に第1試合に勝つ。第2試合で負ける。
得点差で敗退する。つらい。
乱戦になると弱い話はあったからなぁ。

ホテルのフロントで観戦する(Wifi が飛んでるので)。
東京が勝つ。会いに行ってひたすら褒め称える。

帰宅。

感想

改めて振り返ると全体的に虚無をしていることがわかります。まともに開発してたの 9 月からじゃん。よくないね。

敗因は "人力を徹底的に排他した" ことだと思います。ぶっちゃけプログラムの出来は敵・盤面との相性があり、最終的にはじゃんけんになるので本質ではないと思ってます。
東京高専さんの方針は弊校も案が出たんですけど、僕自身がプログラムのみで勝負したい気持ちが強かったので採用しませんでした。
僕のこの考えは明らかに高専プロコンにマッチしてなくて、(唯一?)そのへん込で実装してしっかりと優勝した東京高専さんは本当に偉いと思いました。
本当に、AI が人間に勝てないと判明した段階で素直に人力を交えるべきでした。

ところで僕はゲーム AI を作って戦わせることに結構憧れがあったんですよね。
具体的には高知大会の問題をアーカイブで観て「俺もやりたい!」ってなりました。

で、ゲーム AI を二年連続でやった今の感想は、「もうゲーム AI なんか書きたくない」です。
開発してて一番つらかったのが "人間より強い AI が作れない" ことと "ある程度からは目に見える進捗がなくなる"ことで、2 年連続で(ほぼ)同じ問題をやったことも相まって軽くトラウマになってます。
CodinGame やるの楽しそうと思ってた時期もあったんですけど、しばらくは絶対やらないです。

来年

とりあえず次大会までの半年間は傷を癒やすために適当な開発をして遊ぶつもりです。
来年は最適化問題が出るので(決めつけ)(ホントお願いします)、次回は優勝できるようにモチベ高めてがんばります。人力もちゃんと考慮するようにします。

リポジトリ

せっかくなので公開したリポジトリも貼っておきます。

https://github.com/Lafolia13/Zero_Sum_Ranges