プログラマー日本一決定戦 CODE VS4.0の本戦。本日14時からです。
http://live.nicovideo.jp/watch/lv206946170
以下、実況。
今回予選1位のnosnosnosさん。
nosnosnos「敵のAI全部に対して1つのAIで対応するのではなく、各AIの個別の弱点を突くAIを作って、それで戦うという感じ」
予選4位。takaptさん。
takapt「nosnosnosさんと同じで、AIによってif文で分岐してます。今回、予選が終わって本戦のAI提出までに2日しかなかったので、予選のままのAIで戦います。」
予選5位。mechaさん。
mecha「基本的には速攻。パラメーターを手動で切り替えられるようにして、ビジュアライザを作って、手動でこのAIかなというのを見て、切り替えて。」
予選8位。simanさん。
siman「時にはワーカーが攻めこむ、ノーガード戦法」
対戦画面は3D風の背景。3D画面のviewを操作しているのは右下に映っている解説のchokudaiさん。
nosnosnosさん(予選1位)とtakaptさん(予選4位)の対戦。takaptさん、資源をほとんど無視して資源の上のワーカーを置かずに速攻。takaptさんの3連勝。予選1位とは何だったのか。
chokudai「将棋電王戦のやねうら王さんも予選参加されていて、48位(最終69位)で、それぐらいレベルの高い戦い」
そして、takaptさんの戦法が、直進最速理論イニシャルY(Y = やねうらお)らしいです。イニシャルYの名前をまさか本戦の実況で聞くことになるとは!
nosnosnos「最初、4体のワーカーを生成して敵の城に向かわせるんですけど、その4体全部が途中で事故って死んじゃうとアウトなんです」
nosnosnosさんのAIは本戦用AIとしてはあまり強くなかった模様。
chokudai「村はHPが高いのでワーカーで攻めて、村を生成するという作戦もアリ」
chokudai「simanさんは拠点を城に作ってガードするのですが、拠点を再度作る機能がないみたいなんですね。拠点はHP20000、城はHP50000なので、城のHPが2/5削られたときには拠点が壊れているので、城のHPがそれだけ削られる前に勝てるかということですね。」
決勝リーグ1回戦Aリーグ
mechaさんが3連勝。takaptさん2勝1敗。nosnosnosさん、決勝進出ならず。
mecha「攻撃用拠点とは別に、攻められたときに城の上に拠点を作るようにしています。拠点では(視界に入った攻撃ユニットに対する)弱点ユニットを作るので(それが利いている)」
決勝リーグ1回戦Bグループ
予選2位通過thunderさん。
thunder「資源の位置はあてずっぽで…(ビジュアライザを書いて)手動で見ながら、ひたすら数まわして」
予選3位通過kwrigさん。
予選6位通過。iwashi31さん。
予選7位通過。maroon_rkさん。15歳、中学生。chokudaiさんの後輩(筑駒)だそうです。
maroon_rk「ナイトやファイターに対して1対1ならアサシンが勝てるので(生成のかかる資源の量は多いが)アサシンを量産したほうが結果的、得。」
chokudai「thunderさん、予選は手動ということでしたが、今回は?」
thunder「探索するように変えました。そうじゃないと出れないので…。」
chokudai「kwringさん、2戦目で戦法変わったように見えますが?」
kwrig「速攻で1回負けたら、次は守り重視になるように変わります。」
CODE VSは相手AIとの相性があるので、そうやって変えていくのが有効みたいですね。
iwashi31さん「自分の城では防御のためにナイトを出し続けていたんですが、maroonさんはアサシンを出し続けるのでその差で負けたのかなと。」
maroonさんのアサシン量産作戦が功を奏した感じです。
・iwashiさん vs thunderさん。
iwashiさんは、城付近で村を生成するタイミングが早いです。
chokudai「城の攻撃範囲は10升あるので、ワーカーがダメージを受けていなければその10升には城がないことが確定。視界外からダメージを受けているなら、村を作れば村は視界が10升なので城があるかないかがわかります。これを利用すると城の発見が早くなります。」
iwashiさんは、これを使っているようです。ちなみに、私の書いたAIもそうしてました。
・kwrigさん vs maroon_rkさん。
maroon_rkさんがアサシン量産作戦で速攻で2連勝。ターン数が早めで敗れたので、kwrigさんのほう速攻対策用のAIに自動的に切り替わりましたが、3回戦、maroon_rkさんが勝ち切りました。
・thunderさん vs maroon_rkさん。
maroon_rkさん「相手の城のまわりの防御がないとわかれば、ナイトを生成するようになっています。」
chokudai「(thunderさんのAIは防御しないが) 速攻が決まるのは、よっぽど速攻が速くないといけない。速攻で行くには、右下に(上と左に移動させずに)行かなければならないのに、(いまの試合を見る限りthunderさんのAIは)少し遅い。maroonさんのは、速攻でいくワーカーには無駄な動きがないので、thunderさんより20ターンほど早く城に到達する。」
・kwrigさん vs iwashi31さん。
どちらも資源を集めるのが早く、両者速攻。
chokudai「今回のように連戦が前提であれば1戦目で速攻をするのはとてもいい戦略。速攻が1戦目で入れば、そのあと速攻を続けているだけで勝てる(かも知れない)ので。」
iwashiさんは、探索用のワーカーと資源回収用のワーカーとは区別があって、城の近くで資源を見つけたあと、城からワーカーを資源に派遣させるようです。
そのためか、探索用のワーカーが敵の城にたどり着くのはかなり早いですね。探索用のワーカーではよほどでない限り、資源を回収にいかないというのは、いい戦略だなと思いました。
kwrigさんとiwashi31との戦いはiwashiさんが勝ち上がり。
決勝トーナメントまで10分休憩。
敵AI判定について
ustimawさんが、予選のときの敵AI判定の方法について記事を書かれています。
(ルール変更前の)CODE VS 4.0 (ustimawのブログ)
敵AIを早めに判定すれば、少ないターン数で勝てるので、敵AIを早い段階で判定できれば相当有利なのですが、自軍の視界に入った情報からでは遅すぎるので、振られるidがuniqueかつ連番であることから、自軍以外のものが敵軍と仮定すればそれによって統計的にどのAIであるかを分類できるのではないかという話で、大変興味深いです。
決勝トーナメント
・mecha_g3さん vs iwashi31さん。
iwashi31さんが勝って決勝進出。
mecha「HPを管理するのは、ToDoリストには入れていたのですが、決勝用のAIを作る時間が1日しかなくて…」
・ maroon_rkさん vs takaptさん。
chokudai「takaptさん、防御ってしてましたっけ?」
takapt「村を作って。」
chokudai「アサシンに対して村はそこそこ強いのでアサシン量産に対して村を作るのは有効ですね。」
とか言ってたらmaroonさんが先勝。
maroon「僕も攻められたら城の上に村を作って防御します。」
maroonさんが勝って、決勝進出。
・mecha_g3さん vs takaptさん (3位決定戦)
接戦でしたが、mechaさんが3位に。
今回のアルゴリズム面での解説
今回のCODE VSに関して、くいっぱさんのスライドがアルゴリズム的な解説が詳しいので紹介しておきます。
はやくも感想戦 #codevs / “Codevs” http://t.co/Nx6T5Ou07P
— くいっぱ (@kuippa) February 6, 2015
くいっぱさんのAIは、動的計画法っぽい方法で30ターン後、最大のめくり量になるようにしてあるようです。このへん、興味深いですね。
私も、直進最速理論イニシャルYを開発する前は、動的計画法でやろうかと思っていたのですが、実装の苦労の割には、あまりワーカーの軌跡がよろしくない気がしたのでやりませんでした。
自分のCodeVSの資源探索戦略では、画像のように幅もしくは高さ9の長方形領域に分割していた。視野が4マスなので、2*4+1=9マスごとに区切るのが良いと考えてのこと。 #codevs http://t.co/ZgQX7miVtu
— mamekin (@mamemame_fujita) February 7, 2015
しかし直進最速理論イニシャルYでも、城の位置が固定ではないのでスタートダッシュのときに上図のラインにワーカーを乗せるまでの軌跡が最大めくり量になるようにするためには、その部分で動的計画法っぽいものが必要になって、結構実装が大変でした。
決勝
・iwashi31さん vs maroon_rkさん
資源の発見が早く、アサシンを作る作戦が功を奏してmaroonさんが勝ち星を上げる。
chokudai「(アサシン強くて)本当に三すくみになっているかは微妙で。事前にアサシンが来るとわかっているならナイトを量産して防御は出来ると思うんですけど。」
とか言っている間にmaroonさんが勝利して優勝!プログラミング経験3年の中学生が優勝というのはなかなか衝撃的な結末です。
maroonさん、おめでとうございます!
私がCODE VS 4.0の予選に参加した感想
私の感想としては、もっときちんと三すくみの関係にして欲しかったですね。あと、城の視界、もっと広ければ敵が視界に入ってからナイトで防御することも出来たかも知れないですが、今回のバランスではそれは無理なので基本、アサシンで攻めるのが有効なんでしょう。
そういう意味では、ワーカーや城の視界、もっと広げてあったほうが良かったのでしょう。
視界が広ければその情報をどう使うかという点においてプログラムの技量による差が出やすいですが、今回のようなバランスだと敵AIをなるべく早いターン数で判別して、攻め方を切り替えるようなプログラムが予選通過のための必須条件になってしまいます。
このへんが予選通過のためのAI実装にすこぶる時間がかかる原因だと思いますし、かつ予選と本戦で取るべき戦略が違いすぎるのは少し残念でした。
協賛企業チーム リーグ戦
・teamLabさん vs DeNAさん。
試合は、資源の制圧合戦になっていて、ターン数500を超えています。
cokudai「今回の決勝で僕が想定していた戦いはこういうので、こういう戦いが2,3戦は見れるかと思っていたのですが(予想に反してそういう対戦が一つもありませんでした)」
チームラボさんは今回のgrunの作者だそうです。
チームラボ「運営特権で今回の参加者がgrunに対してどうやって勝っているかを見たら、grunが対応できない数のユニットを生成しておき、一気に攻めるというのがあったので、grunを速攻対策するためにナイトを生成して城から50升範囲の探索をすることにした。」
どんな戦法で来てもそこそこ対応できる凄いAIですね。
chokudai「チームラボさんが強いのは予選通してないからというのもあるんでしょう。予選だとターン数勝負になるので速攻に偏った人が多かったので。」
チームラボさんは企業リーグ戦、全勝で優勝!
スペシャルマッチ
企業リーグ戦全勝優勝のチームラボさん vs 本大会優勝者のmaroonさん。11本勝負。(6本先取で勝ち)
maroonさんの速攻が5回決まり、5-5!
chokudaiさん「チームラボさんは城の周りにナイトを生成しているので、速攻で攻められてもそのナイトを城に寄せてくれば撃退できるはずなんですが、それでも速攻が成立するというのは速攻がよっぽど上手いんでしょうね。」
chokudai「この戦いかたは、僕の予想を完全に超えています。」
そしてmaroonさん、6戦目に勝利!
予選と本戦とで取るべき戦略が違いすぎる&予選終了から本戦用のAI提出までの期間が短すぎるので、予選から勝ち上がってきたほうは圧倒的に不利なのにmaroonさんの大勝利。
チームラボ「紙一重でギリギリ守りれるかどうかの戦いになっていて、惜しかったと個人的には思います。」
maroon「5回やられて時点でもうやられたと思ったんですが、そこから巻き返せたのは自分でも驚いています。」
cokudai「チームラボさんが最強だと思っていたので、(これとやらせるのは)可哀想だなと思っていたんですが。僕が出ていても僕の戦略はチームラボさんと同じだったので、勝ててなかったと思います。」
今回のCODE VS 4.0、見どころいっぱいの大会でした。
ちらっと見ました。全部で5時間は長すぎ・・・まだ半分も見ていないぞ
◆このイベントは斬新に思えた。主催者がゲームを作って
オンラインで誰でもプログラムを作って参加して上位が東京で決勝。この遊びのフォーマットの可能性を感じる。世界中で流行るといいのに。アメリカなんかで流行るとめちゃ面白そうなのに。
◆解説がきちんとできていない。試合がリアルタイムライブ中継だったのが大きな問題。事前に試合は済ませておいて、当日はそのビデオを流す形式にすればもっと分かりやすい解説ができる。資源収入、兵総数、城HPの時系列での線グラフ付きなどの解説なども導入すべきだ
◆やねうらおさんも書いてるけど予選本戦でプログラムが違いすぎるのはダメでしょ。予選上位100人くらいを、総当りで戦わせて上位を決勝進出にするとか。そうすれば予選のプログラムをそのまま本戦に持っていける。
◆「防御ってあんまり意味無くないか?」とか思っていたのだがうまいこと防御を活用する人がいて「へぇへぇへぇ」と思った。
◆上記にこのイベントの悪口をいくつか書いているが、それでも本当に斬新な切り口のイベントに思えた。『パネキットファミ通カップ』くらいの衝撃だ
こんな面白いイベントに視聴者としてではなく競技者として参加できるというのは、プログラマ冥利に尽きるというものですね。
全部見たけどおもしろかったです。
プログラム歴3年で優勝というのは、地頭もですが、効率性が高いのだろうと思います。
やねさんから見て、例えば素人がcodevsに参加して予選の100位に入るレベルになるための効率的な学習手順や学習事項ってどんなもんなんでしょう?(天才により英才教育したら天才ができるのか?的な)
今回の問題は、難しい数学は必要なかったので、そういう意味では普通のプログラミングコンテストとは少し毛色の違う問題だったと思います。
今回のCODE VSで100位に入るのは意外と簡単でサンプルコードを理解する力があれば、あとは作戦をうまく立てて、サンプルコードを改良していけば簡単に達成可能です。
つまり、今回のサンプルコードを理解するための理解力をどうすれば最短時間で養えるかという問題になりまして、まあ、普通にプログラムの勉強をすれば数ヶ月でそれは可能なのではないかと…。逆に数ヶ月やってもあのサンプルコードが理解できないなら、それは何か勉強方法が間違っているのではないかと思います。
あと、今回のCODE VSでどうやれば10位以内に入れたかというと、そこプラス、競技プログラミングの経験とか、費やす時間や情熱とかも必要だったかなーと思うのですが、よくわかりません。(私自身、今回10位以内に入れてないので。もう少し時間をとってきっちりやれば入れたとは思いますが)
効率的な学習手順は分かりませんが、私はできるだけ「スローンとマクヘールの謎の物語」的な水平思考を心がけています。
というか、レベルファイブさん「スローンとマクヘールの謎の物語」の第三弾作ってほしい。
「スローンとマクヘールの謎の物語」、いま知りました。このゲーム、面白そう…。
今コンテストの成績が良い人はセキュリティソフトを書く適正がありそう。敵の戦法を色々想定してそれぞれに対策を立てるという意味で。