見出し画像

第34回高専プロコン競技部門参加記

 松江高専プロコン競技部門です。とても遅くなってしまいましたが、福井県鯖江市で行われた高専プロコン競技部門に参加してまいりました!参加した感想や作戦について、ご紹介させていただきます!!!
 (※この記事では、「AI」を「コンピュータに考えさせているプログラム」としています。よって、学習のみならず探索アルゴリズムもAIに含めています。ご了承ください。)


競技ルール

今回のルールは、一風変わった陣取りゲームでした。
ルール詳細はこちら

職人を動かして、城壁を建築して陣地を囲もうというゲームです。また、城を囲むと高得点が得られます。

さらに、今大会では競技フィールドが全て公開されていました。選手はこのフィールド情報をもとに作戦を考えることが可能でした。

作戦

(※ところどころ専門用語を使っています。専門外の方は読みにくいかもしれませんが、ご容赦ください。)
(専門外の方が読んでくださるのかはさておき)

基本戦略

 基本的には、全ての職人の行動を独立に探索しました。我々は「シングルエージェント」と呼んでいました。職人1人につき、13通り(建築4方向+移動8方向+滞在)の行動が考えられます。この13通りの行動をしらみつぶしに数ターン先まで探索しようという戦略です。相手のことは一切探索に入れていません。
 独立に探索している関係で、協力や妨害を考えることができませんが、計算量の関係上そこまで読むことは難しいという判断で、独立に計算することにしました。
 評価関数はルールベースの得点に加えて、「城に隣接したマスへの建築」を加点要素としました。

定石

 今回は、対戦フィールドが事前に公開されていたので、最初の数ターンの行動を事前にプログラムに打ち込んで決定していました。特徴のあるマップでは、かなり有効に動作したと思います。
 しかし、「確率は低いけど、固定の動きをしているときに相手から妨害されたら?」など、さまざまな怖さがありました。。。

大会本番

 大会前日に、バスで島根県から福井県へ移動しました。約7時間ぐらいでした。長かったです。
 バスの中でも開発作業ちょっとしていました(笑)

1日目

 1日目は午前中に「予行演習」が、午後から「ファーストステージ」および「セカンドステージ」が行われました。
 当日の朝の「関係者連絡会議」で、「公開されたフィールドのうち、どのフィールドで試合をするか」という情報が公開されました。それを見た瞬間「終わったわ」という感情になりました。1日目にでてきそうなフィールドを予想して、そのフィールドに対する対策をしていましたが、完全に山を外して対策が甘いフィールドで勝負することになりました。急いで発表されたフィールドの対策をしました。
 そんなことをしていると、「予行演習」の時間となってしまいました。通信部分がちゃんと動くか不安でしたが、無事に送受信することができました。また、先輩が別にUCTというアルゴリズムでプログラムを作ってくれていたので、その動作確認を第2対戦を使って行いました。が、なぜかエラーとなりました。驚くべきその原因は、なんと「試合IDが0のときのみ正常に動作する実装になっていた」でした!!その場でプログラム修正して途中から試合に接続しました。(それでも運営のAIよりは得点高かったです)
 そして、お昼ご飯を食べに行きました。緊張でめちゃめちゃ気持ち悪かったです。吐きそうでした。が、料理がおいしかったので完食できました!!
 ファーストステージが始まり、ついに大会が始まったという感じでした。ファーストステージは前半と後半に分かれていて、我々は後半に参加することになっていました。もちろん、前半の試合中は開発を行っていました。そして、直前まで「UCT」と「シングルエージェント」どちらでいくのかという話し合いも行っていました。結局「シングルエージェント」で行くことになりました。
 そしてとうとう開幕を迎えました。ファーストステージは、2試合行われ、2勝でファイナルステージ、1勝1敗でセカンドステージ、2敗で敗者復活戦へと進みます。また、各試合で先後を入れ替えながら2回対戦が行われ、各対戦の合計得点で試合の勝敗が決まります。緊張が高まり続ける中、「はじめぇ」の声が響き渡り、プログラム同士の熱き戦いが始まりました。自分たちのエージェントがうまく仕事をしてくれるか、急に不具合が起きないか、数多くの不安に襲われる中、自分たちの職人の動きを見守りました。激しい陣取り合戦が広がる中、城の獲得に成功し勝利を手にしました! しかし、喜んでいるのも束の間、すぐに第2試合が始まりました。この試合も手に汗握る試合となり、実況者から「すごく競った試合」と評されるほど、どちらに転ぶかわからない展開となりました。そして、第1対戦の最後に、右下を大きく囲むプレーが飛び出し、アドバンテージを手にすることができました。そして、第2対戦ではそのまま逃げ切り、2戦2勝でファイナルステージへの切符を手にしました。この瞬間、「自分の仕事は終わった、2日目の試合は先輩のUCTに任せる」という気持ちでいました。
 その後は、会場を散策しながら、セカンドステージを観戦しました。セカンドステージでは、通信ができないという大問題が発生しました。試合を始めることができずに、関係者が原因を突き止めようとしていました。そして、実況者を務められている先生が、「ネットワークのループ」を発見し、解決に至りました!!! 解決した先生は、「ネットワークではよくあるトラブルなので」とめちゃめちゃ謙虚なコメントをされていました。実況もされて技術問題も解決できてしかも謙虚で、めちゃめちゃいい人だと思いました。ようやく試合が始まり、会場の最前列で試合を眺めていました。特等席だったと思います。
 そして、学生交流会に参加した後に宿に戻ってチームメンバーと話し合いをしながら開発をしていました。自分のプログラムは使う予定ではなかったので、YouTubeで他チームの動きを軽く見ていました。しかし、日付を跨いだころから、「今日の試合を見てて、定石中に妨害されることは少なそうだから定石を作りまくろう。定石を作らなかったフィールドは、UCTで戦えばいいから、定石作れるだけ作ろう」と思い、朝の5時頃まで寝ずに定石を作りました。「今年で最後だから」と思うと、余裕で5時まで起きれました。

