JUNのブログ

JUNのブログ

活動記録や技術メモ

#Procon29に参加した。

注意!!
この記事に有益な内容は含まれておりません。プログラムに対する知見などは得られません。

みなさんこんばんは。今回は10/27~28に徳島で行われた 全国高等専門学校プログラミングコンテスト (通称:プロコン)の競技部門(人力部門) に参加してきたのでそれについて書きたいと思います。ちなみにプロコンは初出場です。

正直最初はあまりにひどかったので書く気はなかったのですが、他高専の人たちが書いてるのを見て書きたくなったので書きます。

最初の注意書きにも書いていますが、この記事に有益な内容はほとんどありません。

5月

プロコンの競技部門の概要を見ていました。
ルールを見た感じなんかAlphaZeroの手法使えばいけるくね? と思って教官に「少し競技部門興味あります」って言ったら競技部門プロジェクトリーダーになっていました。

しかし、うちの学校では競技部門は人気がなく人が集まりませんでした。仕方ないので機械科3年の友達(以下M3と呼ぶ) を誘い無理やり入れました。あとは、解体されたプロジェクトから情報科2年の子(以下I2と呼ぶ) が来ました。これでメンバーが3人集まりました。

6,7月

プロコンのルールに従ったゲームのプログラムを作りました。 この時点で情報科の子はミーティングなどにだんだん顔を出さなくなってきました。(やばいね)

7月らへんに AlphaZero の手法である MCTS+NN について調べはじめました。

8,9月

8月

何もしていません。
そして開発者は基本僕1人なので本当になにも進んでいません。

私はインターンとかセキュリティキャンプとかHackUとかいろいろしてました。

9月下旬

そして、後期が始まりました。ここで衝撃の事実が発覚します。

I2が起業するために休学してました。

まぁ正直彼はコード1行どころか1文字も書いていなかったので正直問題ありませんでした。しかし、本当の問題は 人数が足りない ということです。
もともとうちのチームは3人しかいなく、競技部門のルール上チームは最低3人必要でした。なのでこのままでは本番に出られません。

どうしたもんか...と悩みました。

10月

ここで1年生の情報科の子が入ってくれました。これで一応大会には出れます。

プロコン1ヶ月前になりました。やっと私はコードを書くのを再開しました。

とりあえず時間が無いのでそのへんからMCTSとNNのコードをコピペして、それをゲームに合わせて書き直したりしてました。

ですが、そのままではうまくいきませんでした。
いくつかの原因を考えました。

  • 複数エージェントゲームである。
  • 不完全情報ゲームである。つまり、自分の行動が確実に盤面に反映されるとは限らない。
  • simultaneous game である。(日本語でなんて言うか知らない)
  • フィールドのサイズがランダム
  • フィールドのマスのスコアがランダム
  • ターン数がランダム

つまり、ランダム要素が多すぎるということが原因だと考えました。

そこで、私はいくつかの対策を行いました

複数エージェントゲームである。

1つのエージェントを扱うように2つのエージェントを操作できるようにした。
具体的には、(Agent1行動, (行動方向), Agent2行動, (行動方向)) を1つの行動としました。ただ、こうすると行動可能数が (8方向*2行動パターン)2 = 256 になり、流石に多い気がします。
なので、さらにここから価値の無い行動のゲームノードを作らないようにしました(正確にはUCB1の値に0を掛けた)。

不完全情報ゲーム & simultaneous game である。

ゲーム木を工夫して盤面を相互ターン制ゲームlikeな感じに表現しました。
要は、自プレイヤーが行動した次のノードは敵プレイヤーのターンというふうにしました。与えられる盤面は両者同じです。両者が意思表示が終わり盤面に反映されればその次のノードからはその盤面が入力として与えられるようにしました。

フィールドサイズがランダム

これはつまり、フィールドのinputのサイズが違うと学習できないだけの話なので、最大フィールドサイズである12*12のサイズの配列にフィールドを当てはめるようにしました。これにフィールドの範囲 内が1になっているチャンネルを加えました。

フィールドのマスのスコア&各マスのスコアがランダム

これに関してはよくある特徴量作り的な感じでそのスコアやターン数でカテゴリ番号を付けたりしました。 ただ、これに関しては失敗だったと思います。なぜなら、本番時フィールドのスコアにばらつきはほとんどなくスコアが1~5のマスがほとんどでした。

これらのことを私一人ですべて行っていました。もちろん昼間は学校があるのでコードは書けないので夜~朝に書いていました。 何回か過労で倒れました。あと授業はほとんど寝てました。

10月下旬(プロコン5日前)

多分間に合わないなと確信したのでソルバー開発を捨てました。(人力への完全移行)

