【高専プロコン】競技部門最後の10日間がやばすぎた!?-プログラミングコンテストガチ報告

こんにちは。とある高専生のSekitoです。

 1か月半程度前に全国高専プログラミングコンテストがあったのですが、その報告をしていなかったのでここで、その壮絶な修羅場をここで話そうかと思います。

今回のコンテストの内容は↓

http://www.procon.gr.jp/wpcontent/uploads//2016/12/e017e38ca89f7a0d04d6ad74319ffde0-1.pdf

私達は、AIを用いてこの課題に挑むことにしました。 

 

1.夏休み前

 5,4,3年生でとりあえずAIを作る前にゲームのシミュレーターを製作。Pythonを使って上手く分担できたので割とスムーズに行けたと思う。ちょっとバグが残ったくらい。

 

2.夏休み前半

 試験もあったりして一時開発が滞った。特に4年生はインターンで開発には来れない状態。ちょくちょくAiについて話していたりはした。

 

3.夏休み後半~10月初頭

 熊太郎氏と共同して本格的にAIについて会議や開発。モンテカルロ木探索で盤面とその勝率を計算し、ニューラルネットワを用いたAIに学習させて強力なプログラムを作る構想だった。

 AIは実行速度の為にC言語で開発をすることにした。AlphaZeroの記事を参考にモンテカルロ木探索について調べたり、C言語にシミュレーターを移植したりした。今回のゲームは将棋やオセロと仕様が違う部分が多く(交互にコマを動かすのではなく同時に動くなど)モンテカルロ木探索の適用は困難だった。

 

4.10月後半

 残り期間は少なかったが、モンテカルロ木探索は私と熊太郎が協力して一応ディープラーニングを使わない、モンテカルロ木探索のみでのプログラムは動作させることができた。人間と対戦させてみてもそこそこ強いプログラムだった。

 ニューラルネットワークの方はというと、3年生がモンテカルロ木探索の実装で手一杯だったために、5年生のU先輩がKerasで実装をしてくださった。これに試合データを学習させた結果、最善手の正解率が非常に高い優秀なAIが完成。このAIをモンテカルロ木探索のプログラムに組み込んで、探索+ニューラルネットワークで本番のAIを作るという方策だった。

 

しかし、ここで慢心してしまったのであった...

 

ここからが修羅場の始まり。

 まず、C言語で開発を進めたのにも関わらず、KerasやChainerなどで作ったニューラルネットワークによるAIを実行するにはPythonなどが必須であることが今更ながら判明した(誰も開発環境に無頓着だった...)。

ここで選択肢は2つ。

①何とかしてC言語ニューラルネットワークを作成

ニューラルネットワークのをあきらめてモンテカルロ木探索のプログラムを極める

モンテカルロ木探索をPythonに移植する

まず、①は実現可能かどうかわからない上に実行速度も未知数、開発期間も足りない

など現実的ではないために断念。

結果、③を実行しつつもしそれができない場合は本番はモンテカルロ木探索のみのプログラムを使うということにした。

しかし、残り期間はこの時点で一週間未満。当然完成させるのは非現実的だった。

 

そして残る問題がもう一つ。

 ほとんど誰も本番を想定した練習をしていなかった

画面上でデバッグを行ったりすることはあったが、指示を出したりプログラムを操作する練習というのは手一杯だったのかどうでもいいと思ってしまったのか、ほぼ行っていなかった。これは予想外に致命的だった。

 

本番前日。

まず、A准教授が道に迷う、連絡が取れないなどトラブルで混乱。到着後、Pythonへの移植作業、バグ修正、本番用の練習などを大慌てで行った。そう、プログラムは結局完成してない上に本番の動きさえほぼ把握できていない状態だったのである。

 

そして本番当日。

結局ニューラルネットを用いたプログラムは完成しなかったのでモンテカルロ木探索のプログラムを使うことにした。

しかし、ここで致命的な問題が発覚した。

QRコードを読み取る練習を行っておらず、その手順も多かったためにQRコードを読み取れないという。何とかbatファイルを用いて簡単化したが、会場が暗くQRコードをよく読み取れない。しかも、QRコードを読み取れてもプログラムを操作する時間が短すぎて指示が追い付かない。

結局実践を想定していないと、探索やAIが完成しても本番には全く通用しないのである。

 

2日目敗者復活戦。

ここでようやくプログラムがまともに動かせる。

しかし、途中までうまくいっていたものの途中から指示がやはり追い付かなくなる。

最後の試合は結局QRコードの読み取りに失敗し、相手チームプログラムの不具合(?)で両チーム指示が出せない状況に。すると、空気を読んでネタに走ったのか、投げやりになったのかお互い向かい合った状態でずっと静止。向かい合ってる相手が失笑、それに対しこちら側も笑いがこみあげてきて気まずい雰囲気に(笑)

試合後、相手チームの方がtwitterと、それと実際に会った時にこちら側へ、ありがとうございました。とおっしゃっていたのでこちら側も、こんな試合にしてしまって申し訳ありません。と返した。これはこれで面白かったのかも...(苦笑)

 

 

 

散々な結果で終わったコンテストでしたが、これで得られたものはとても大きいと思います。プログラムの発想力や応用的な技術にも触れることができましたし、AIに関する知識に触れるきっかけにもなりました。何より、高専生活のいい思い出の一つになったことは間違いないです!