2018/02/13
霧氷の渾身: 効果量の検証
グラブルの検証記事です。
2016/11/24の更新で効果量が引き下げられてからというものの、1年以上経った今も正確な計算式が分かっていなかった渾身スキル。その挙動を精査した結果、効果量の正確な計算式を得ることに成功しました。
2018/02/13
グラブルの検証記事です。
2016/11/24の更新で効果量が引き下げられてからというものの、1年以上経った今も正確な計算式が分かっていなかった渾身スキル。その挙動を精査した結果、効果量の正確な計算式を得ることに成功しました。
今までなされていた検証の中で恐らく最も網羅的だったのは、(元祖)攻撃力計算機の日比野さんによるものでした。
(一連のツイートへのリンク: その1、その2、その3、その4、その5)
また、へかてさんもSLv.15の際の効果量をそれなりの精度で求めています。フィンブルではなく、エデンのスキル「雷電の渾身」については、すんどめ侍さんによるSLv.15の効果量の検証結果がGameWithの方に載せられています。
各種計算機の対応としては、元カレ計算機のほしみさんが渾身に関する記事を公開しています。また、グラブル装備シミュレータ(グラメモ)さんは計算式を特に公開していませんが、ソースコードを読んだ限りでは、SLvに対して線形、HP割合の3次関数ではあるものの元カレ計算機さんとはまた異なる係数の計算式を用いているようです。
このあたりの検証結果を見ると、現状では「HP割合の3次関数がよくフィットするが係数が汚くてよく分からない」(少なくとも背水の計算式で用いられている2次関数ではダメ)と言うのがせいぜいといったところです。スキルレベルに関しては、日比野さんの検証以外ではほぼ調べられておらず、SLv最大以外は正直どうでも良いという需要がよく伝わってきます。
計算式が変わって1年以上も経つにも関わらず、未だに計算式がよく分かっていないというのは個人的に実に気持ち悪いので、ケルフェン討滅戦の復刻にあわせてフィンブルのスキル「霧氷の渾身」に関するデータを集めてみました。
先に結論から書いてしまうと、霧氷の渾身の効果量は以下の計算式に従うことが分かりました。
スキルレベルを s (1 ≦ s ≦ 15), 残りHP割合を r (25 ≦ r ≦ 100 [%]) とおく。このとき、
効果量 = {r / (56.4 - s)}2.9 + 2.1 [%].
(注: HPが25%未満の場合、効果量は一律で0%になります)
まずはグラブルのダメージ計算式を見ていく前に、より簡単なモデルを考えてみましょう。ダメージが次の計算式で定まるものとします:
ダメージ = ceil(攻撃力 × 補正値)
ここで、ceil(x) は x の切り上げを表す関数(天井関数)です。つまり、ceil(129.3) = 130 のようになります。さて、攻撃力1000でダメージ1500が出たとします。このときの補正値はいくつでしょうか?
答えは1.5として良いでしょうか? いや、正確には良くありません。例えば補正値が1.4995のときも、攻撃力×補正値は1499.5となってこれを切り上げるとちゃんと1500になりますから、これも正しい答えです。このため、実は次の補正値の範囲しか分かっていなかったのです:
1.499 < 補正値 ≦ 1.5
やや意地悪な問題ではありましたが、(切り上げ/切り捨てが絡む場合は)観測されたダメージからは補正値の「範囲」しか逆算できないという点を意識しておくことが大事です。このことを踏まえて、グラメモさんによるグラブルのダメージ計算式(の大枠)を見てみましょう:
ダメージ = ceil(ceil(表示攻撃力 / 10) × 各種補正値 × 乱数)
今回求めたいのは「各種補正値」の中に含まれている渾身の補正値です。乱数の最大値・最小値さえ引いてしまえば観測されたダメージから乱数は簡単に逆算できるので、あとはデータを集めて補正値の範囲を地道に狭めていくだけです。
検証データを以下のスプレッドシートに公開しました。
次の条件における霧氷の渾身の効果量を、(%表記で)小数第5位までほぼ確定させています。
スキルレベルを s (1 ≦ s ≦ 15), 残りHP割合を r (25 ≦ r ≦ 100 [%]) とおいたとき、何らかの関数 f, g と定数 c を用いて、
効果量 = f(s) × g(r) + c [%]
として効果量が計算できるものと仮定します。このように仮定すると、検証データを矛盾なく説明できるような定数 c の範囲は以下に限られることが分かりました:
2.0999988 < c < 2.1000021 [%]
このことから、c = 2.1 [%] として確定してしまって良いでしょう。2.1%という比較的キリの良い数値が得られたことで、計算式モデルの正しさも間接的に示していると言えると思います。(つまり、ある関数 h を使って h(s × r) のように表される項などは無いものとして良い)
なぜ2.1%か? についてですが、挙動が謎な関数 f, g を作った上で、SLv.15, HP100%の条件で掛け合わせてみたら約12.9%になったので、とりあえず2.1%を足して効果量が約15%になるように調整したというのが実状ではないかと個人的には疑っています……。
ゲタが2.1%に確定して計算式モデルが固まったので、ここからは関数 f(s), g(r) の特定を目指していきます。まずはスキルレベルに依存する部分、f(s) の考察をしていきましょう。
HP割合を固定して g(r) の部分を定数としてしまえば、f(s) の考察が行いやすくなります。HPを100%に固定して、各スキルレベルの効果量を実際に検証したところ、以下のグラフが得られました。
下に凸で滑らかな単調増加関数です。多くのスキルはSLv.10を境に効果量の増加が緩やかになりますが、霧氷の渾身に関しては計算式が途中で変わっているようには見受けられません。
それではこの関数の正体を暴いていきましょう。関数の挙動をつかむにはやはり微分が強力なツールとなります。例えば、関数がn次の多項式であればn階微分が定数となるので、定数になるまで微分を繰り返すことで多項式の次数を知ることができます。正確には、今回計算できるのはn階微分ではなくn階差分ですが、n次の多項式であればn階差分が定数となるのは同じです。
ところが……、計算してみて分かったのは5階差分が定数にならないということでした(6階差分は誤差が累積してしまって定数かどうかが判定不能)。つまり、 f(s) は5次以下の多項式では表現できないということになります。だからと言って、それなら6次式で近似すれば良いよねと言うのではあまりに芸がありません。あくまで目標は f(s) の正体を暴くことです。
1階差分~5階差分までがすべて正の値を取る単調増加関数であったことから、まず思い浮かんだのは指数関数でした。ところが、もう少し関数の挙動を詳しく調べてみると漸近的には指数関数より発散が早いことが判明。指数関数より発散の早い関数って何だ……? exp(x2)? xのx乗? あるいは階乗を実数に拡張したガンマ関数? 残念ながらどれもフィッティングが上手くいきません。
そういえば単純な関数を忘れていました ― 分数関数です。分母を何乗かしてみて一番 “惜しい” 挙動をしていたのが、分母を3乗してフィッティングを行った場合でした:
効果量 ≈ 992687.7 / (57.61193 - s)3 + 2.173087 [%]
あと少しな気がするけど微妙に合わない、でもまあ悪くない近似にはなってるのでこれでも良いかな……とも思ったのですが、気になった点が一つ。「ゲタの2.173087が2.1になるように指数の方を調整してみたらどうなるんだろう」。そこでゲタを2.1%に固定し、指数を変数にしてフィッティングしてみた結果、ほぼちょうど2.9という指数が出現!! 定数を調整して、検証データの範囲内に完全に収まる計算式を得ることができました:
HP100%での効果量 = 630957.34 / (56.4 - s)2.9 + 2.1 [%]
ということで、スキルレベルに依存する関数 f(s) は以下のようになります:
f(s) = (56.4 - s)-2.9
それにしてもCygamesさん、2.9乗の分数関数はいくらなんでも検証勢に対してちょっと辛くないですか……?
スキルレベルに依存する部分 f(s) が判明したので、HP割合に依存する g(r) の方の考察を進めましょう。SLv.1, SLv.5, SLv.10, SLv.12, SLv.15における効果量を実際に測った結果が以下のグラフです。
特にSLv.15の場合に関してはそこそこ検証がなされており、3次式でそれなりに近似できることが分かっています。それでは g(r) は3次式なのでしょうか。例によって3階差分を計算して確認してみたところ、残念ながら定数ではなく、g(r) は3次式では表現できない関数であることが分かりました。
さらに言うと、5階差分まで定数でないことが確認できたため g(r) は5次以下の多項式では表現できません。しかし、3階差分と4階差分を見比べてみると4階差分は急に小さくなっており、何となく “3次式っぽい” 関数ではあることが見て取れます。……あれ? そう言えばさっき2.9乗関数とかいう変な関数が出てきていたような?
ところで先ほどのHP100%での効果量の計算式に現れていた630957.34という定数、計算してみたところ100の2.9乗でした。ということで、ここまでくれば答え合わせは簡単です:
g(r) = r2.9
(r には%表記でのHP割合が入る: HP100%なら r = 100 とする)
分かってしまえば何てことはない、ただHP割合を2.9乗するだけです。本当にこれだけなんですが、優秀な検証勢をもってしても1年以上分からなかった計算式が暴けたというのは正直かなり嬉しいです。
ということで、2016/11/24の更新から今まで正確な計算式が分かっていなかった霧氷の渾身の検証を行い、その計算式を暴くことを試みました。その結果得られた計算式は、比較的簡単なパラメータによって成り立っている上に、小数第5~6位の精度を持つ検証データの範囲内にも完璧に収まっており、実際の実装と一致しているものと見て問題ないでしょう。
霧氷の渾身以外の渾身スキルについては分かりませんが、雷電の渾身については、すんどめ侍さんの検証結果を見る限りでは計算式中の56.4の部分が65.0に変化しているものと思われます。つまり、渾身中SLv15 = 渾身大SLv6.4相当ということになります。
(追記: 無垢武器・オメガ武器のガフスキー【強壮】によって付与されるスキルは、ゆずだいだいさんの検証を見る限りでは定数が53.7に変化していそうです: 強壮SLv10 = 渾身大SLv12.7相当)
それにしても2.9乗関数……、どういう経緯で2.9乗という設定になったのかが知りたいところです。
Author:ばいなり
主にゲームなどの趣味に関する記事を書いていこうと思います。
コメント
No title
で、文系的な発想ですが2.9乗っていうのはもしかしたら開発者からのメッセージなのかもしれないですね。
「バランス的にもいいので3乗じゃなくて2.9乗にしたけどいつかだれか解析してくれるよね、解いてくれるよね?」って感じで。
2018/02/13 22:37 by URL 編集
Re: No title
実際、指数を変数とした計算式モデルでフィッティングを行えば、すぐに2.9乗という値は出てきます。言ってしまえばこの記事はそのモデルを思い至るまでの過程を書いたものですが、分かってしまえば簡単なことも(これまでの検証に関わった方を含めて)なかなか思い付かないものですね。
2018/02/15 00:01 by ばいなり URL 編集
2018/02/17 18:05 by URL 編集