一応なにもプログラムが無いというのはまずいと思い、申し訳程度のGUIアプリケーションの開発を始めました。一応ベースはM3が作ってくれていたので私はそこに各種ゲームロジックの組み込みとゲーム操作パネルの設置とスコア表示部分などもろもろを付けました。

10月26日 (プロコン前日)

この日は公欠で学校は休みで朝から徳島に移動しました。

徳島についたらホテルに向かいました。ホテルは東横インでした。東横インは初めてでしたが、とても快適に過ごせたのでこれから観光するときは利用しようかなと思いました。

夜はTwitterで普段絡んでる人達とラーメンを食べたりラウンドワン音ゲーをしたりしました。
めっっっっちゃ楽しかったです。

なおこの時点でGUIプログラムは完成していません。

なので、深夜5時くらいまで起きてコードを書いていました。

プロコン1日目

ここで本番前にやっと指示の出し方を決めました。あと指示塔は3人の中で一番賢いM3くんにやってもらいました(ありがとね)。
指示の出し方は指示塔から見て正面が1でそこから時計回りに1~8としました。そしてトランプが縦なら移動、横ならタイル除去という風にしました。エージェントの区別は黒と赤で分けました。

そして、予行練習前にGUIのやつが完成しました(偉いね)。 しかし、予行練習でデバッグ用のコードになっていてQRコード読み込み部分がコメントアウトされていて結局使いませんでした。

本番3試合しました。結果としては2勝1敗でした。しかし、私達は人力なので負けても正直何も思わないどころかむしろプログラムを使ってちゃんとプロコンしているところに勝ってほしいとみんな思っていました。

GUIプログラムについては途中でバグが発覚したため最初の2試合は使いませんでした。
3試合目、初めてGUIプログラムを使いましたが1ターンあたりの時間が短く入力が間に合わないので結局はじめの3ターンしか使っていませんでした。

Twitterのタイムラインを見ていると人力に切り替えているチームが多数見られたので「プログラミングコンテストとは...」と思いました。

この日は帰ってすぐ寝ました。

プロコン2日目

この日は敗者復活戦がありました...が、ぐだぐだでした。
運営が途中でトラブルを起こしタイムスケジュールが40分がずれて決勝戦も含めすべてのゲームのターン数が40ターンになったり、敗者復活戦4戦目のフィールドがルールの規定から外れていて再試合などなど...

私達のチームの結果は敗退でした。そうですか。って感じですね。(モチベ0)

残りの時間は他の高専生と喋って連絡先交換(Twitter)したり、裏プロコンを観戦したり、プロコンに来ていた知り合いのエンジニア数人と久しぶりに会って盛り上がったりと楽しかったです。

自由・課題・各種ブース

自由、課題共に面白い作品が多かったです。個人的にはフィリピンの大学が作った時間割制作システムが好きでした。

ブースについては TwitterでPFNがブースを出しているということなのでそこに行ってきました。 PFNブースにはかの有名な秋葉さんがいて、私が疑問に思っていること、最近の機械学習の流行りや各種技術の現状、技術や進路に対するアドバイスをもらえました。正直これだけでプロコンに参加して良かったって思うレベルで良かったです。

感想

とにかく、ソルバーを3ヶ月かけて作ったのに1ターンの時間の制約のせいで人力にせざるえなかったチームがいくつか見られたので本当に可哀想でした。来年はなんとかしてほしいものです。

私自身今回のプロコンに関しては当日や前日は楽しかったです。 正直それ以前はしんどすぎて楽しいのかどうかわかりません。今の気持ちはやっと解放されたという気持ちが大きいです。

正直に言うと今回のプロコンはトラウマレベルできつかったです。来年に関しては出るかどうかはわかりません。
面白いアイデアなどがあれば参加したいとは思っていますが、どうも私は鳥羽商船高専情報科のあの陽キャなノリについていけない気がするのでメンバーにもよるかもしれません。
ただ、最近プロコンに他にやりたいことを我慢して3ヶ月を費やすほどの価値があるのかわからなくなってきたのでどうなるかはわかりません。

あと、うちの学校で技術系の話で盛り上がれる人がほとんどいないのでプロコン前日のオフ会で技術関係の話で盛り上がったのは本当に楽しかったです。また一緒に遊んだり喋ったりしたいです。

あと、うちの競技部門担当教官にはとても感謝しています。様々なサポートをしてくれましたし、「ソルバーは多分完成しません」って言った時に責められなかったのは助かりました。あとはいろいろ教えてくれたり、プログラムを手伝ってくれたり今回のプロコンにおいて最も感謝している人物です。

とりあえず、プロコン関係者、阿南高専の学生、プロコン参加学生の方含めすべての関係者のみなさんお疲れ様でした。
来年は出るかはわかりませんが、もし出ることになったら来年は都城でお会いしましょう!