【つくオフベスト4】AIの評価値を利用したPT自動生成
○○○○さん
こんばんは、リクナビ編集部です。
3/1(火)AM0:00~プレエントリーの受付を開始します。
ほんとは今くらいの時間(21時)に書き上げて投稿しようと思ってたのに
幼稚園児だから1日に14時間寝てしまった
こんな感じのPTで第7回つくオフのVGC2016ダブル部門に参加してきました。
正直そこまで自信があったわけではないのですが、なんと
ベスト4
まで勝ち上がりました!!!!!!!(どんどんパフパフ)
今日は他でもないこの構築(PT)を作成した方法についての話です。
こんな感じで作りました。
(VSの単体テストの使い方を盛大に間違えてるような気がしますが。)
簡単に説明すると、
対戦AIの評価値を基準にしたPT自動生成です。
段階を追って説明していきたいと思います。
1. 対戦環境に存在するポケモンの個体設定
2. PT候補として用意するポケモンの個体設定
3. 総当り戦でのAIの評価値を元にした相性テーブルの作成
4. 候補個体の組み合わせ最適化
5. 計算結果
6. 微調整
1. 対戦環境に存在するポケモンの個体設定
今回のルールはVGC2016のGSルールです。まず最初にこの対戦環境に存在する代表的なポケモン個体のリストを作成します。
「代表的な」ポケモンを客観的に設定するために、グロリアクラシック第6回予選のKP集計結果を使用させていただきました。全ポケモンについて採用率までまとめられていたのでとても助かりました。
ここでは使用人数3までの32匹のデータを使用しました。
これでポケモンの「種族」についての情報は集まったので、次はさらに細分化した「型」についての情報です。
こちらはお馴染みのPGLを使用しました。スペシャルレートシーズン14のポケモンデータです。
といっても、ここにあるのは技の採用数などのランキング化されたデータだけで、個体1つとしてまとまった「型」を作成するための情報としては十分ではないので、ここで少し主観が入ってしまっています。一応以下の方針で個体を作成していきました。
1. 性格で型を分離し、採用率の値に2倍以上開きが出るまでランキングの上位から選択していく
2. 技のランキング上位から、性格に合っていて役割が被らない技を4つ選択
3. 特性・持ち物は臨機応変に設定
それで、ポケモン個体について設定とか作成をするとは具体的にはどういう操作なのかというと、Pokemon Online上で作成してそのデータをテキストファイルに書き出すということです。この便利な機能については前回記事でも少し説明しました。
2. PT候補として用意するポケモンの個体設定
1. ではいわば「仮想的」のようなものを設定しました。これはある程度有名なポケモンだけで十分ですが、こちらのPTに組み込むポケモンは多少マイナーなものにも幅を広げた方が有利です。
そこでPT候補としては1.のポケモンに16匹を加えて48匹としました。
前述のグロリアクラシック予選KPランキングの採用人数2以下のポケモンのうち、「個人的にそこそこ有名だと思ったポケモン」を適当に入れました。
ちなみに、ここまでの作業はほぼ全て手動です。2~3時間くらいかかったと思います。
3. 総当り戦でのAIの評価値を元にした相性テーブルの作成
たぶん一番のメイン。
目標としては、誰が誰に強いか、弱いかというのを数値化し、(対戦環境ポケモン数)×(PT候補ポケモン数)の相性テーブルをつくること。
ここでAIを使います。(自慢したいので前回記事をまた貼る)
AIへの入力条件としては、1~2の作業で作成したポケモン同士の、1:1のシングルバトルを2手読みするものです。
ポケモン[ ] 候補;
ポケモン[ ] 環境;
相性値[ ][ ] 相性テーブル;
for(i = 0; i < 候補.数; i++)
{
for(j = i + 1; j < 環境.数; j++)
{
相性テーブル[i][j] = AI評価値(自分 = 候補[i], 相手 = 環境[j], 手数 = 2);
}
}
組み合わせが同じであれば自分と相手を入れ替えても相性値は逆転するだけなので、実際に計算するのは相性テーブルの上三角部分だけです。
本当は手数を3にしたかったのですが、プログラムの安定性と時間の都合により妥協しました。エラーがなければ計算時間は1時間くらいだったと思います。
※03/01 01:59 追記
そして少し小細工。グロリアクラシックのデータから各ポケモンの使用率を引用して、相性値に乗じます。こうすることで、この後組み合わせを最適化する際に使用率の高いポケモンを優先的に対策することができます。
結果的には、こんなのが出来上がります。
※03/05 追記
キュレムとランドロスをレベル70で計算していたことに気づいたので、怪しいです。
今回については後述の6.の作業の効果に助けられている部分が大きいと思います。
4. 候補個体の組み合わせ最適化
実はこの部分は過去の手法の流用です。相性ベクトル各成分の最大値を採用する方法。
相性テーブルさえ作ってしまえばシメたものというわけです。
忘れがちですが、禁止伝説はPTに2体までしか入れられないので、禁止伝説の2体を決めてから一般ポケ4体の枠を決める必要があります。
ちなみに計算時間はわずか1秒でした。過去記事の方は100C6の組み合わせだったので今回はだいぶ計算量が減っています。
5. 計算結果
できました。最初の画像に行き着きます。
6. 微調整
計算結果がそのまま最強のPTになるのが理想ですが、残念ながらスペシャルレートに潜って対戦させてみたところ、
「ゼルネアスが異常に重い」
という感想を持ちました。そこで最後にちょっとだけ微調整をします。
先ほどの相性テーブルをExcelでイイ感じに編集するとこんな感じの見栄えになります。
確かにゼルネアスに対してはキュレム、ランドロス、ゲンガーで対策できている計算なのですが、実際にかなりキツかったので仕方ありません。パワフルジオコンというダブル向きの型が相性テーブル作成の際のシングルバトルで上手く表現できなかったのでしょう。
ゼルネアスに対しては相性テーブルを信用しないというのも大いにアリですが、せっかく作ったので少しくらいは検討してみようと考えました。
相性テーブルをゼルネアスに対する相性値でソートします。ゼルネアスに強いポケモンが上に並びます。
禁止伝説は無視するとして、予想通りですがナットレイ、クチート、ギルガルドといった鋼ポケモンが見つかります。
ゼルネアスに対して受け出せるポケモンが欲しかったので、ちょうどゲンガーとメガ枠として共通項があるクチートを採用することにしました。
で、ゲンガーをクチートに変えて最初と同じくPT全体の相性値を見てみます。
グラードンがやや重くなりましたが、その他は全体的に有利になったので十分でしょう。
これでOK!
翌日は0次回で杉田幼稚園に行ったのもあって、修正後のPTは3戦ぐらいしか実機で回しませんでした。そのためつくオフ本番でどうなるかは未知数だったところもありました。
まとめ
独りよがりの自由研究だったので大会で実績を残せるとは思いませんでしたが、ベスト4まで進出することができて本当に良かったです。
予選を勝ち上がったあたりから色んな方に詳細を聞かれましたが、興味をもってくれるだけでもとても嬉しかったですし、今後のモチベにもなりました。
もう明日(今日?)から就活が始まるのであまり時間を取れなくなりますが、自分の納得がいくまでは今後も「計算機を使ったポケモンバトル」を考えていこうと思います。
つくオフで対戦して下さった皆様、0次回、2次回、3次回でお世話になった皆様、そして運営のつくポケ員、ありがとうございました。
最後に、今回使用したPTの詳細を書きます。借り物もあるので努力値振りはおおまかなものですが。一部個体を貸してくれたかねの(@fla_mofu)くんに感謝。
ホワイトキュレム@スカーフ
ターボブレイズ、臆病CS
・冷凍ビーム
・龍の波動
・大地の力
・流星群
ラティオス@珠
浮遊、臆病CS
・流星群
・草結び
・守る
カイオーガ@藍色の玉
雨降らし、控えめHCベース
・根源の波動
・冷凍ビーム
・雷
・守る
霊獣ランドロス@ハチマキ
威嚇、陽気HS
・地震
・岩雪崩
・馬鹿力
・はたき落とす
クチート@ナイト
威嚇、意地っ張りHA
・じゃれつく
・不意打ち
・守る
ゴウカザル@襷
猛火、むじゃきAS
・猫騙し
・挑発
ホワイトキュレムのNNが「あおきるりこ」なのがポイントです。
デレパ公録楽しかった~~~~