2日目

 5時起きの疲労がでることもなく、会場に移動することができました。そして、関係者連絡会議で使用するフィールドが発表されました。すると1日目同様、山を外しました。5時まで起きて定石を作っていたフィールドが使用されないことが発覚しました。睡眠時間削っただけとなりました(悲)。
 1回戦のフィールドは、定石がなく大丈夫かなと考えていましたが、フィールドを見つめているうち、今まで気づかなかった定石のルートが見えました。そして、敗者復活戦をやっている間に、急いで定石を打ち込みました。
時間的に、先手のときの分しか打ち込めませんでしたが、なんとか完成させることができました。そして定石作戦が功を奏し、先手番でアドバンテージを獲得できました。そのまま、後手番の試合を逃げ切りました。また、このとき(試合中)に2回戦の試合をUCTとシングルエージェントどちらでいくのかを先輩に動かして決めてもらっていました。するとなぜか、定石のないフィールドなのに、「UCT vs シングルエージェントで、シングルエージェントが勝ちまくる」という事態が発生し、2回戦もシングルエージェントで挑むことになりました。
 2回戦では、序盤からかなり押されていました。職人の動きを見ていても、逆転できる要素もなく非常に厳しい展開となっていました。すると、途中で相手の好プレーが飛び出し、中央をがっつり囲まれ、大量得点を奪われました。そのままリードを広げられ、大量ビハインドで第1対戦を終えました。そして、「シングルエージェントで勝ち目なさそうなので、UCTで行きますか」と声をかけましたが、「さっき惜しかった方で行きましょう」(全然惜しい負け方じゃなかった、ボコられてた)ということで、シングルエージェントの続投となりました。しかし、ビハインドを縮めることすらできず、リードを圧倒的に広げられて敗戦しました。2回戦敗退となり、優勝まであと4勝と、非常に遠いところで、大敗を喫することになりました。「もっとプロコンやればよかった」という後悔に浸っていました。その後悔に浸りすぎ、撤収の準備を完全に忘れ、撤収の合図と同時に片づけを開始し、急いで下がろうとしていました。片づけながらも悔いと後悔を感じ、「これが最後か、来年できないのか」と4月に戻りたいというかなうわけがない思いを抱えていました。
 そして、撤収しながら、最後に試合の開催を支えてくださった方々に、感謝の思いを伝えたいと、周囲にいた方に「ありがとうございました。」と一礼してから帰ろうとしました。しかし、挨拶をすると「残念でしたね。松江推しだったんですけどね。」と声をかけられました。なんと、企業として来られていたDMMの社員の方でした。「完全AIですよね。他のチームが人力ばかりだったので、応援していました」というようにお話しいただき、とてもうれしかったです。撤収間際に声をかけていただくことは、普通に考えればありえないできごとなので、とてもありがたい貴重な体験ができたなと思います。お声掛けいただきありがとうございました!
 さらに、昼休みに偶然に実況者の先生と「こんにちは」とあいさつを交わしました。長年プロコンの実況者を務められてきた先生と言葉を交わすことなどあるわけがないと思っていたので、めちゃめちゃ嬉しかったです。
 その後も、準々決勝、準決勝、決勝と勝ち進まれたチームの試合を観戦していました。そのときは、「人力のチームが多い」という情報が入っていたので、選手のマウスにも注目していました(笑)
 準決勝に進出された4チーム全組は、「めちゃめちゃ工夫された人力」を使われていていました。「純粋な人力」では、確実に入力が間に合わないと考え、人力に対する考察を全くしていませんでした。しかし、上位チームの作戦を聞いて、「その人力スタイル最強すぎる、隙が全くといっていいほどない」ということに気づかされました。「どうすればあのスタイルの人力が思いつくのか」、「4月に戻ったとしても、あの人力まで発想が至る?」という考えごとをめちゃめちゃしていましたが、我々には到底思い付きそうにない作戦でした。完敗です。
 2日目は、敗戦して感じた後悔から、頭がおかしくなりテンションがハイになっていました。その関係で、初めてお会いする他高専の方にめちゃめちゃ話しかけてました。めちゃめちゃ優しい方ばかりで、楽しくプロコンの会話をすることができました。プロコンやってる高専生の人柄の良さの実感を感じることができました。(一緒に会話したサレジオ高専、豊田高専、大分高専、東京高専の皆様、本当にありがとうございました。)
 その日の夕食は、ボルガライスを食べに行きました。が、めちゃめちゃ気持ち悪い状態で夕食を食べに行ったので、完食できるか不安でした。が、何とかおいしく完食できました! その夕食は、先生からおごってもらえることになっていましたが、私はおごってもらえるほどの結果を残すことができなかったので、「自分で払います」と言おうとしました。が、言おうとしたきに、「結果を残すことができなかったのに、おごっていただきありがとうございます」と言ってしまい、おごってもらうことになりました。
 そのときは、赤か青をみるだけで、プロコンのゲームのビジュアライザと勘違いするようになっていました。恐ろしかったです(笑)。

 帰り(3日目)は、福知山城というところを観光して帰りました。バスの中で他の高専の方とDiscordでおしゃべりしたり、先輩や先生と麻雀とかのおしゃべりしていました。(話題があんまりなくて少し暇でした。卒研の話でもすればよかったかな?)

