んぐのルーズリーフ

んぐの日記。最近はScrapBoxが主

プロコン参加日誌 #procon30

どうも、んぐです。

プロコンの参加記を書きます。

疲れた()ので、簡単にだけ書き留めます。

情報

  • 電気情報工学科4年
  • 競技部門(2年生から毎年参加)
  • 今回は通信部分を主に担当

大会まで

まずはプロコンのルールの穴がないかをチェックしました。

あのルールブックいろいろツッコミどころ多すぎて、毎度質問事項を洗い出すのに苦労します (実際プログラム書いてみないとわからないことも多いし、聞くべきことを5月中に全て挙げるのはなかなか大変だと思うんですよ)

んで、チームメンバのなかでは(多分?)一番C++を書いている僕がサーバとの通信および、全体を取りまとめるプログラムを担当し、他の二人にソルバは丸投げしました()2年生からずっと競技部門ですが、別にアルゴリズムに強いわけではないので毎回ビジュアライザだとかそのへんを書いてます。


今回の競技はサーバを介して行うので、どう転んでも僕の担当部分のプログラムは必須でした。それなりのプレッシャーを持って書くことになりました。

C++jsonを処理したり、GET・POSTをするのはなかなか大変でしたが、ライブラリ様の力をゴリゴリ使ってなんとか書ききりました。自分のプログラムで初めて --ping を通したときはかなり嬉しかったですね。


大会1週間前に自分の担当部分の実装が終わったので、そのくらいからソルバの方にもちょっかいを出しました。

評価関数いじるか~~くらいしか考えていなかったのですが、突如として「(原始)モンテカルロ法強いんじゃね?!」と思ってしまい3日前に実装をはじめました。

と、意気込んで実装したのは良かったのですが、僕はバグを出すプロのようで、大会前日のホテル開発で大量の †Core Dump† を発動し、結局当日は採用しませんでした(いやー途中まではよかったんですよ。いままでソルバ担当が作ってきたビームサーチにもそれなりに戦えてて。「リファクタリング」と称してゲームマスター部分のプログラムを大改修したのが悪夢の始まり…でしたね……)

そんな感じで大会当日を向かえました。ちなみに前日開発は早朝の6:30までやってました。つまり徹夜です。はい。

大会当日

1日目

会場についてまずやったのは、トークンの差し替えです(ん?) コードにベタ書きしてたので、急いでプログラムを書き換えてUSB経由で他のメンバのパソコンにセットアップしました。

あと、デモンストレーションで、時間の単位:[msec]と[sec]を間違えていたことが発覚したので、それも急いで修正しました。これぞ競技部門ですね!(違う)

うちは時間の単位問題以外で、通信プログラムに根本的なバグは発生しませんでしたが、他高専のチームにおいては大変だったところもあったみたいですね。 「簡易回答システム」・「大会募集要項」・「追加情報」に加えて「行間を読む」技術が必要なので、プロコンは大変です。

簡易回答システムが簡易すぎて試合のシミュレーションが一切できないのもなかなか厳しかったですよね。


さて、ファーストステージですが、「都立(品川)」「熊本(熊本)」「宇部」との対戦でした。

  • 宇部高専さんは一日目うまくプログラムが動いていなかったようで勝つことができました。
  • 都立(品川)高専さんとはどちらのフィールドも惜しい試合をしていたようにも見えましたが、負けてしまいました。特に非公開フィールドでは数ターンこちらが勝っていたのでワンチャン!と思っていたのですが、最後大きく突き放されちゃいました。
  • 熊本(熊本)高専さんには圧敗でした。うちのソルバの挙動が怪しかったのもありますが、ちゃんと動いていたとしても負けていたように思います。強かったです。

というわけで、3位で敗退でした。残念。

2日目

「明日の敗者復活戦、プログラム修正して頑張るぞ!」とメンバーと話したはずだったのですが、全員朝までぐっすり寝落ちしたので、ほぼそのままのコードで2日目参戦です。


対戦は「岐阜」と「長野」でした。

