お昼のアヒル

思いついたときにいろいろ@noduckon

確定数計算に関する議論

序論

ポケモンにおける実用的なダメージ計算方法は2種類存在する。

1つ目は内部的に使用されているダメージ計算式である。以降これを厳密法と呼ぶ。厳密法は下式で示される。

 

ダメージ割合[%]={(22 × 技の威力 × 攻撃側の能力値 ÷ 防御側の能力値 ÷ 50 + 2 )×(0.85~1)}/(HPの能力値)*100

ただし、各四則演算のたびに小数点以下切り捨て。

(参考: ”データ集/ダメージ計算式”, ポケモン対戦考察まとめWiki|第七世代(サン・ムーン&ウルトラサン・ウルトラムーン), http://pokemon-wiki.net/%E3%83%87%E3%83%BC%E3%82%BF%E9%9B%86/%E3%83%80%E3%83%A1%E3%83%BC%E3%82%B8%E8%A8%88%E7%AE%97%E5%BC%8F)

 

厳密法の長所は当然厳密なダメージ計算が可能なことである。欠点は式に含まれる定数が複数あり、手計算や暗算による計算が難しいことである。さらに、持ち物や特性による補正値はかかる場所が異なるため、正しい計算を十分な準備なく行うことは難しい。よって、厳密法は主に育成時の確定数計算に利用されている。

 

2つ目は一般に火力指数・耐久指数と呼ばれる近似計算を利用した式である。以降これを近似法と呼ぶ。近似法は下式で示される。

 

ダメージの割合(%) = { [火力指数] ÷ [耐久指数] × 44 + 2 } ×(0.85~1.0)

ただし、

[火力指数]=(わざ威力)×(攻撃実値)

[耐久指数]=(HP実値)×(防御実値)

(参考: "ダメージ感覚を身につけよう!火力指数・耐久指数とは", esports runner, http://esports-runner.com/pokemon-double/indexes/)

 

近似法の長所は余計な係数を極力排したことによる計算の簡便さである。持ち物や特性に関するすべての補正値は最終的なダメージの割合の値に積算する形で加味される。一方で欠点は、近似的な計算であるために数値が大きい値になるにつれ乱数にずれが生じる(http://www.takepoke.com/entry/2016/11/27/205528より)。よって、近似法はバトル中の簡便な確定数計算、あるいは育成時の能力値決定における、膨大な仮想敵に対する指標として利用することができる。

 

厳密法はダメージ計算ツールにより非常に簡単に求めることができるようになった。一方で、膨大な数のパラメータを逐一変化させながら多数の仮想的に対する確定数を見積もるのは時間が必要になる。近似法は式さえ覚えていれば手計算でも十分な効果を期待できるが、近似によるズレの評価はまだ行われておらず、信憑性が保証されていない。

 

本議論の目的の第一は、近似法の厳密法に対するズレを評価し、その信頼性を確認することである。さらに、必要なら、厳密法よりも簡便でかつ近似法よりも信頼性の高いベターな近似法を提案することである。

 

本論

1. 近似法の誤差

1.1. 誤差の由来

厳密法の式を変形すると以下を得られる。ただし、h: HPの能力値、a: 攻撃の能力値、b: 防御の能力値、s: わざの威力とおく。

 

ダメージの割合[%]=(s×a)/(h×b)×44+200/h

 

200/Hを2と近似すると、近似法の式が得られる。

厳密法の式は計算の度に小数点以下を切り捨てているため、不可換である。このため、上記の式は計算順の変更に伴う誤差を含む。また、200/h~2の近似による誤差も含まれている。

この誤差の原因は厳密式の性質から明らかではあるが、まずイメージをつかむため、能力値に具体的な数を代入し、どのくらいの誤差が出てくるかを図示する。

第二項の誤差を無視するため、h=100を前提とする。s×aがそれぞれ2500, 10000, 22500のときの、b(=5~200)に対する"厳密式に対する近似式の相対誤差"Eを下に示す(恐縮だがグラフの体裁を整えるのが面倒だったので適当になっている)。

 

f:id:AhiruIyama:20170727012007p:plain

(s×a=2500)

 

f:id:AhiruIyama:20170727012022p:plain

(s×a=10000)

 

f:id:AhiruIyama:20170727012125p:plain

(s×a=22500)

 

上図を見てわかるとおり、特徴的な形状を示している。特にs×a=10000の時などはb=150付近で不思議なふるまいをしている。

厳密式は切り捨て計算をしているため、当然ながら床関数としてふるまう。従って相対誤差は右上がりな鋸刃状の関数となる。bが小さければs×aは"細かく切り刻まれる"ため、顕著な鋸刃型は見られないが、bが大きくなる、あるいはs×aが小さい場合は、切り捨て部分b-Δが大きくなり影響が大となる。

厳密式に立ち返って考えると、"÷ 防御側の能力値 ÷ 50 "の部分の簡便化が大きな誤差を生む原因となっていることがわかる。

 

さて、ここまでは理屈の話である。s×aとbの値によって誤差が大きくなることはわかるが、それぞれの値の範囲には限界がある上、確定数を議論する上で考慮しなくていい組み合わせも存在する。200/h~2の近似の話と併せて、この誤差が実用上どこまで大きくなるか、小さくなるかを議論しなければならない。

 

1.2. 実用上の誤差

まず、200/h~2の近似について考察する。

HPの最大はハピナスの362、最少はツボツボの127である(実際の最少は実用レベルでヌケニンの1、非実用レベルでディグダの117だが、これらは確定数の議論に登場しないので無視する)。このため200/hの値は0.552~1.57で分布する。つまり、近似値のズレは0~1.45%の間でダメージ割合に影響する。

 

次に、計算順の誤差について考察する。

以下、議論の簡便のために、持ち物や特性、性格、タイプ相性による補正は一切無視する。

確定2発を満たすs×aおよびbの組み合わせで、相対誤差の値がどのように変化するかを考える。切り捨て計算の関係上、パラメータの各組合せのうち確定2発(=50%)に最も近い値を抽出し、b(=80~200, 刻み値5)およびs×a(=7200~28800, 刻み値5)に対するEをそれぞれ下図に示す。ただし簡便のためh=100とする。

 

f:id:AhiruIyama:20170727021601p:plain

f:id:AhiruIyama:20170727021530p:plain

 

上図より、パラメータによる誤差のばらけ方が大きく、一定の関係性を見出すことはできない。しかし、今回検証した範囲内では、誤差は2%程度に抑えられており、近似法は厳密法に対してよい精度でふるまうということがわかった。

 

1.3. よりより近似法

前述の結果により、近似法は現在の形で実用的に十分な制度を持つことがわかった。一方で、切り捨て計算の計算順や定数の簡便化により、どうしても排除しきれない誤差が残ることもわかった。

近似法の改善方法として、200/hの近似の変更が考えられる。ほとんどのポケモンはHP種族値60~120程度、つまり167~227に収まっている。これを200/hに代入すると0.881~1.198となる。よって、200/hの近似値を2ではなく1とすることで、ほとんどのポケモンにおいて200/h項による誤差の影響を0.1%程度に抑えることができる。

計算順による誤差は、s×aおよびbの値の変化に複雑に影響され、すべての値に共通な誤差の低減は難しい。しかしながら、s×aおよびbの値の大きさに対する誤差の傾向は現れており、s×aおよびbを変数とする係数の何らかの導入によってある程度の低減が可能であろう。

 

結論

近似法における200/h項の近似を1に変えることで、誤差の低減が可能であるということを提案した。また、計算順による誤差への影響を検証した。

類似な研究が検索しても出てこなかったので、より楽な育成活動のために、先駆けとして簡単な議論を行った。簡単であるせいで、多数の課題を残している。

まず第一に補正値を一切考慮していないため、実用レベルの指数よりもかなり低い値での誤差の見積もりとなった。性格やタイプによる補正は道具などの補正に比べて楽に考慮できるはずなので、のちの議論で拡張していきたい。

第二に、この手の議論についてあまり知識がないので、数値的かつ曖昧な手法での議論が主になってしまった。切り捨て計算に関する数学的な取り扱いはもっと踏み込めると思うので、さらに理論的な見地から考察したい。また、数値的な手法についても、あまり勝手がわかっていなかったので、さらに深化して取り組みたい。