I'm KUITARIDER.

がりゅうさんのサイキックミラクルブログ

【ポケモンAI】対面相性表からのPT構築自動生成


好きなポケモンで勝てるパーティはこう作る! 元1位によるPT組み方講座【ポケモン剣盾】

 

とても感銘を受けました。

今回は前回作成できた対面相性表を用いて、このPT作成手順をプログラムで自動化する、ということをやっていきます。

 

事前準備

ポケモン同士の強さ関係を表す指標として、対面相性表を作成しておく
shingaryu.hatenablog.com

f:id:shingaryu:20200224075526p:plain

(今回使用した対面相性表32x32、拡大して見てね)

 

・対面相性表を計算した各ポケモンの「型」を以下の3種類に手動で分類しておく

さらにそれぞれ積み技を持つか否かをYES/NOで設定しておく

  • 高速アタッカー (Sweeper)
  • 重火力アタッカー (Tank)
  • 耐久ポケモン (Wall)

f:id:shingaryu:20200224075745p:plain


 

定式化 (飛ばしてもいい)

相性値の規格化

諸々の定義の前に、対面相性表の相性値を微修正する。

今回の対面相性表は最小値-1024、最大値1024で各ポケモン組の対面相性が数値化されているが、これを0~1の範囲にスケーリングし直す。

本質的な意味はないが、紛らわしい負符号を取り除くという意味合いが大きい。

(注: 後述の相性ベクトル自体の規格化ではない!相性ベクトルのノルムはポケモンごとに異なる)

f:id:shingaryu:20200224062009p:plain

f:id:shingaryu:20200224062032p:plain

 

相性ベクトル

対面相性表では、各候補ポケモン(行)の各仮想敵(列)に対する相性値が与えられている。

各候補ポケモンの1行を表す、相性値を成分としてもつ多次元ベクトルを相性ベクトルと呼ぶことにする。

各相性ベクトルの次元は仮想敵の数 = 対面相性表の列数で、

このような相性ベクトルが候補ポケモンの数 = 対面相性表の行数だけ作成できる。

(例)

f:id:shingaryu:20200224062032p:plain

Diggerbyの相性ベクトル = (0.883, 0.082, 0.274, 0.182, 0.504, 0.419)

Dracovishの相性ベクトル = (0.432, 0.677, 0.230, 0.473, 0.322, 0.563)

  

相性ベクトルのなす角(相性補完関係)

f:id:shingaryu:20200224064952p:plain

上記2次元(仮想敵が2匹の場合)の図で示したように、

相性ベクトルは直交座標系において方向と長さを持ったベクトルとして図示できる。

ここで、相性補完とは、両者の弱点を補い合うような関係で

ポケモン1が苦手なポケモンAをポケモン2が得意とし

ポケモン2が苦手なポケモンBはポケモン1が得意とするような関係のことをいう。

これを相性ベクトルに置き換えて考えると、例えば次のような相性ベクトルを持つポケモン同士はこの相性補完関係がある。

(例1)

ポケモン1の相性ベクトル = (0.1, 0.9)

ポケモン2の相性ベクトル = (1.0, 0.2)

成分表記は(ポケモンAに対する相性値, ポケモンBに対する相性値) の順である。

ポケモン1はポケモンAに弱くポケモンBに強いが、逆に

ポケモン2はポケモンAに強くポケモンBに弱い。

 

一方で、以下のような相性ベクトルを持つポケモン同士は相性補完関係が小さい。

(例2)

ポケモン1の相性ベクトル = (0.1, 0.8)

ポケモン2の相性ベクトル = (0.1, 0.9)

ポケモン1, ポケモン2、どちらもポケモンAに弱く、ポケモンBに強い。つまりどちらも弱点が同じで、相手がポケモンAを繰り出したとたんに簡単に崩されてしまう。

 

この相性補完関係は、相性ベクトルのなす角定量化できる。

