エルトナにつきのひかり

みずとほのおはサイクルを彩る?

【剣盾おみくじバトル】ゆびをふるシミュレーション

概要

ブログが動いていない通りまったくポケモンをしていませんでしたが、久しぶりに変なことができそうだったので参加してみました。

多様的な環境が好きなのですが、このルールを調べたところどうにも強いポケモンを跳ね返せるポケモンがいなそうであったので、アイテムや配分で多様的な構築を作れたらいいなと思いました。そこで、プログラムを書いて戦わせて最適配分を見つければミラーが有利になるのではないか?という発想から今回のパーティを作っています。

最適配分を計算しただけではフレンド対戦をしているプレイヤーに負けてしまうことが容易に想像ついたので、選出と交代の補助も機械に行ってもらうことにしました。まあ、普通のルールですらプレミが多かったプレイヤーがポケモンをやめていて、久しぶりに対戦しているのですからプレミはこれでも減らなかったのですけれども。

配分生成

bit演算の考え方を使いました。組み合わせ問題を解くのに使うことが多いもので、努力値もまず振る場所を決めることで組み合わせ問題に見立てることができます。
2^6通りをそれぞれbitで考えます。0ならば0b000000、63ならば0b111111です。

それぞれの桁をhabcdsと対応させ、1ならばその箇所に努力値を振り、0ならば努力値を振らないとします。具体的には、任意のbit(0b000000~0b111111)を1桁ずつ落としていき、0b1(0b000001)の論理積と0b1が一致するかどうかでそれぞれの桁が1かどうか調べています。
例:i=7のとき
10進法の7はbitでは0b000111となります。
0b000111と0b000001の論理積は0b000001です。
0b000001と0b000001を比較し、一致している場合は努力値を振ります。

次に桁を落とします。やってることはシフト演算で、0b000111は0b000011となります。この0b000011と0b000001の論理積を取って…という繰り返しです。

これが合計6回繰り返されるので、hpから順に振るか振らないかの処理を作ることができます。


次に努力値の具体的な振り分けです。
bit演算でhabに振ると決めたとしても、252,252,4がいいのか252,4,252がいいのか、あるいはカビゴンだったら164,92,252とかの方がもっといいのかもしれません。
そのため、努力値の振り分けは重複組み合わせの考え方を用いて全通り試しました。

異なるものをn、取ってくる数をrとしたとき、総数は(n+r-1)!/(n-1)!r!=n+r-1Crとなるあれです。しかしながら、努力値は合計の508以外にも1箇所に252という上限が設定されているため、このままでは500,4,4といった振り方を許容してしまいます。そこで、2箇所に振られる努力値が最低でも256、最大で504となるようにループを作りました。

戦闘

こうして作った配分を事前に準備したポケモンの種族データと組み合わせて、実際にポケモンを育成した状態を作ります。配分パターンがS下降補正性格のみで10000通りくらいあるので、様々なアイテムを持たせて1種族あたり50000通りくらいの育成が完了したことになります。そして、50000通りをいろいろな種族と対戦させてみたり、計算機抜きに経験や直観的に強いと思ったポケモンと戦わせてみたりしました。

戦闘ルールは以下になります。

・1vs1
・補助技なし、追加効果なし
・TOD16ターン
・特性、アイテムあり(特性別、アイテム別勝率なども出せる)
のろわれボディ、プレッシャーは1vs1だと強すぎてしまうので仕様を少し変えました。

上記2つは時間と体力の都合です。そもそも作るのがすごく大変だったのと帰省などで作れない日もあり、最後の方は時間に追われて疲れてしまいました。

特に書いていませんでしたが、50000通りにはCSヨノワールといった無駄な配分が大量に含まれているので、変な学習をしないように手動で型を入力できる仕組みも作っていました。そういったわけで、基本的には50000通りの配分を自分が調べたりなんとなく環境的にいそうだと思ったりした10種族100通り程度の型と対戦させていました。マッチング回数が多い相手に強い方がいいので重み付けもしていましたが、被選出率が分からない以上この重み付けはただの直観でしかありません。実際にはあまりカビゴンと戦わなかったので、この重み付けはきっと間違えていたのでしょう。。。


計算結果は以下のリンク先のように出力されます。
mistlein.hatenablog.com

が、直前に途中の計算式が壊れていることが判明しました。結果として、大会開始残り12時間前に構築を6匹育成し直すことになりました。対戦に参加できたのが初日の夜遅くからであったのはすごく残念です。

パーティ

全種族の勝率をアイテムと合わせて出力し、勝率順に上からアイテムが被らないように選びました。

以下の6匹は勝率順で、たべのこしカビゴンが今回のシミュレーションで最も高い勝率となっています。勝率2位はたべのこしヨノワールでしたが、たべのこしはもうないのでその次のアッキのみオーロンゲを採用といった感じです。

そして機械的に3箇所に振り分けたらいちばん勝率に作用してないと思われる箇所をひとつ落として、s以外の残り2箇所に振って合計実数値を上げました。

カビゴン,164,92,244,4,4,0,ゆうかん,たべのこし
オーロンゲ,180,4,196,4,124,0,ゆうかん,アッキのみ
ノワール,220,236,4,44,4,0,ゆうかん,こだわりハチマキ
ゲンガー,244,4,204,4,52,0,のんき,くろいヘドロ
ピクシー,252,4,236,12,4,0,のんき,ゴツゴツメット
トゲキッス,228,172,4,100,4,0,れいせい,ピントレンズ

面白いのはハチマキヨノワールはcに振った方が、ゲンガーはdに振った方が期待勝率がよくなるところでしょうか。アイテムが余っていなくて出す気がなかったですが、トゲキッスも攻撃系アイテムを持つならac振りがいいみたいです。

とはいえ割と人間らしい配分になるのが面白いですね。わざわざ作ったのに思いのほか普通の結果になってしまってあんまり面白くないとも言えます。いや、むしろポケモンが上手い人たちの感覚は優れすぎてるとかいう話なのかもしれません。みんな強すぎです。

期待勝率

以下のように、自分のパーティが相手のパーティに対して1vs1ならばどの程度の確率で対面勝利できるのか計算できるようにもしてみました。

条件付き期待勝率

サイクルを行うなかでお互いのhpが削れた状態の対面勝率が知りたかったので、現在のhpと能力ランクを入力して勝率を計算できるものも作りました。
TODが頻発するこのルールにおいて、このターンの生存率も大切だと思ったので瀕死になってしまう確率も併せて計算しています。

戦績

最高地点 20-3 1734

公式大会は3日間で順位を決めますが、2日目の12位が最高地点でした。3日目はぼこぼこすぎて悲しくなりましたね…

原因

・あたまがわるくてプレミが多いです
・そもそも1vs1のゲームではなく3vs3なので交代されるだけで破綻している気がします
・シミュレーションのプレッシャーとのろわれボディの仕様が微妙だったかもです
・交代をあまりしない構築になってしまったので、こちらのゆびをふる回数が多く自殺率が非常に高かったです(だいばくはつなど自分が瀕死になる行動が合計14回)
・たぶんちょっとだけ運もわるかったと思います。どんまいです。。。


読んでいただきありがとうございました。こういうのをちゃんと作れたら楽しいんだろうなーと思いましたが無理なので、さっさとダブルバトルに帰りたいと思います。