ゲーム理論を用いた簡易ポケモン対戦体験記
皆さん、こんにちぴらーん。最近他人の成果に乗っかりがちなぴらんでございます。
先月Twitterのふぉろわー様が素晴らしい考察ツールを開発してくださりました。なんとゲーム理論を用いてポケモン対戦の最適手や勝率の予想をしてくれるツールです。
ダメージ計算をタイプ相性のみで行っている点など、流石に実際の対戦の要素を1から10まで再現してるわけではありませんが、充分面白い考察を行うことが期待出来る画期的な発明です!
今回はこのツールを用いて色々遊んで見ましたという体験記です。
要約
最近制作されたポケモン対戦を簡略化したゲームを紹介し、導入方法と計算例を解説しました。計算例では炎水草の三すくみの計算を行いました。特にタイプを偏らせた選出について計算し、単純なモデルでは役割集中による勝率の向上は見られないことを調べました。
はじめに
最初に配られる炎草水のポケモンに代表される三すくみの関係はポケモンの相性を考える上で最も基本的なものになっており、3すくみのゲームを理解することはポケモン対戦を理論的に考える上でとても重要です。
実戦ではかならずしも炎草水の3タイプが登場するわけではありませんが、相手のポケモンAには自分のポケモンBが勝てるがポケモンBは相手のポケモンCに勝てない・・・といったように3すくみの関係自体はしばしば登場し、これらの交代/居座り択などを考える上で炎草水の考察は少なからず参考になるはずです。
というわけで、炎水草の3すくみについて重点的に分析します。今回は炎水草の3ポケモンをバランスよく選出する場合と偏らせて選出する場合について上述の戦略解析ツールを用いて比較していきたいと思います。
方法
ツールの導入
まずgithubから上述のツールをダウンロードします。githubへは上のseytwoさんのブログから飛べます。
githubへ飛んだら右上のcodeというボタンをクリックして下に表示されるdownload zipのボタンをクリックしてzip形式でダウンロードします。
ダウンロードしたらzipファイルを解凍してmain.pyを実行すれば計算を行えます。pythonプログラムを実行できる環境は必要です。
計算に使用するポケモンのタイプはconfig.jsonに、先発のポケモンを誰にするかはmain.pyに書き込まれているので、必要な部分を書き換えれば自由な条件で計算できます。なお、config.jsonを書き換えた場合はValueIterationやsave_result関数の行の#を消してコメントアウトを外し、すぐ上のload_resultの行を#でコメントアウトする必要があります。先発ポケモンだけを変える場合はコメントアウトの必要はありません。
計算条件
いよいよ上述のツールを使った計算に入っていきます。プレイヤー1を炎、草、水の3体のバランス型の選出で固定して、プレイヤー2の選出を①炎、草、水のバランス型選出②炎、水、水の水偏重選出③水、水、水の完全水特化選出の3通りの組み合わせで上述のツールを用いた対戦を行います。
先発ポケモンの組み合わせにより勝率が変わってくるので先発ポケモンの組み合わせを総当たりして勝率をまとめた3×3の行列を作ります。その後線形計画法を用いて改めてこの行列ゲームを解くことで先発ポケモンの出し方と勝率を決定します。
結果
①炎草水 VS 炎草水
計算した結果先発ポケモン毎のプレイヤー1勝率は以下のようになりました。
$$
\def\arraystretch{1.5}
\begin{array}{c|ccc}
プレイヤー1\backslash2 & 炎 & 水 & 草 \\ \hline
炎 & 50\% & 41\% & 59\%\\
水 & 59\% & 50\% & 41\%\\
草 & 41\% & 59\% & 50\%
\end{array}
$$
これを解いて先発を決定するとそれぞれのポケモンを33%で出すのがベストであり、その時はプレイヤー1の勝率は50%になることがわかります。プレイヤー1と2で同じ選出をしているので自明な結論ですが、先発で出し勝つと勝率が59%まで上がり、出し負けると41%まで下がる点は↓の結果との比較の為に重要になるかと思います。
②炎草水 VS 炎水水
計算した結果先発ポケモン毎のプレイヤー1勝率は以下のようになりました。
$$
\def\arraystretch{1.5}
\begin{array}{c|cc}
プレイヤー1\backslash2 & 炎 & 水\\ \hline
炎 & 63\% & 50\% \\
水 & 66\% & 50\% \\
草 & 52\% & 70\%
\end{array}
$$
これを解いて先発の出し方を決定したところ、プレイヤー1は水ポケモンと草ポケモンを50%:50%で先発に選出、プレイヤー2は炎ポケモンと水ポケモンを59%:41%で選出する時にナッシュ均衡になり、その時のプレイヤー1の勝率が59%になるという結論が得られました。
③炎草水 VS 水水水
計算した結果先発ポケモン毎のプレイヤー1の勝率は以下のようになりました。
$$
\def\arraystretch{1.5}
\begin{array}{c|c}
プレイヤー1\backslash2 & 水\\ \hline
炎 & 100\% \\
水 & 100\% \\
草 & 100\%
\end{array}
$$
全員を水ポケモンのように極端に偏らせると先発の出し方に関わらず勝てません。
考察
プレイヤー1と2で対称なパーティで対戦しているため①の結果は自明です。先発で有利対面を作った時に9%ほど勝率が上がるのが特徴です。
②③の結果はタイプを偏らせた選出では勝率が下がることを示しています。
②を詳しくみると先発でプレイヤー2(水偏重側)が出し負けた時はもちろん、プレイヤー2が出し勝ったような場合ですらプレイヤー1に有利な勝率になっていることがわかります。このことから、ナッシュ均衡でもプレイヤー1に有利な勝率になることが理解できます。
また、先発の決め方について詳しくみると、プレイヤー1は水ポケモンと草ポケモンの2種類のみを出していることがわかります。これはプレイヤー2に草ポケモンがいないためプレイヤー1は炎ポケモンを先発させるメリットがないのが原因と考えられます。
③を詳しく見ると先発ポケモンの出し方に関わらず完全に水に偏らせた編成ではバランスよく選出したパーティに勝てないことがわかります。
ポケモン対戦の理論では役割集中という考え方が知られており、苦手な相手を敢えて統一することにより特定のポケモンへ負荷を過集中させる事により勝利するという考え方があります。例えば物理アタッカーを複数選出し、二人掛かりで物理受けを突破し物理受けのいなくなった相手を物理アタッカーで攻撃して勝利するといった具合です。
今回の結果はタイプ相性のみを考慮した単純なモデルではそのような役割集中により勝率を上げることはできないことを示しています。役割集中という考えが機能するためには今回の計算で考慮されていないなんらかの要素(積み技や回復技等?)が本質的になっており、単に役割を統一して同じポケモンに負荷をかけるというよくされる説明では不十分である可能性が高いです。
まとめ
フォロワー様が作ってくださった素晴らしいプログラムについて使い方の解説と実際に遊んでみた結果をまとめました
御三家の3すくみについてタイプを偏らせた選出がバランス型の選出に有利を取れないか試したところ、バランス型の選出の方が強そうなことがわかりました
今回仮定しなかった要素の中に役割集中にとって重要な要素があることがわかりました。
あとがき
いかがでしたか?めちゃすばらなツールなのでわたしがやったような解析の他にももっと面白い考察できるよという方がいればどんどんやっていってほしいです。そういう考察わたしも見たい。
今回はツールの出力結果のうち勝率のみを使って解析しましたが、他にも対戦の棋譜や選択肢毎に勝率を計算してくれたりと便利な機能たくさんついているのでこういう使い方も面白かったよがあれば教えて下さい。
役割集中はわたし自身がよくわかっていないのもありますが、単純に殴り合うだけでは機能しなさそうなのは意外でしたね。積み技があったり相手が回復技をもっていたり、本質的な要素がまだ隠れていそうなのでどういう要素があれば役割集中を強く使えるのか考えていきたいですね。
次回はまたこのツールを(すこし改造して)使って一人だけ防御力が高いポケモンがいたらどうなるか~??みたいなことをやっていきたいと思います!乞うご期待!
では来週~~