ウディタAI企画3(第二回)に参加してきました

先週第一回のウディタAI企画に参加した記事を書きましたが、第二回にも参加してきました。

ウディタAI企画3特設サイト

第一回からの変更点

  • デッキの同じ数字の枚数制限(無制限→3枚)
  • マイナスを出したときのペナルティ増加(3倍)
  • 勝利したときの点数計算(自分以外の合計→自分も含めた合計)
  • 狙う順位のカード(対象デッキ)の枚数(不均一→均一)
  • 連戦中、DBの蓄積(できる→できない)

どんなAIを作るか

前回は損失が少ない+1と-1のカードをひたすら出すだけでしたが、今回は枚数制限があるのでできなくなってしまいました。そもそも確率の計算が間違っていたようで、

  1. 12.9%
  2. 24.5%
  3. 24.5%
  4. 12.9%

でした。前回の計算よりは高かったようで、作戦と計算間違いがうまくはまった形になりました。

今回は、「期待値を計算してそれが高い手札を出す」という、試行回数が多ければ負けることのない(はずの)考えにしました。

期待値って?

じゃんけんを例にします。グーで勝ったら3点、チョキで5点、パーで6点とします。
その時の期待値は、それぞれ

グー:勝つ確率(1/3)*3点 + あいこ、負け(2/3)*0点 = 1
チョキ:勝つ確率(1/3)*5点 + あいこ、負け(2/3)*0点 = 1.67
パー:勝つ確率(1/3)*3点 + あいこ、負け(2/3)*0点 = 2

となります。確率が同じなので得点の比率がそのまま期待値の比率になります。

このゲームの期待値を計算

前回は手で計算して見事に失敗したので、今回はExcel先生に頼りました。

ai3kitai

対象デッキが1のときの期待値など

ファイルはこちら(マクロが含まれているエクセルブックです)

15*15*15*15の組み合わせ全てについて、勝ち/引き分け/負けの判断をし、その回数や総得点、期待値などを網羅したつもりです。先ほどのじゃんけんの例と違い、確率も違えば1ゲームの得点の合計も違うので複雑ですね。一番右の列が期待値で、対象デッキが1のときは10がダントツで有効なようです。

この数値を参考にして、手持ちの5枚のカードの中から期待値が高いカードを出していく感じになります。処理は以下。

デッキは、同じルーチン同士やテストAI相手に試合を繰り返し、勝率の高かったものを採用しました。対象デッキ1から4の期待値の合計を参照したものが強めで、すべてプラスの数字になっています。

途中に挿入されているコモンは、カードの数字(-5から10)とDBのデータ/項目番号を相互変換するコモン(カードに0が存在しないのでそこでずれる)と、手持ちのカードの何番目にあるかを返すだけのコモンです。提出した時そのままのファイルがこちらにありますので、対戦相手に欲しければ持っていって下さい。コモン5つ、DB1つを使用します。

期待値をソートするのが面倒で、変数を引き上げて総当りで探しています。X番の変数呼び出しとDBの数、コマンド数などが制限されていたので、これでいいやーとなりました。動けばいいんですよ動けば。

結果

配信からのスクリーンショット

配信からのスクリーンショット

なんと2位になれたようです!派手に勝ってもいないけど負けてもいない、「愚直」に期待値がいいやつを出し続けた結果でしょうね。1位にはだいぶ離されちゃいましたが。テストAIには平均50点ぐらい取れたんですけどね、手強い相手ばかりだとなかなかそうもいかないようです。

実装したかった処理

時間がなくて諦めたんですが、

  1. 場の数字の出方を見て相手のデッキを読み、出す手を少しずらす
  2. 全員の出したカードを記憶し、残り枚数をカウントし、期待値の合計でなく勝ち/引き分け/負けの期待値を使い思い切った手に出る
  3. 対象デッキのカードを記憶し、残り枚数をカウントし、数手先の確率も考慮してカードを決める

3.はもう少し時間があれば実装できそうだったので残念です。

対象デッキの数字に合わせて何を出すかのゲームなので、そのあたりも考慮すればもっと強いAIになりそうです。

参加したファイルたち

上の方にあるリンクと同じですが、一応最後にまとめておきます。ご自由にお使い下さい。

第一回「愚直」(コモン1つのみ)

第二回「愚直・改」(コモン5つ、DB1つ)

第二回 期待値を計算したマクロ含むエクセルブック

Tweet about this on TwitterShare on FacebookShare on Google+

関連記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です