ポケモンの対面相性を数値化してみる (Showdown シミュレーター使用)
これの応用。
あとかなり昔に似たようなことやった気がする。精度が段違いだけど
前回記事で第8世代に対応したポケモンAIが完成しました。
今回は対戦中の最善手探索とは視点を変えた自由研究です。
ポケモン対戦AI(Percymon)はMinimax計算により、最善手を局面の評価値とともに出力します。
この評価値は現局面の有利不利(※)を表します。大きければ大きいほど自分にとって有利な局面を表し、小さい評価値はより不利な状況を表します。
※正確には自分がその最善手を選択し、相手が"その最善手に対して"一番有効打となる手を選択した場合の、次ターンの局面を数値化したものです。
通常、Percymonはこの評価値を3 vs 3 もしくは 6 vs 6 のPT対戦において、両者の交代まで見込んで計算しますが、お互い1匹ずつしかポケモンを持たない1 vs 1 対戦を設定してやれば、この評価値は両者のポケモン1対1の純粋な相性(どっちがどれだけ強いのか)を表します。
そこで今回はポケモンソルジャーさんのシーズン2後期の使用率ランキングを参考にし、
環境上位16匹のポケモンの1対1の対面相性を計算してみることにします。
【ポケモン剣盾】ランクマッチ シングルバトル集計とその考察【シーズン2後期】 | ポケモンソルジャー【ポケソル】
詳細条件は以下の通りです。
- 16匹のポケモン個体は通常ランクマッチで使われるのと同様に持ち物・個体値・努力値・技・特性・性格 を適切に設定する(なるべく標準的な型を手動で設定する)。
- 局面の評価は、お互いのポケモンのHP割合の差 のみで判定する。(※2)
- 同じポケモン組で順番が異なるパターンを両方とも計算し、両者評価値の差を、0を中心に均等に振り分けてそれぞれの評価値とする(※3)
- 最大3手(≒3ターン)までの局面を予測する(3手読み)
- 同じポケモン同士の評価値は0とする
- 各ポケモンの組み合わせに対して100回ずつ評価値計算を行い、その平均をとる
- ダイマックスは使用不可
(※条件2について)
たとえば、
エースバーンの現在HP: 80/155 (51.6%)
アーマーガアの現在HP: 170/205 (82.9%)
のとき、エースバーン視点でのこの局面の(静的)評価値は
(51.6 - 82.9) / 100 * 1024 ≒ -320
つまり評価値は-1024 ~ 1024 の範囲の値をとる。
(※条件3について)
エースバーン vs アーマーガア の評価値 = 300 (エースバーン視点)
アーマーガア vs エースバーン の評価値 = -100 (アーマーガア視点)
と計算されたとき、評価値の差は300 - (-100) = 400 でエースバーン > アーマーガアなので
エースバーン vs アーマーガア → 200
アーマーガア vs エースバーン → -200 を最終的な評価値とする。
結果
対面相性表_16x16_20200213 - Google スプレッドシート
エクセルダウンロードもできると思います。シートが複数あります。
- 3手読み
- 2手読み
- 1手読み
- 3手読み値-2手読み値 (※)
- 2手読み値-1手読み値 (※)
画像Ver.はこちら(3手読み最終結果のみ)
(弁明: Showdownの英語表記が読めなくてカバルドン・水ロトムの持ち物を間違えてバンジのみにしてしまいました。オボンを持たせたつもりでした。)
※ (n手読み値 - (n -1)手読み値)について
各ポケモン組のn手読みでの評価値から、n-1手読みでの評価値を引き算したものを同様に表でまとめたものです。
この値が大きい場合、n-1ターン目終了時点よりもnターン目終了時点の方が局面が好転しているということになります(下記の考察で使用)
表の見方
- 縦の列が自ポケモン、横の列が相手ポケモンと理解してください。
- ギルガルド@弱点保険 はパルシェン@タスキ に対して評価値が701で、圧倒的有利です。
- ギルガルドの全ポケモンに対しての評価値を合算すると2010で、今回の16匹の中では上位に入ります。
- 表内部の値は上位/下位10%を緑/赤で、合計値は上位/下位20%を緑/赤で示しています。
考察
注1)あくまで1対1の対面相性です。個々のポケモンの性能を広い意味で示しているわけではありません。
注2) ある程度ポケモン対戦をやり込んでいる方々にとっては当たり前のことが書いてあります。
・ダルマの火力がヤバイ
表の「合計」欄を見た方は誰しもヒヒダルマの4463という値がずば抜けていることに気づいたことでしょう。
無償突破(評価値1024)も2匹のポケモンに対して実現できています。
メモ: このダルマはスカーフです。
・ミミッキュの万能感
合計評価値第2位がミミッキュです。まあ当たり前でしょう。特性により1ターン多く行動できるので。
物理受けのアーマーガアや特性を無視してくるドリュウズ・パルシェンにはちゃんと(?)不利を取っています。(計算がある程度正しい証明)
・サポート型は対面性能は高くない
例えばカバルドンは、地震が通らない相手はほとんどHPを削れず結果として最小値に近い評価値を出しています。
前述の通り、今回の計算はあくまでHP割合のみで評価値を割り出しています。そのためステロや、あくびを撒き後続のサポートをする効果は数字には現れていません。
・「先制で落とす」 ということの重要さ
Googleスプレッドシートの"2手読み値-1手読み値"のシートを使って説明します。
この表での値が高いポケモンは、1ターン目終了時点よりも2ターン目終了時点の方が局面が好転していることになります。
その要因の最たるものは、2ターン目に先制して相手を倒している、というパターンです。この場合、1ターン目には食らっていた相手ポケモンからのダメージを食らわずに2ターン目(というか試合自体)が終了するので当然HP割合の差は有利になります。
下の画像は表の2,3 行目付近です。2行目はタスキエースバーン、3行目はタスキパルシェンです。
この2体は2ターン目終了時点で評価値を大きく伸ばしています。つまり2ターン目に先制で相手を倒すパターンが頻出しています。
エースバーンはタスキで耐えた1ターン目との合算ダメージ、パルシェンは同じくタスキで耐えたことによる積み技やこおりのつぶてで先制で相手ポケモンを戦闘不能に持ち込んでいることでしょう。
あくまでHP割合の差で評価した場合の議論であることは注意すべきですが、太古の昔よりポケモン対戦で素早さ能力値が重視されてきたことの裏付けとなっています。
耐久ロトムやカバルドンには逆に、倒されるターンに評価値が激落ちする傾向があります。
・弱点保険、スカーフ、タスキ は対面相性を覆す
上の例だとそもそもエースバーンがタスキを持っていなかった場合、ギャラドスの滝のぼりで一撃で倒されエースバーンに2ターン目の行動はなかったことでしょう。
さらにタスキの効用が分かりやすいのは物理タスキドラパルトと特殊メガネドラパルトの比較です。
スカーフヒヒダルマ・スカーフサザンドラには本来(特殊ドラパルトは)先制で倒されますが、タスキドラパルトの方はタスキで耐えられるため致命的に低い評価値とはなっていません(返り討ちにした場合にもHPは1しか残らないので、今回の評価方法ではあまり高い評価値にはなりません)。
また、全体的にギルガルドが異様に強く評価されていることが弱点保険の強さを裏付けています。今回両者の行動パターンはMinimaxで計算しているので、単に抜群技を打ち合うのではなく等倍技で削り→抜群技でフィニッシュという立ち回りも選択されているはずなのですが、それでも弱点保険は1対1対面では強いようです。
課題点
・HP割合だけの局面評価は妥当か?
もちろんこれだけで十分な評価ができているとはいえず、改良すべき点ですが、個人的には下手に状態異常、天候状態、タイプ相性などを機械的に評価に組み込むよりは安全だと。
たとえば対面のポケモンのタイプ相性で評価値を補正しようと思っても、「ふゆう」という特性、ヒヒダルマのダルマモードなど戦闘中にタイプが変わる例、フリーズドライというタイプ相性を一部無視する技、など例外が多すぎて対処しきれません。
水ロトムが型破りドリュウズの地震を等倍で受けてしまうようなポケモンシミュレーターは嫌です…
・3手読みは妥当か?
耐久ポケモンに対しては妥当ではありません。例えば画像は"3手読み値-2手読み値"ですが、鉄壁アーマーガア、ビルドアップアーマーガア共に2ターン目→3ターン目 で評価値を大きく伸ばしています。4手読み、5手読み、、、と手数を伸ばしたらより有利が広がる可能性があります。
計算手数を伸ばすとそれまで計算時間(今回の計算は全体で5.5時間要しています)が伸びるので、それとの兼ね合いになります。
なお、大多数の並耐久ポケモンについては3ターンで大体決着がつくので(2ターン目→3ターン目で評価値があまり変わらない)、3手読みで十分だと思います。
・技外し、ひるみ、など低確率なリスク要素の過剰な考慮
Minimax計算のアルゴリズムを知っている方ならピンとくるかもしれませんが、
Minimaxは簡単にいうと「一番リスクの少ない選択をとる」アルゴリズムです。
Minimaxは「鬼火(willowisp)」というこちらの選択に対して相手の技4パターンに対する今後の局面をそれぞれ計算します。
重要なのは、この「鬼火(willowisp)」という選択に対する評価値は、相手の4つの技に対応する4つの評価値のうち、最小値(Min)を採用する ということです。
何が問題かというと、鬼火(命中率85%)は4回のうち1回くらいは外れます。鬼火が外れた局面は、この先何をやっても不利は覆りません。その先の局面をすべて計算した上で、その鬼火外しの局面は相手の技「shadowsneak」に紐付けられた評価値として、非常に低い値(-419)が記録されます。前述の通りこの-419という評価値は鬼火(willowisp)という選択の評価値にもなります。 このアルゴリズムは「相手プレイヤーは自分一番嫌な(評価値を下げさせる)選択を取る」という原理原則に基づいています。
ゲーム木の計算全体は100回の積算を行っていますが、個々の計算内で高確率で鬼火の効果が過小評価されてしまいます。
トゲキッスの先制エアスラッシュなどでも同様の問題が発生します。この場合は、4回の試行で一度でもひるまされると、そのときの自分の選択自体が「不利な行動」と判定されてしまいます。
この問題は…アルゴリズムの適用限界でもあるのでより根本的に解決したいと思います。
・ポケモンの型の多様性
条件のところで各ポケモンの個体について「なるべく標準的な型を手動で設定する」と書きました。卒論発表会であれば教授から必ず突っ込まれる部分です。
各ポケモンの努力値振り・持ち物などによる結果のズレを考慮し、ポケモンの型自体をパラメータの一つとしてこの計算に組み込むというのはまた難解な課題です。
A努力値180だとあるポケモンが倒せなくて、A努力値188にするとそのポケモンが倒せる、この188という数字を見つけられたら嬉しいみたいな話は、ある1匹の仮想的に対しては実現できたとしても、環境全体に対して最適化しようとすると計算量が膨大になってしまうのでレイヤーを分けて考える必要があります。
ということでしばらくは、型の異なるポケモン個体を手動でいくつか作って別々に評価値を出していこうと思います。
ちなみにポケモン個体はShowdown本家のTeamBuilderで作成し、テキストをエクスポートしてプログラム内で読み込んでいます。
チャオ!
イタリア生活レポ (すごい系その1)
今日からイタリア在住ブロガーになるぜ!
昨年5月にイタリアに来たのですが、そこから3ヶ月分ぐらいパラパラ~と写真を見返して思い出した分を書きます。 シリーズ化したい。
長期休暇が長い
この記事でも書いた通り(今年の冬は17連休がデフォ)、夏と冬の長期休暇がクソ長い。
夏休みは9月まるまる休んでる猛者が居てウケました。休職かな?
みんな英語しゃべれる
これは地域差があると思うけど…
若者~中年ぐらいの年齢の人なら並の日本人よりは普通にしゃべれる。若者に至っては高校生ぐらいでもまあまあしゃべれるからすごい。
でもイタリアに到着して最初にチェックインしたホテルの人がSignatureをシネチャーシネチャー言っていて全然聞き取れなかったのはいい思い出。(イタリア語だとgを発音しない)
携帯料金が安い
これは別にまとめるかもしれません。
自分の今の支払い額はこんな感じです。
メインスマホ 20GBプラン 10ユーロ(≒1200円)/月
モバイルWifi 30GBプラン 10ユーロ(≒1200円)/月
↑モバイルWifiの2ヶ月分(諸費用込)
電車で海外まで行ける
(実際電車だけで行く人は居ないだろうけど)
その気になれば北欧とかまで陸路がつながってるのがすごい
自分の近隣だとトリノからフランス(パリ)行きの電車が、
ミラノからスイス行きの電車が出ていたと記憶しています。
車がほぼマニュアル
レンタカーでも特に指定しなければマニュアル車。
イタリア人ももちろんオートマ車の存在は知っていますが、まず高いから買わない→売れないから安くならない→高いから買わない の無限ループで未だにマニュアル車市場が続いているというのは有名な話。そんなに不便に感じてないらしい。
これは老若男女問わずみんなマニュアル車を運転できる能力を称えてすごい枠に入れてます。
観光地がゲームの世界みたい
ゲームみたいだし映画みたいだしアニメみたいです。
中世時代の石造りの建物や、天井の高い大聖堂や、緻密に装飾されたお城が本当にこの世にあることに感動します。ぼくは旅行ですら海外経験が皆無だったのでビビり倒しました。
まあ、実はヨーロッパの都市は全部そんな感じらしく観光しまくってるとそのうち飽きるらしいです。(下は抽象化されたヨーロッパ都市)
カード決済の普及率
(怪しい中華料理店を除いて)屋内の飲食店は大体カード対応してるので現金を使わなくて便利です。
現金を使わなさすぎていつまでたっても100ユーロ札が崩せません。
歴史の規模が桁外れ
日本の観光案内: 「この建物は江戸時代初期に時の○○公が~」
ローマの観光案内: 「紀元前3世紀のギリシャ彫刻と考えられていて~」
古すぎると新しい建物が建てられなくて問題もあるみたいですけどね。
ちなみにぼくが今住んでいるアパートは築88年です。
ワインに対する見識
赤ワインと白ワインのチョイスを間違えない。
コーヒーに対する見識
朝以外にカプチーノを飲まない。
トマトが安い
500gで200円ぐらい。トマト最高!!!
シェアサイクル/カー/キックボード の普及率
住んでいるのがトリノの都市部ということもありますが、周りを見渡せば必ず誰かが使ってるくらいシェア系の乗り物が普及してます。
シェアサイクルのMobikeはぼくも使ってます。
最近はキックボードのシェアがイタリア中でめちゃくちゃ流行ってます。(写真載せたかった)
生ハムメロン
カジュアルに生ハムメロン(Crudo e Melone)が出てきたんですけどこれが生ハムメロンですか(大半は普通のハムだけど) pic.twitter.com/HpeFnSSjQP
— がりゅう (@shingaryu) 2019年6月28日
生ハムメロンがイタリアンの本場に本当にあってすごい、というお話です。
IKEAがテーマパーク
欧米はなんでもスケールがデカイとはよく言いますがIKEAのデカさにはビビりました。
途中にカフェやレストランまであります。
気取ったアメリカ人ではないので発音は普通に「イケア」です。
ヨーロッパ時間の夜にブログを投稿すると日本が深夜~早朝なので誰にも見てもらえないバグに悩まされてます。
予約投稿あんましたくないんですよね。
Pokemon Showdown用 AI(Percymon) 第8世代対応
これの続編です。最後に「乞うご期待」とか書いといて全然更新してなかった
やっと更新作業が終わりましたよ
(更新が停止したプロジェクトをGitHubでフォークしてます。プログラムに興味がある人はDLして実行してみてね)
前回記事の時点では第7世代までしか対応していなかったですが、今回のポケモンソード・シールドを含む第8世代まで対応させました。
がんばりました。ポケモンAIの開発は新世代へのアップデートができなくて更新が途絶えるものだと古事記にも書いてありますが阻止しました。
今回の撮れ高
Pokemon Showdown 第8世代シングル6→3
× 適当プレイぼく(手前) vs ○ 3手読み Percymon (奥)
PTと選出はいい感じの勝負になるように人間が適当に決定
エースバーンが強かった。
- 数字はその局面の評価値(高いほどPercymon側有利)を表します
- 頂点が現在のターンとお互いのHP残量を表します
- 木構造を下にたどっていき、Percymonのコマンド、Playerのコマンドが揃ったところで実際にゲームが進みその結果のHP残量が記載されています。
- 死に出しの場合そこでもゲームが進みます
- 今回は深さ3の設定なので、上記の数え方で合計3回ゲームが進んだところまで計算しています。(必ずしも3ターン先とはなりません)
改めて何をするやつなのか説明
もちろんこの仕組みはオリジナルの開発者さんが設計したものですが、
前回記事でここらへんを説明していなかったので図を作りました。
- ①PercymonはShowdownサーバーに接続し、対戦募集・コマンド送信などを自動で行います。ランダムでマッチングしたオンラインのプレイヤーが対戦相手となります。
- ②対戦はShowdownサーバー上で行われますが、Percymonは対戦メッセージを手がかりに内部で対戦シミュレーターを動かし、対戦の局面を逐一更新していきます。
- ③④この局面情報を用いてMinimaxモジュールは「現在の情報から推測した、最も有効なコマンド選択肢」を計算します。これは図中で「最善手」と書かれているものです。
- ⑤数秒の後に最善手の計算が終わると、Percymon本体はShowdownサーバーに「最善手」を送信し、対戦相手のコマンド選択を待って対戦が進みます。
- 上記の最善手計算を対戦終了まで、コマンド選択を求められる度に繰り返します。
- おまけ機能として、Webブラウザを介して最善手計算の結果(選択肢ごとの評価値)をツリー構造で確認することができます。
相手ポケモンの技の推測や、選出選択はどうしてるの? など細かい仕様はまた別の機会に説明しようと思ってます。
ついでに改良したとこ
冬休みの自由研究的な。
計算の高速化
上記Minimaxモジュール中で、自分の行動×相手の行動の組み合わせに対応する数十パターンの局面を一個ずつ再現するのですが、そのために毎回局面オブジェクトを複製する ところの処理が結構速くなりました。
局面(Battle)オブジェクトの中身のうち、直接局面の状態に関係せずコピーする必要がないもの(Dexオブジェクト)を複製対象から外しました。あと単純にコンソールに表示されるログメッセージをOFFにするだけでもだいぶ速くなりました。
ケース1 | ケース2 | ケース3 | |
---|---|---|---|
旧(ログメッセージあり) | 1.170s | 8.498s | 25.896s |
新(ログメッセージあり) | 0.798s | 7.139s | 11.450s |
新(ログメッセージなし) | 0.194s | 1.386s | 3.000s |
Minimaxノードの表示機能
これは修正・改善というより新規機能に近いですが、上で説明したような想定される各局面の評価値を分かりやすく表示するようにしました。
Minimaxとかを知らなくてもこれを見れば誰でも直感的に理解できそう?
一応オリジナル(本プログラムはrameshvarunさんからのフォークです)にも簡易的にノードを可視化する機能はあったのですが、木構造の方が見やすかったので新しくHTMLで描きました。デバッグ用途にも重宝してます。
メガシンカ・Z技・ダイマックスの分岐計算
当たり前といえば当たり前ですが、メガシンカ・Z技・ダイマックスが使用できる局面で、それを使用するかしないかの選択は状況によります。
なにがいいたいかというと、今まではこれらは強制的に使用するように設定していたのですが、今回から使用する場合・使用しない場合を分岐して計算し、最適な方を選ぶようにしました。
動機としてはダイマックスの登場がデカイです。メガシンカ・Z技はあらかじめアイテムを持っているポケモンのみが使用できるため、まあまあ半分ぐらいの場合は即発動でも自然な選択肢になりますが、ダイマックスは全ポケモンがいつでも使用できるため、初手発動はあまりにも雑すぎると思いました。
が、結果的に現在もAIはほぼ初手でダイマックスします。これはたかだが2~3ターン先の局面の範囲では早めに使用したほうが有利がとれる(と計算している)からです。これについては今後の課題ですね。
まとめと感想
一応正月休みを含む1ヶ月ほどかかりましたが、対戦エンジン部分は自作していないので1ヶ月で終わってます。そこを自作しているAIだと新ポケの種族名・新規技・ダイマックスシステム、、など全部実装し直さないといけないので正直ポケモン剣盾シミュレーターの開発をしているのかAIを作っているのかわからないくらいの作業量になると思います。
計算の高速化により3手読みが現実的な時間でできるようになって面白いです。
疲れたら適当にランダムマッチに潜らせてオンラインプレイヤーと戦わせてるのですが、初心者と思わしきプレイヤーを一方的に撲殺しているのを見ると達成感を感じます。子供の少年野球を応援するお父さんみたいな。
ちなみに今回作業してて一番思ったのは、「Pokemon Showdownってスゲェなあ~」ってことです。第8世代のアップデートも2週間ぐらいで落ち着いてたし。
Showdownの開発リーダーはCV(履歴書)の一番上にShowdownの開発・運用実績を載っけてて普通にアメリカで活躍しているので、アメリカで働きたい学生はPokemon Showdownみたいなやつを作りましょう。
イタリアで働きたい人はサイゼリヤとオリーブの丘に通いつめてピザの種類を覚えとくといいです。プレ~ゴ~~