読者です 読者をやめる 読者になる 読者になる

プログラマ日本一決定戦 CODE VS4.0 本戦と予選AIのおはなし #codevs

プログラマ日本一決定戦 CODE VS4.0 の本選の観覧に行ってきました。

CODE VS4.0 はゲームAIのコンテスト。

CODE VSとは日本中のプログラマが、
技術を競い合うプログラミングコンテスト
相手の隙を衝くアルゴリズム活用力と、

的確なコーディング技術を競い合うプログラミング・コンテストである。

テーマとして与えられるのは、ある「ゲーム」。

そのゲームを攻略する「最強のAI」作成が、挑戦者の使命である。

参加資格:年齢・国籍・学歴不問!

CODE VS4.0

CODE VS4.0の概要と本選

去年はボンバーマンもどきのゲームのAIを作るコンテストだったけど、
今年のゲームは戦略シミュレーションでした。

予選を行い上位8名がニコファーレで開催される本戦に参加できます。
プログラミング言語は何でもOK。
AIのプログラムの実行時間が決まっていますが、LL言語でも全然問題ありません。


決勝の様子は様子は文章じゃかけないので、
ニコニコで(プレミアム登録して)タイムシフト見てください!

社会人を含めだれでも出場できる中、優勝したのは中学3年生のmaroonさんでした!!

決勝の後は二次会で予選敗退者たちでAI対決したりしました。

f:id:cocodrips:20150208024756j:plain


予選の話

私は昨年のCODE VS3.0の決勝観覧が楽しすぎて、来年は絶対に参加しよう!と思って
今年は初めての予選参加しました。

予選に参加する前のイメージとしては、
「昨年のCODE VS勢はアルゴリズムやデータ構造のプロフェッショナルなイメージではなかったので、そっちをもっと頑張れば、決勝は無理でもシルバー(30位以内)くらいには入れるでしょ?」
みたいに思ってました。まあ私もアルゴリズム得意じゃないんですが。

今年は1000人弱の方が参加したとのことですが、結果は44位でした。

予選参加後わかったのは、結局「ゲームのAI」なのでアルゴリズムや何やらよりもやっぱり戦略が大事だなあってことでした。

今回の問題は選択肢がめちゃくちゃ多くて、正直全然頭が良くない自分には難しすぎました。

はじめは「全部の予選の敵AIに同じAIで勝つ」ものだと思っていたのですが、
途中でgrun(いじわる型)とlila(防御型?)とsilber(速攻型)に同じAIで勝つのは、
絶対無理だと思い絶望しました。

しかし、上位陣のほとんどが敵AIを判別して、それによって対策をしているということを知りました。
(Twitter でフォローしているユーザのTLを"grun"で検索かけたらそういう雰囲気がわかった)

こういうのは初参加の自分には全然考えつかなかったです。
決勝が対戦試合なので、今の状況だけをみて対応するようなAIを考えるものだと思ってました。
このへんもテクニックなのでしょうか。

私が作ったのは全然弱いAIなんですが、せっかくなので何をやったか紹介したいと思います。

とりあえず探索して、城を攻める

1番はじめに、とりあえずいい感じに資源を探索して、1番城にちかいWorkerが拠点をたてて攻めるってのを作りました。
とりあえず相手のAIはなしです。
この時点で400行はコードを書いてました。

探索を効率よく行う

戦略とか全然考えられないし、とりあえず効率よく探索を行うことを考えました。
はじめは、「9 * 9マスに1つのポイントをおいて、そのポイントをシャッフルして探索Worker5匹で一番近くの未探索のポイントに行く」というような感じにしました。単純。
280ターンくらいで全マップを探索し終えました。

これをもうちょっと効率よくやりたかったので、
「9 * 9マスに1つのポイントをおいて、未探索のポイントN個に1番近い所にいるN匹のWorkerをそこに向かわせる」みたいな感じにしました。
うまく言い表せないんですけど、220ターンで全マップを探索し終えられるようになりました。

まあ実際AI試合で全マップを探索なんてしないんですけどね。
とりあえず考えるの苦手なのでこんなことをしました。

速攻AIを作る

これがなかなか勝率が良い(運任せ)。
でもsilberに勝てない。grunにもlilaにも勝てない。

対策を考える

どのAIにどのAIが勝てるのか表を作って、
勝てるAIに似せたAIをつくったりしました。

最終形態

なんか村の位置とかそういうのでAIを判定して、それぞれの敵に向けたAIを書きました。
速攻・防御・バランス型のどれかっていったらどれでもない。
あえて言うなら中途半端なバランス型かな・・・・。うーん。

攻撃は10体まとめて弱点属性を送り込む感じです。

grun相手
うーん。

lila相手
適当に攻めようとして、あっこれむりっっってなって城に戻ってく残念な感じ。

それぞれの敵で別々にコード書いたって言うと、「えっ、コード量やばそう」て言われました。
(if文で分岐するって言ってた人が多かったので)
でもデフォルトのAI継承した敵クラス作って、
変えたい関数だけオーバーライドする感じだったので、
コード量はそうでもなかったような気がします(2000行)。

if分岐はsilber対策してる時点でデバッグつらすぎて諦めました・・・。

ゲームAIむずいですね。初心者感丸出しです。
反省点はいっぱいあるけど、もっと上手に敵の分析をしなきゃだめだなーという感じです。

最後に

CODE VS4.0を運営してくださった皆様、本当にありがとうございました。
また知らなかった世界の存在を1つ知ることができた気がします。
来年はもうちょっと頭の良いことができるように頑張りたいです( ・ω・)ノ

予選AIのコード: cocodrips/codevs-4.0 · GitHub