感想

 結果としては、めちゃめちゃ悔いの残る結果となりました。「もっとこのゲームの性質を理解していたら」、「もっとやり込んでおけば」、「もっとプロコンに向き合って入れば」と後悔の念が34個近く浮かんできます。良い経験にはなりましたが、ラストイヤーだったので「この経験を生かすことができない歯がゆさ」を感じています。
 もう私はプロコンには参加できませんが、「この無念を後輩が晴らしてくれる」と信じて、応援したいと思います。

プロコン競技部門に興味のある方へ

 競技部門はマジでおもしろいです。やって後悔は絶対にしません!!
 めちゃめちゃ悔いの残る結果とはなりましたが、それ以上に「かけがえのない思い出」を得ることができました。「もっと努力していれば」という後悔はめちゃめちゃしていますが、「競技部門やらなければよかった」という後悔は一切していません!!
 プログラミングで全国の高専に潜む猛者たちと鎬を削ってみませんか? ぜひ高専に入学して、各校の情報系の先生方や先輩方に「競技部門やりたいんですが、誰に言えばよいですか?」と聞いてみてください!!きっと楽しく熱いプロコンライフが訪れると思います!
 (P.S. 松江高専で競技部門参加されたい方は、5棟3階の「橋本研究室」へ、「プロコン競技部門やりたいです!」と伝えに来てください! 優しい先輩が案内してくれると思います! プログラミング未経験者も、先輩が校内トップクラスのプログラマーへ育て上げます!)
 

中国高専コンフェスについて

 中国高専コンピューターフェスティバルという大会が3月に開催されます。高専プロコンの「課題部門、自由部門」のような作品展示の部門と、高専プロコンの競技部門をもう一度行う部門があります。我々もリベンジマッチということで、競技部門に参加することにいたしました!!参加される方々、よろしくお願いいたします!!
 現状、我々の話し合いでは、「背に腹は代えられない、人力で勝負しよう」ということになっています!!参加チームの皆様、「松江は人力で行く可能性が高い」ことを前提にしていただければと思います。対戦よろしくお願いします!!

(追記)結果発表

 3月14日に大会が開催されましたので、結果発表いたします!!
 敗退いたしました!!
 高専プロコンでDMM企業紹介を獲得された徳山高専さんが優勝されました!!おめでとうございます!!!
 人力で行くといっていましたが、いろいろあってできませんでした。卒業研究で頭が一杯になり、その他のことをすっぽかしていました。コンフェスも例にもれずすっぽかしていました。
 「職人が最寄の建築予定マス」に行くように、「単純にBFSで各職人の最寄」に行くようにすると、「最寄の場所が被り複数のエージェントが同じ場所に行く」現象が発生しました。「多始点BFSみたいな感じにして、職人ごとの割り当てをうまくやる」ようにするなど工夫をもうちょっとすれば、何とかなるかなとは思いましたが、それを試してみる時間がありませんでした。
 結局、高専プロコンのものを使用しました。定石を増やす以外には改良しませんでした。

この記事が気に入ったらサポートをしてみませんか?