#procon29 に参加した話(開発記・参加記)
ざっくりと自己紹介
初めまして。
野菜ジュースと申します。procon29競技部門優勝チームの司令塔です。procon27にも旅行記担当として競技部門に参加しました。
他にやっていることとしては競プロ(今年PCK本選行くのでよろしくお願いします。)や軽いゲーム製作、簡単なホームページの製作です。(メイン言語はC++)
趣味は音ゲーです。twitterでは垢分けてるので知りたい方はリプください。
なるべく時系列順に沿って書いていきます。間違っている部分があるかもしれません。なぜかとても長文になってしまいました。
初めてのブログです。お手柔らかにお願いします。
開発始動
開発が本格的に始まったのはFAQが公開された後の5月末でした。それまでに多少先輩がコードを書いていてそれを基本にしながら人間同士の対戦用プログラムの作成に取り掛かりました。というのも先輩が今年は機械学習を使いたいと言っていてそのデータ収集用に対戦プログラムを作成しました。
私は研究部会の会長という立場からいつの間にかチームリーダー(兼司令塔)になっていました。言語はC++(だけだったはずでした)で使用ライブラリ等、方針が定まっていたのでまとめるのはそう難しくありませんでした。
競技アイデア企画の始動
同じ時期頃に後輩にプロコンを見せてあげたいがために競技アイデア企画のアイデア出し等も始めました。ちなみにアイデア段階までの統括も私が行っていました。多くの部員がかかわりアイデアを出し合って、先輩と私がそれを競技向けに改善していくという流れで今の「お土産ゲッター」が生まれました。
試験と夏休みと開発スケジュール
6月になり中旬には中間試験がありました。また7月下旬には期末試験があり、8月2週目からは夏休みというスケジュール管理が非常にしにくい状態となっていました。
というわけで7月中旬までには対戦用プログラムの作成を終わらせ、夏休みまでデータ収集を行う予定でした。
しかし、夏休みに入ってすぐに先輩がインターンシップに行ってしまう上、4日間で50対戦という途方もない数を部活の時間のみで達成するのは不可能だと考え、急遽discord_botを利用した遠距離対戦の実装をしました。勿論言語は今まで使ったことのないPythonでした。もともとの対戦用プログラムにTCP機能を付けていたので実装はそこまで苦ではありませんでしたが、なにぶん未知の言語だったので完成まで1週間かけた上に接続がとても不安定でした。それらを使い8月下旬までに50試合開発メンバーで対戦しデータを取りました。
データ収集中にはどのような動きが強いか(斜め移動、大範囲からの分割、端から埋める、とにかく高いマスに進むetc...)を考えながら動かしていましたが、とにかく高いマスに進むいわゆる脳筋戦法が強いと考え戦略の方針が定まっていきました。
本実装開始
8月末、リポジトリを新規に作成し本実装へと移りました。といってもGUIの基幹部分は対戦用のものを移植したのでGUI関連は細かな調整で済みました。ここらあたりから指示方法(後述、詳細は部誌に書きます)を本格的に決めていきました。
始まって間もなくして先輩がコンピュータ間でのデータ収集用にとビームサーチを実装しました。これは改良されて本番で使ったものと同一だったはずです(うろ覚え)。このころは初期20ターンに関してはCPU(探索)の方が強かったのですがそれ以外はまだ人間の方が強かったです。
入力にはマウスは正確性と速さに欠けるとの判断をし、すべてをキー入力で済ませられるようにしました。
プロコン用コントローラー#procon29#高度な情報戦 pic.twitter.com/0ysdi11pA1
— 野菜ジュース (@yasaijuiceryota) 2018年10月22日
上のコントローラーですね。具体的には、
- 相手エージェント選択:2 4
- 自チームエージェント選択:W R
- Skip,Calc,Prev:Z C(Space) B
- 方向:10キー
- 移動・除去指定:M P
という操作法です。(当日は2つ増えましたが後述)
最初のターンの設定はクリック操作で行いました。
この頃競技アイデア企画は予選を通過し、ポスターの製作に取り掛かりました。しかし、ポスターだけではわかりづらいのでサンプルプログラムの製作を始めました。製作メンバーは私1人です。時間が足りず、当日までにある程度のところまでしか作れませんでした。
10月:部誌の発行、高専祭、プロコン
弊研究部会では毎年高専祭で部誌を発行しています。しかし、今年はプロコンと被ってしまったため後日でも追加可能なWeb版の発行を決めました。ホームページの制作は私がやりました。自分で進めたことなので自分で書きましたが、新入部員向けの講習会ホームページのデザインをアレンジしたのでそう時間はかかりませんでした。
追記:宣伝します!!!
ホームページです!!詳細なアルゴリズムを後日掲載予定です!!
高専祭とプロコンがかぶり、半数以上の部員が高専祭に居ないという事態になりましたが本筋から外れるので(ry
10/26(金)移動日
特に書くことないので弊高専の徳島までのルートについて記します。
以上です。このルートはとても格安な値段で済み、6人分の補助費で8人全員交通費宿泊費の負担なしで参加できました。ルートを見つけてくださった顧問の先生には感謝しかありません。
10/27(土)1日目
指示方法について
大変お待たせしました。指示方法について説明します。実際に本番で使ったもののみとなります。
トランプは黒赤それぞれのAと10、それと4が1枚の合計5枚を使用しました。赤と黒で指示対象のエージェントを分け、Aで移動、10で除去でした。4は人力移行のサインです。
移動方向については腕の方向で指し示しました。エージェントから司令塔を見ているときに上で前方向、下で後ろ方向、左右で左右方向、斜めは斜めにといった具合です。
下に例を示します。 *1
赤黒のトランプは本番でそれぞれA,10が見えるようにクリップではさんでいました。これにより、トランプの選択時間が減りほぼタイムラグなしで指示を出せました。
2台目のPCについて
関連しているのでここに書きます。この指示方法は腕の角度が正確でないと指示が通らない可能性があるという欠点を持ち合わせていました。そこでPCをもう1台使い、Webカメラで鏡のようなプログラムを用意しました。写した映像に45°毎に引いた半透明の補助線を組み合わせることによって正確に指示を出すことに成功し、指示ミスをほぼなくせました。
予選リーグ
予選リーグの3試合は全て人力でした。というのも相手の行動の入力については補助学生の動きを見て入れると決めており、当日まで練習をしてこなかったため、入力ミスに対応できなかったのが1試合目でした。2試合目はQRコードの読み取りにバグが見つかり、相手の位置が入力出来ませんでした。3試合目はLコートで予想より光の当たり方が暗く、QRの読み取りに時間がかかりすぎてしまいました。
しかし、沢山の対戦をして鍛えた経験により無事全勝して勝ち抜けることが出来ました。(プロコンとは)
そして足りていなかった機能や改善策をこの日の夜にホテルで実装しました。
- 色入れ替え機能(自チーム青色の場合にしか対応してなかった)(F9)
- SuperUserMode(自由な色変更、エージェントの移動、ターン数の変更が可能なモード。ミスをリカバリーするため)(F7)
- QRコード読み取り時に画面輝度最大のipadを重ねる(読み取り速度が向上しました。)
- QRコードのカメラが現実と反転していたものの修正
10/28(土)2日目
朝、競技メンバーに異変が起きました。私は1日目の指示の疲労により筋肉痛、そしてエージェント2名はエアコンをつけたままにして寝たことによる風邪という最悪のコンディションでした。幸いにもトーナメント行きを決めていたため私の筋肉痛と同級生のエージェントの風邪は治りました。先輩は治りませんでした。
2日目の試合はすべてコンピュータを用いました。しかし、終局はビームサーチではどうしても弱いのでそこだけは私が手を変えたりもしました。そして優勝へと至りました。各試合の感想については割愛しますが、準々決勝は一番精神的に怖かったです。
競技アイデア企画の方も特別賞を頂き、今までにない成果が得られた年でした。
ちなみに、
決勝の最初のパンダは意味はありません#procon29
— 野菜ジュース (@yasaijuiceryota) 2018年10月28日
夜は顧問の先生に焼肉をご馳走になり、ラウワンに行った後、"922"の裏プロコンにお邪魔しました。
仙台名取 vs 函館の完全人力エキシビションマッチは199 vs 230で仙台名取の勝利でした!#procon29 #スマイルホテル裏プロコン pic.twitter.com/Df3Jf2md6w
— すとんりばー (@strvert) 2018年10月28日
その後ホテルに戻り就寝しました。
10/29(日)観光、移動日
眉山に行ってきました。
帰りの飛行機の前うっかり筆箱をキャリーケースに入れるのを忘れ、カッターを捨てるミスをしました。
4日間を通して
前の席に座っていた広瀬の方々や、裏プロコンを通して多くの方と話すことが出来ました。ありがとうございました。それと同時に自分ももっとスキルアップしていかないといけないと感じました。来年のプロコンにも出る予定ですのでその時はぜひよろしくお願いします。
教訓
- 体調管理はしっかりしよう
拙く長い文でしたがここまでお読みいただきありがとうございました。