ほとんどコードは変えなかったのですが、2日目、僕のパソコンの調子が悪く、岐阜高専さんとの試合がずっとこの盤面で硬直でした。 1ターン目だけ動いて、あとはずっと UnacceptTime を決めてました。人力でソルバの尻を叩くこともできたのですが、岐阜高専さんも硬直しているようだったので下手に動かないことにしました。なんとも言えない感じですが、勝つことができました。

f:id:luling:20191015225737p:plain

長野高専さんとは、こちらがうまくハマったようで、いい感じにコンフリクトをおこしつつ、領域ポイントで大きく引き離すことができました。

というわけで、見事敗者復活に成功しました。



セカンドステージでは「熊本(熊本)」と「奈良」と「福島」との対戦でした。

仙台高専さんと奈良高専さんにはうまくソルバおよび通信プログラムが動作したのですが、例によって熊本(熊本)高専さんとの対戦に当てた僕のパソコンが UnacceptTime を決めまくってました。実は第一試合の初手で †Core Dump† も起こしてしまい大変でした。その場でコードを修正し、なんとか動かしたのですが、普通にソルバでも負けていたようで、完敗でした。

セカンドステージ2位という悔しい結果でしたが、ここで僕たちの競技部門は終了しました。熊本(熊本)高専さんは4位まで勝ち上がったとのことで、清々しい負けです。

対戦終了後

課題と自由は競技終わってから回りゃええやろ!とか思って競技に見入っていたのですが、課題と自由の終わる時間と同じだったみたいで、ブースを一つも回れませんでした(悲しい)

去年ブース回るのめちゃくちゃ楽しかったので、今回もわくわくしていたのですが。まぁしょうがないですね。

f:id:luling:20191015232702p:plain

これはあまりに余った名刺です。食事場でたまたまお会いしたてるふのさんに1枚渡しただけになっちゃいました。

コンフェスのときにでもまた配れればと思っているのですが、名刺を渡すコミュ力があるかが心配です()

移動部門

これは完全に雑談ですが、行きの移動がめちゃくちゃ大変でした。他の中四国地方の高専さんが続々と会場入りするなか、呉は在来線に4時間近く拘束されてました。

プログラムの実装について

さすがにもうこの競技はしないと思うので、プログラム大公開!とかしてもいいんですが、あいにくGitHubの環境がホテル開発の際荒れまくったのであまり見せられる状況ではありません()

整理できたらまたアップしようと思います。


概要を説明すると、

ソルバは深さ10でChokudaiサーチみたいなことをしていました。評価値の高いノードからどんどん枝を伸ばしていき、探索したい深さまで探索しきったら、2番目に評価値の高かったノードからどんどく枝を伸ばしていき…時間が来たら打ち切り。みたいな感じです。枝は刈っていないので、ビームサーチではないと思うのですが、深さ優先探索幅優先探索のハイブリッドのような探索方法です。

評価値は、単にタイルポイントと領域ポイントに重みをつけたもので、 (自分のタイル, 自分の領域, 敵のタイル, 敵の領域) = (3, 1, 2, 2) で設定してました。


ちなみに僕が実装しようとしていたモンテカルロ法は、複数の評価関数を用意した上で、一手先のみ貪欲で評価。その後、その複数の手のから乱択(ただし、移動・除去先のタイルポイントの大きさによって確率をある程度操作)で更に手を打ち、最も勝率が高かった手を採用。という感じです。ただ、このゲームはモンテカルロ法がそんなに強くないと思われるので、実装しきっていたとして強かったかは微妙です。


通信はpicojsonとC++Restというライブラリを使いました。 ググれば色々情報は出てくると思います。このブログでもまた紹介できればと考えています。


あと、モチベアップのためにCUIではありますが、表示に工夫を凝らしてました。これもプログ化したいな…

f:id:luling:20191015235751p:plain

最後に

いろいろありましたが、総じて楽しかったです! 今年は競技部門で1勝、課題部門も予選突破。また一つ呉高専が強くなったかなと思います。

個人としては来年も出るかとても迷っていのですが、とっても楽しいイベントであることは間違いないので気持ち的には参加したい…なと考えてます……

ブログに書けるようなネタもいくつかできので、また落ち着いたら書いてます


高専、来年はさらにパワーアップして挑戦するので、待ってろ #procon31