相性ベクトルのなす角の余弦は図中の内積定理により求めることができ、なす角が大きい(最大で90°=π/2)ほど相性補完関係が大きいとみなせる。上記の例の相性ベクトルもこの関係を満たす。

(参考: コサイン類似度

 

相性ベクトルの長さ

相性ベクトルの長さ(L2ノルムを想定)はその候補ポケモンの総合的な強さを表す。

各成分となる相性値が大きければ大きいほど相性ベクトルの長さも大きくなることからこう定義する。

 

合成ベクトル

合計6匹でPT(チーム)を組んでいく都合上、ポケモン単体の相性値だけでなく、複数ポケモンが存在する場合のその組み合わせに対する相性値も考えていく必要がある。

今回の計算では、これを単純に合成ベクトルで定義している(図参照)。

ポケモン1 = (0.2, 0.1)

ポケモン2 = (0.1, 0.7)

が居て、ポケモンAに対する相性値(1番目成分)もポケモンBに対する相性値(2番目成分)も単純に各成分の和で定義している(合計で(0.3, 0.8))。

 

苦手か得意か

規格化により、各相性値は0~1の値をとることが保証されているので、

相性値 < 0.5 → そのポケモンが苦手(不利)

相性値 > 0.5 → そのポケモンが得意(有利)

と判定できる。なお、上記合成ベクトルを用いて複数匹の組み合わせに対する相性ベクトルを作成した場合は、この閾値は0.5×ポケモン数 となる。

 

型情報による候補ポケモンの絞り込み

(冒頭動画での説明を参考にしています)

下記計算手順(1)~(4)では条件を満たすポケモンを候補ポケモンの中から検索していくが、この候補ポケモンの種類を1匹目のポケモンの型によって限定している。

以下は1匹目のポケモンの型ごとの、以降候補ポケモンとなり得るポケモンの型である。

  • 高速アタッカー → 高速アタッカー または 重火力アタッカー (対面構築寄り)
  • 重火力アタッカー(※) → 高速アタッカー または 重火力アタッカー または 耐久ポケモン
  • 耐久ポケモン → 重火力アタッカーまたは 耐久ポケモン (サイクル戦寄り)

 

※ 1匹目が重火力アタッカーの場合は、2匹目のポケモンの型を用いてもう一度上記のルールでの候補ポケモンの絞り込みを行う。

 

計算手順

インゲンさんありがとう

(1)好きなポケモンを1匹選ぶ

(2)1匹目と相性補完が効くポケモンを1体選ぶ

(3)(4)1,2匹目が苦手とするポケモンに強いポケモンを2体選ぶ

(5)以上4匹が苦手とするポケモンを起点にするポケモンを1体選ぶ

(6)以上5匹が苦手とするポケモンをピンポイントで対策した1体を選ぶ

 

~(1)好きなポケモンを1匹選ぶ~

f:id:shingaryu:20200224065653j:plain

クイタラン (Heatmor) 

炎を ベロの ように 使う。

アイアントの 硬い 外骨格を

じわじわと 溶かし いただくのだ。 

 

~(2)1匹目と相性補完が効くポケモンを1体選ぶ~

  1. 1匹目の型情報を用いて候補ポケモンを絞り込む
  2. 1匹目との相性ベクトルのコサイン類似度を計算し、相性補完が一番大きいポケモンを探す。

結果: ドラパルト@メガネ

(注: 各相性値は計算前に0~1の範囲に規格化してあるが、このグラフにおいては生の-1024~1024の相性値を用いて図示する。0を境にして苦手と得意が分かりやすいため)

f:id:shingaryu:20200224065943p:plain

クイタランが苦手とするローブシン(Conkeldurr)、ウオノラゴン(Dracovish)、ウォッシュロトム(Rotom-Wash)にはドラパルトが強く、

ドラパルトが苦手とするヒヒダルマ(Darmanitan)、ニンフィア(Sylveon)、バンギラス(Tyranitar)にはクイタランが強い という相性補完が成り立っていることがわかる。

クイタランは馬鹿力持ちで計算しています

 

f:id:shingaryu:20200224071628p:plain

2匹合計の相性値。たとえばナットレイ(Ferrothorn)にはとても有利で、サザンドラ(Hydreigon)にはとても不利といったような各仮想敵ごとのPTの相性を表しています。

 

~(3)(4)1, 2匹目が苦手とするポケモンに強いポケモンを2体選ぶ~

  1. 1匹目, 2匹目の合成相性ベクトルを計算する
  2. 合成ベクトルにおいて相性値が中央値1.0を下回る(苦手)な成分(仮想敵)を抽出する
  3. 1匹目の型情報を用いて候補ポケモンを絞り込む
  4. 候補ポケモンの中から順番に2匹の組み合わせを選択
  5. 選択した2匹の各相性ベクトル(→p1, p2)について、手順2で抽出した以外の成分を0に設定する
  6. |p1| |p2| |sin(θ)| を計算する
  7. 手順5で計算した値が一番大きくなるポケモン組を3, 4匹目として採用

手順5の評価式は要検討だが、1, 2匹目が苦手とする仮想敵に有効な相性値を持つという条件のほか、3, 4 匹目に選んだ2匹同士も相性補完が大きいことという条件をオリジナルで設定している。

(似通った役割を持つ2匹でも相性値合計では有利になり得るが、その場合片方の選出機会がほぼ0になり意味のない枠となってしまうため)

 

結果: ミミッキュ@珠、ヒートロトム@メガネ(※)

f:id:shingaryu:20200224071641p:plain

0以下の相性値(棒グラフで下に飛び出てる部分)がだいぶ少なくなってきた。

※2匹目のドラパルトと持ち物が被ってしまっているのでそのままではPTとして採用できませんが、ご容赦ください 

 

~(5)以上4匹が苦手とするポケモンを起点にするポケモンを1体選ぶ~

  1. 1~4匹目の合成相性ベクトルを計算する
  2. 合成ベクトルにおいて相性値が中央値2.0を下回る(苦手)な成分(仮想敵)を抽出する
  3. 候補ポケモンのうち、積み技フラグがYESであるポケモンを絞り込む
  4. 候補ポケモンの中から順番に1匹を選択
  5. 選択した1匹の相性ベクトル(→p1)について、手順2で抽出した以外の成分を0に設定する
  6. |p1| を計算する
  7. 手順5で計算した値が一番大きくなるポケモンを5匹目として採用

 

結果: パルシェン@タスキ

f:id:shingaryu:20200224074015p:plain

ドリュウズ(Excadrill)やミミッキュ(Mimikyu)の相性値が若干上向いたので、主にこの2体を起点にとる想定で選択されたポケモンだと思われる。

トリトドン(Gastrodon)に対する相性値が極端に低くなってしまった。→次の手順で解決

 

~(6)以上5匹が苦手とするポケモンをピンポイントで対策した1体を選ぶ~

  • 1~5匹目の合成相性ベクトルを計算する
  • 合成ベクトルにおいて相性値が最小値をとる(一番苦手)な成分(仮想敵)を抽出する
  • 候補ポケモンは全ポケモンを対象とする
  • 候補ポケモンの中から順番に1匹を選択
  • 選択した1匹の相性ベクトルについて、手順2で抽出した成分の相性値が一番大きくなるポケモンを6匹目として採用

結果: ラプラス@弱点保険

f:id:shingaryu:20200224074608p:plain

トリトドン(Gastrodon)の相性値が大幅に上昇した!

ヒヒダルマ(Darmanitan)やカビゴン(Snorlax)を筆頭に、逆に苦手が増えていることはあまり気にしなくていい。この6匹目はトリトドンへのピンポイント対策であり、相手PTにトリトドンが存在しない場合にはほとんど選出しない。

 

 

まとめ

この世にクイタパルトという新しい構築が生まれた

f:id:shingaryu:20200224083415p:plain