我是来算数学的不是来玩游戏的 (?)
伤害低了我只会建议你看我的文
小弟对于游戏里的数值公式计算一直很有兴趣,
刚好最近板上有不少人 PvP 关心攻击属性该如何取捨的问题,
在此分享一下我个人的研究心得。
本文将採用拉格朗日乘数 (Lagrange Multiplier) 的数学方法,
分析在不同配额 (即可分配的攻击属性点数) 下
攻击力、暴击率及暴击机率的最佳分配比例,
并辅以 Python 程式验证之。
另外,本文会解释「边际成长率」(Marginal Growth Rate) 的概念,
(即「为什幺大佬们常常说攻击力稀释效应很严重?」)
并示範如何藉此分析在已有属性下最佳的属性选择。
因为使用的方法牵涉到微积分的基本概念,
为了让更多人可以了解数学公式背后的意义,
我会尽量用简单的文字说明,(「尽量」)
对数学推导没有兴趣的巴友则可以直接下拉到懒人包跟结论,
对于高品质圣遗物数量较多且套装完整的玩家,
本篇心得分享可能不那幺有用;(警语)
毕竟对于毕业级的主 C 而言,
最佳的点数分配方法就是:
1. 优势属性伤害加成优先出
2. 想办法出到攻击力 212.1%、暴击率 70.7%、暴击伤害 141.4%
3. 剩下的多余点数平均分配
相对于简单直观的主 C,
副 C、辅助要先考虑元素充能效率、元素精通等等;
如何在配额已经被限缩的情况下,
还能尽量提高自身的伤害效益,
反而会是本文比较着重的面向。
开始前容我再最后碎碎念一句:
玩游戏是要让自己开心的,
如果你高兴,
想出 100% 暴击率、50% 暴击伤害也可以,
没有必要因为这样就彼此恶言相向。
但如果你觉得出装还可以更好,
想追求更高的伤害效益,
希望本篇文章可以成为一点帮助。
本米只是一条鹹鱼,对游戏理解尚浅,
数学推导、游戏环境考虑不周的地方,
欢迎各方好手批评指教。
懒人包
(这已经是我想得到在不失真的条件下最清楚的表达方式了,
如果还是太难,敬请见谅。我尽力了_(:3」∠)_)
最简单 (但不精确的) 版本:
优势属伤杯有就出。
攻击力先出到超过基础值的两倍。(绿字略大于白字) 但尽量不要超过三倍。
如果有办法双暴超过 (40%, 80%) 才叠双暴,不然全出攻击力。
优势属性伤害加成优先出,但是不建议超过 +200% - (1/优势伤害占总伤害的比例)。
举例而言,对纯元素伤害输出而言不建议超过 +100%,
对 6 比 4 的元素、物理混伤输出而言不建议超过 +200% - 1/0.6 = +33.3%。
(但是一件属伤杯就会超过,这个时候出一件就够了。)
剩下三项数值 (攻击力、暴击率、暴击伤害) 的最佳分配方法,有以下两种方法判断。
设总攻击力百分比 ((白字 + 绿字)/白字) 为 x
总暴击率为 y
总暴击伤害为 z
并令配额函数 g(x, y, z) = x/3 + y/2 + z/4 = c
(计算的时候请不要计较加成的来源是什幺、基础值是多少。角色面板写多少就是多少。
如果白字、绿字分别是 600 跟 800,那幺你的 x 就是 (600 + 800)/600 = 2.33... ≒ 233.3%)
一、 以边际成长法计算最后一件圣遗物应该补充什幺属性
在核心武器、圣遗物已经决定好了的情况下,
计算以下三项数值:
Gx = 3 / x (出攻击力的边际成长率)
Gy = 2 z / (1 + y z) (出暴击率的边际成长率)
Gz = 4 y / (1 + y z) (出暴击伤害的边际成长率)
哪个高就出哪个属性。
例如 x = 200%,y = 30%、z = 100%,最后一件理之冠可选择攻击力、暴击率或暴击伤害
计算得:
Gx = 3 / 2.0 ≒ 1.5
Gy = 2 × 1.0 / (1 + 0.3 × 1.0) ≒ 1.538
Gz = 4 × 0.3 / (1 + 0.3 × 1.0) ≒ 0.923
最后一件选择暴率头最佳。
※此法不适用于连续的属性选择 (亦即有两或三种以上的武器、圣遗物属性加成可供选择);
如需做多次选择,请参考第二项。
二、以拉格朗日乘数计算各配额下的最佳调配
1. 若无法在 y > 51.6%、z > 103.3% 的情况下达到 x > 222.7%
假设暴击率小于暴击伤害的一半
(1) 在 x 达到 1.5 × (1/z + y) 之前一律叠高攻击力。
(2) 前项达标后,按 3 : 2 的比例叠高攻击力及暴击率。
若暴击伤害未达暴击率的两倍
(1) 在 x 达到 0.75 × (1/y + z) 之前一律叠高攻击力。
(2) 前项达标后,按 3 : 4 的比例叠高攻击力及暴击伤害。
当 y 与 z 的比例接近 1 : 2,按 1 : 2 的比例叠高暴击率及暴击伤害并接上第 2 点。
2. 若第 1 点的条件可以满足
(1) 在 y 达到 70.7% (或 z 达到 141.4%) 之前,
按 1 : 2 的比例叠高暴击率及暴击伤害到 70.7%、141.4%;
此阶段可以牺牲部分攻击力换取暴击属性 (但仍不应小于 212.1%)。
(2) 若 (x, y, z) 达到 (212.1%, 70.7%, 141.4%),
则平均分配三项属性 (双暴一样是 1 : 2) 到 (225%, 100%, 200%)。
3. 若 y 达到 100% 还有剩余配额,按 3 : 4 的比例继续叠攻击力及暴击伤害。(虽然应该不可能...)
(最佳化的三项数值对于配额的函数图。)
配额 c |
攻击力 x |
暴击率 y |
暴击伤害 z |
伤害期望值 f |
1.0 |
255% |
5% |
50% |
2.6138 |
1.175 |
307.5% |
5% |
50% |
3.1519 |
1.25864- |
320.0% |
13.4% |
50% |
3.4143 |
1.25864+ |
222.7% |
51.6% |
103.2% |
3.4143 |
1.41421 |
212.1% |
70.7% |
141.4% |
4.2426 |
1.75 |
225% |
100% |
200% |
6.75 |
2.0 |
262.5% |
100% |
250% |
9.1875 |
(
重要转折点及其最佳参数对照表。)
如果你按照上述的建议去搭配,
最后有两或三套以上的出装 (指武器加圣遗物组合) 可以选择,
那幺接着计算输出分数:
DS = 面板攻击力 × (1 + 暴击率 × 暴击伤害) × (1 + 属性伤害加成 + 普攻伤害加成 + ...)
哪一套高就选哪一套。
前言
游戏里的伤害类型有很多种,普通攻击、物理伤害、元素战技、元素反应...
各种伤害类型都有各自的伤害计算公式,
然而除了超载、感电、超导跟扩散反应外,
其余所有的伤害类型都会受到攻击力、暴击率以及暴击伤害的加成。
(就连锅巴、奥兹都会暴击)
也因此如何将这三项数值做最有效的分配,
就成了伤害能否最佳化的重要议题。
对于这些伤害类型,可以写出一般化的伤害公式:
伤害期望值 = [基础攻击力 × (1 + 百分比攻击力) + 固定攻击力]
× (1 + 暴击率×暴击伤害) × 伤害倍率
× (1 + 元素精通加成 + 反应伤害增强)
× (1 + 有的没有的属性伤害加成、普攻伤害加成、技能增伤...)
若将基础攻击力跟伤害倍率提出来,用数学式表达为:
f(x, y, z, EM, RA, wi) = x (1 + y z) (1 + EM + RA) (1 + w1 + w2 + ...)
其中 x 为总攻击力百分比 ((白字 + 绿字)/白字)
y 为总暴击率
z 为总暴击伤害
EM、RA 分别为元素精通加成与反应伤害增强
wi 为各种属性伤害加成
若再简化只取攻击力、暴击率以及暴击伤害的项,我们定义伤害期望值函数 f:
f(x, y, z) = x (1 + y z)
这就是我们希望最大化的数值。
然而角色能够分配到攻击属性的配额有限,
也没有办法完美控制圣遗物副词条的数值,
故我们应该考虑在「限制条件」下最大化伤害函数的方法。
圣遗物主属性所提供的攻击力、暴击率、暴击伤害数值
是 3 : 2 : 4 (同样的星数、强化等级下),
副词条虽然变数较大,但也大致上依循这个比例。
假如你选了 45% 的攻击头、就会牺牲 30% 的暴击率;
你得到了 20% 的暴击伤害,就要失去 15% 的攻击力。
(没有办法我全都要.jpg)
这就是迈向更高的伤害期望值时需要做的取捨。
我们可以定义配额函数 g:
g(x, y, z) = x/3 + y/2 + z/4 = c
在相同的圣遗物品质、数量之下,
你所能运用的配额 c 就是大致相等的。
另外,总攻击力百分比不会低于 100% (即攻击力不会低于基础攻击力),
暴击率不会低于 5%,暴击伤害不会低于 50%,
(如果你核心装备有相关属性的话下限值就会更高)
是参数组 (x, y, z) 的先决条件。
对于最佳化问题,微分为零求极值是最常见的方法,
而在限制条件下的版本就是拉格朗日乘数。
本文接下来就会从边际收益的概念出发
解释拉格朗日乘数的核心精神,
并以此计算出在各种限制条件之下伤害期望值的最佳解。
还有一种称为 Karush-Kuhn-Tucker 条件的方法,
专门处理等式、不等式限制条件混和的最佳化问题,
但是此法通常没有解析解,
就算有我也不会解_(:3」∠)_,
而且往往难以从结果了解它的数学意义,
所以本文会用它的一般版拉格朗日乘数,
搭配额外加入的不等式条件来作解析。
数学方法
首先我们来谈谈何谓「边际收益」(Marginal Revenue)。
在经济学的领域中,
边际收益代表着在既定的生产组合之下,
每多生产 (销售) 一单位的产品,所能得到的收益量。
当生产的产品越来越多,
所能收穫的利益就会越来越少,
同时所要付出的成本也会越来越高,
称为「边际收益递减」与「边际成本递增」。
当边际成本开始超过边际收益,
继续生产 (销售) 产品的净利反而会减少,
这时候的总销售利润就是最大值。
套到伤害计算公式上面来说,
每多分配一点配额到某个属性上,
(如:3% 的攻击力、2% 的暴击率、4%的暴击伤害或任意组合)
伤害期望值函数一样会有对应的提升,
就是伤害期望值的边际收益。
我们将 f(x, y, z) 对参数组 (x, y, z) 做全微分,可得:
df = (∂f/∂x) dx + (∂f/∂y) dy + (∂f/∂z) dz = fx dx + fy dy + fz dz
且因 1 点配额可以换得 3 点的攻击力,或 2 点的暴击率,或 4 点的暴击伤害,
故我们可以得到叠三种属性的边际收益为:
Mx = df/dc (y, z 不变) = 3 fx = 3 (1 + y z) (出攻击力的边际收益)
My = df/dc (x, z 不变) = 2 fy = 2 x z (出暴击率的边际收益)
Mz = df/dc (x, y 不变) = 4 fz = 4 x y (出暴击伤害的边际收益)
举例试算,假设 x = 200%、y = 5%、z = 50%:
Mx = 3 × (1 + 0.05 × 0.5) = 3.075
My = 2 × 2.0 × 0.5 = 2.0
Mz = 4 × 2.0 × 0.05 = 0.4
而当攻击力来到 300%,其他两项不变:
Mx = 3 × (1 + 0.05 × 0.5) = 3.075
My = 2 × 3.0 × 0.5 = 3.0
Mz = 4 × 3.0 × 0.05 = 0.6
我们可以看到,当我们只叠攻击力,边际收益并不会因此下降,
但是出其他属性的边际收益会渐渐超过出攻击力的边际收益,
此时出其他属性的效益就会比只出攻击力还要好。
至于大佬们常说的「攻击力稀释」又是怎幺回事?
如果我们把边际收益除以伤害期望值函数,我们可以得到边际成长率 (Marginal Growth Rate):
Gx = 3 / x (出攻击力的边际成长率)
Gy = 2 z / (1 + y z) (出暴击率的边际成长率)
Gz = 4 y / (1 + y z) (出暴击伤害的边际成长率)
这个数字代表着每多分配一点配额,
伤害期望值会成长为原本的多少比例。
当 x = 200%,Gx = 1.5;
当 x = 300%,Gx = 1.0。
从这里我们就可以看出,在单一数值较低的时候,
同样的点数可以带来较大的比例成长,
但越往上叠,成长率就越低,
这个时候出其他数值的成长效果就会越好,
这就是「属性稀释效应」。
照着同样的逻辑,不只是攻击力,
任何属性的成长率都会随着该属性的单调增加而减少;
(包括属性伤害加成、普攻伤害加成、增伤效果...)
这也是为什幺大佬们都会建议你平均分配属性的原因。
从这里我们也可以看出为什幺建议暴击率跟暴击伤害要是 1 : 2。
如果参数组 (x, y, z) 是一个最佳组合,
那幺我们应该要得到 Gx = Gy = Gz。
(否则就会有出其中一种属性优于另外两种的状况,
代表还没有达成最佳解)
解 2 z / (1 + y z) = 4 y / (1 + y z)
得 z = 2 y
用白话文说就是,
虽然 y = z 是 y z 的最佳解,
但是 y 比 z 贵一倍,
所以 z = 2 y 才是在该问题限制条件下的最佳解。
在实务上,只要根据你当下的参数,
计算出各属性的边际成长率 G,
就可以找出当下最佳该出的属性是什幺。
这就是懒人包里提到的「边际成长法」。
但是请注意,如果你有很多个武器效果、圣遗物可供选择,
边际成长法并不能保证连续选择下的结果会是最佳的结果;
(也就是说,每一次根据边际成长率来做的最佳选择合在一起并不一定是最佳的)
如果要处理这种情况,就要参考接下来要介绍的拉格朗日乘数。
拉格朗日乘数 (Lagrange Multiplier) 告诉我们,
如果我想知道目标函数 f(x) 的最大值,
但是参数组 x 必须满足某种限制条件 g(x) = 0,
(g(x) = c 的形式也可以,令 h(x) = g(x) - c = 0 就好,
不影响结果,以下不再赘述。)
那幺我可以创造一个新的拉格朗日函数 L:
L(x, λ) = f(x) - λ g(x)
这个新函数的极大值问题就会包含原函数的极大值问题;
换句话说就是设 L 对参数组 x 跟 λ 微分为零求极值。
「微分为零求极值」是我们在学微积分时一定会碰到的例题,
基本的精神就是「如果一个函数的值在某点附近不再增减,
那幺该函数在该点有极大值或极小值」。
(更严格来说,该点还必须不是「反曲点」)
但是如果我的参数本身受到某种限制,该怎幺处理?
拉格朗日乘数的精神就是:
「如果一个函数在符合限制条件下的某一点附近不再增减,
那幺该函数在该点有极大值或极小值」。
这相当于我要求在 g(x, y, z) = 0 的条件下
df = (∂f/∂x) dx + (∂f/∂y) dy + (∂f/∂z) dz = 0
在 c 不变的限制条件下,
dg = (∂g/∂x) dx + (∂g/∂y) dy + (∂g/∂z) dz = dc = 0
显然 fx : fy : fz = gx : gy : gz 是一个解,
( df = fx dx + fy dy + fz dz = λ gx dx + λ gy dy + λ gz dz
= λ (gx dx + gy dy + gz dz) = λ dc = 0 )
故我们得到:
(∂f/∂x) - λ (∂g/∂x) = 0
(∂f/∂y) - λ (∂g/∂y) = 0
(∂f/∂z) - λ (∂g/∂z) = 0
等价于:
∂L/∂x = (∂f/∂x) - λ (∂g/∂x) = 0
∂L/∂y = (∂f/∂y) - λ (∂g/∂y) = 0
∂L/∂z = (∂f/∂z) - λ (∂g/∂z) = 0
∂L/∂λ = g = 0
这就是拉格朗日乘数最简单直观的证明。
套用到我们关注的问题,
我们得到最佳化 (x, y, z) 的条件是
fx : fy : fz = 1/3 : 1/2 : 1/4
但这相当于
3 fx = 2 fy = 4 fz
也就是
Mx = My = Mz 或是 Gx = Gy = Gz
这可以与边际成长法中求最佳解的条件互相印证。
然而在我们关注的问题中,
还有 x ≧ 100%、5% ≦ y ≦ 100%、z ≧ 50% 的不等式条件存在,
除了微分为零的地方,目标函数的极大值也可能发生在边界上,
拉格朗日乘数无法处理这样的问题。
数学一点地说明,
如果今天目标函数是一个凸函数 (Convex Function) 或凹函数 (Concave Function),
上面的内部解就一定会是最大职或最小值,
但我们处理的伤害期望值函数不是,所以... _(:3」∠)_
所幸,边界上的最大值问题一样可以用拉格朗日乘数解决,
边界有几个就解几次拉格朗日乘数,
最后再把所有发生极大值的地方放在一起比较,
得到所有极大值之中的最大值。
这并不是一个简单的工程,
也有一些难以準确分析的区域,
但是借助程式的方法,
我们可以得到近乎準确的结论。
以下开始展示应用拉格朗日乘数的详细分析。
数学分析与应用
我们想要求目标函数 f(x, y, z) 在限制条件 g(x, y, z) = c 下的最大值。
这个问题的拉格朗日函数为:
L(x, y, z, λ) = x (1 + y z) - λ (x/3 + y/2 + z/4 - c)
接下来我们微分求极值:
∂L/∂x = (1 + y z) - λ/3 = 0
∂L/∂y = x z - λ/2 = 0
∂L/∂z = x y - λ/4 = 0
∂L/∂λ = -(x/3 + y/2 + z/4 - c) = 0 (这条就是限制条件 g(x, y, z) = 0,最后再处理它。)
经过消去法,我们可以得到 f(x, y, z) 达到极值时的条件:
x = 3 (1/y + 2 y) / 4
y = y
z = 2 y
套回 g(x, y, z) = c 可得:
y = c/3 ± √(4 c^2 - 6)/6
(x, z 用 y 的结果带入)
可以得到在 √1.5 ≦ c < 1.75 及 √1.5 ≦ c < 1.375 两个区间
分别有两个内部解 (x, y, z)。
从这个结果来看,
不管你原本攻击力、暴击率或暴击伤害是多少,加成效果来自哪里,
只要你最后的暴击率跟暴击伤害是 1 比 2,
且百分比攻击力跟暴击率的关係如上所述,
你的伤害就会是极大化。
另外,由配额函数 g 计算出的配额 c 也一样,
其绝对的数值在实务上并不重要,
只有当你想比较同角色拿不同武器,
或是不同角色之间最佳化属性分配的差异时,
才需要特别去详细计算。
然而这个推导有两个缺陷;
其一为实际上我们无法随心所欲调配各数值的比例,
其二为原问题的最大值可能发生在参数组的边界上。
(另外,圣遗物副词条数值加成的比例也未必总是 3 : 2 : 4。)
如果我们观察 y = c/3 ± √(4 c^2 - 6)/6 这个内部解,
会发现 y 在 c < √1.5 ≒ 1.22474 时无解,
意味着此时最佳解必定落在边界上。
这就是为什幺配额偏低 (装备较差) 的时候堆攻击力是最好的策略。
为了处理最大值在边界上的情况,
我们可以对每个可能的边界做一次拉格朗日乘数,
然后分析在各配额下最佳化的参数组应该符合什幺关係式。
我们先考虑 x ≧ 100%、5% ≦ y ≦ 100%、z ≧ 50% 的边界,
这个时候需要比较的边界解就多达 9 种,
(还要加上刚刚用拉格朗日乘数算出来的两个内部解)
不过不用担心,本米已经帮大家整理好了,
以下使用 Python 语言 matplotlib 模组包下的 pyplot 函数绘图呈现。
(内部解与各边界解在各配额下的比较关係。)
我们可以将此函数图划分成三个区域:
1. (0.15 + 1/3) ≦ c < 1.175,粉色函数胜出,
为 y = 5%、z = 50%,只叠攻击力的边界解 (x, 0.05, 0.5)。
2. 1.175 ≦ c < 1.25864,绿色函数胜出,
为 z = 50%,按 3 : 2 的比例叠攻击力与暴击率的边界解 (3(1 + 0.5y), y, 0.5)。
3. 1.25864 ≦ c < 1.75,黑色函数胜出,
为上述拉格朗日乘数得到的内部最佳解 (3(1/y + 2 y)/4, y, 2 y)。
4. c > 1.75,看起来像绿色的黄色函数胜出,
为暴击率已达 100%,按 3 : 4 的比例叠攻击力与暴击伤害的边界解 (3(1 + z)/4, 1.0, z)。
什幺?你说看不到黑色函数比绿色函数低?
(大哥他没有输)
我们再放大一点看。
(配额在 1.2 到 1.3 之间粉、绿、黑三个边界解的比较关係。)
进一步,我们可以绘製出最佳化参数组 (x, y, z) 对配额的关係图,
并在各区段分析最佳的属性分配:
(最佳化的三项数值对于配额的函数图。)
1. 在攻击力达到 307.5% 之前,只叠攻击力会是最佳解。
2. 续第 1 项,在 307.5% ≦ x < 320.0% 这个区间,应按 3 : 2 的比例叠高攻击力及暴击率。
3. 续第 2 项,当 (x, y, z) 超过 (320.0%, 13.4%, 50%),
最佳解会瞬间跳到从 (222.7%, 51.6%, 103.3%) 开始的内部解。
这个时候我们会想按 1 : 2 的比例叠高暴击率及暴击伤害。
但同时我们也观察到在 (x, y, z) 到达 (212.1%, 70.7%, 141.4%) 之前,
最佳化的攻击力是往下掉的,
意思是不必强求攻击力,甚至可以牺牲部分攻击力来换取双暴属性。
4. 当 (x, y, z) 超过 (212.1%, 70.7%, 141.4%),
最佳化的攻击力会慢慢增加,
此时应保持暴击率与暴击伤害 1 : 2 继续叠高,
并适度分配点数到攻击力直到 (225%, 100%, 200%)。
5. 这个区段暴击率已经到达 100%,无法再提升了,
接下来按 3 : 4 的比例叠高攻击力与暴击伤害会是最佳解。
(极品圣遗物加上角色突破加成有可能达到这个领域,但是不简单。)
因为区域 2 的宽度较窄,且此区域内的三个最佳边界解差异不大,
实务上是可以无视的。
另外,在配额为 1.41421 时,纯堆攻击力跟按 1 : 2 叠双暴有着约 9% 的差异,
配额越高差距只会越大,
所以在装备有一定品质之后建议转而叠双暴。
为验证本最佳化分析的可信度,
我们使用 Python 语言 Scipy 模组包下的 SLSQP 方法,
计算出各配额下的最佳解,并同样做图。
给有兴趣的人:
import scipy.optimize as opt
def dmg_f(x):
return x[0]*(1 + x[1]*x[2])
def cons_f(x, c):
return x[0]/3 + x[1]/2 + x[2]/4 - c
def dmg_opt(c):
c = max(0.15 + 1/3, c)
obsf = lambda x: -dmg_f(x)
init = [1.0, 0.05, 0.5]
cons = [{'type': 'eq', 'fun': lambda x: cons_f(x, c)}]
bound = [(1.0, None), (0.05, 1.0), (0.5, None)]
res = opt.minimize(obsf, x0 = init,
bounds = bound,
constraints = cons,
tol = 1e-14)
dmg = -res.fun
para = res.x
lndmg = np.log(dmg)
return dmg, para, lndmg
(程式计算出的最大伤害期望值函数值与其对数值对配额作图)
(程式计算出的最佳化的三项数值对配额作图。)
我们可以看到趋势是符合前述讨论的,
然而区域 2 的宽度却有明显的不同。
从程式算出的最大伤害期望值函数图可以发现
在 c = √1.5 ≒ 1.22474 的地方有一个小折点,
推测是程式基于不明原因提前走到区域 3 的内部解,
但实际上在 √1.5 ≦ c < 1.25864 内部解还没有超越边界解 (3 + 1.5 y, y, 0.5),
可以合理认为是程式所採用的 SLSQP 方法存在着某些缺陷。
scipy.optimize.minimize() 函数有个臭名是
你给定的起始点不同,你会得到不一样的极值点,
所以会有一些小偏差实际上是不令人意外的。
如果要解决这个问题,就要想办法给函数一点额外的限制,
不然就得自己写一个 Python 函数来解最佳化问题_(:3」∠)_。
然而实务上我们很难完全没有额外暴击率、暴击伤害,
很多时候都是已经有 (举例) y0 = 32%、z0 = 84 % 的前提下去调配,
这个时候我们就必须求符合 y ≧ y0 及 z ≧ z0 的边界解
还有在这範围内可能的内部解。
其结果可以分成两个部分:
1. 暴击率小于暴击伤害的一半
这个时候出暴击率的效益是大于暴击伤害的,
因此我们考虑攻击力跟暴击率要怎幺调配。
以拉格朗日乘数得边界解为 (1.5(1/z + y), y, z0),
也就是按 3 : 2 的比例叠高攻击力及暴击率。
2. 若暴击伤害未达暴击率的两倍
这个时候出暴击伤害的效益是大于暴击率的,
因此我们考虑攻击力跟暴击伤害要怎幺调配。
以拉格朗日乘数得边界解为 (0.75(1/y + z), y0, z)。
也就是按 3 : 4 的比例叠高攻击力及暴击伤害。
这个结果相当于区域 2 的扩张 (或缩小)。
直观的的论述是,
初始暴击伤害越高,越支持提早出暴击率;
初始暴击率越高,越支持提早出暴击伤害。
当 y 与 z 的比例接近 1 : 2,内部解会逐渐超过边界解,
若 z0 > 81.6% (或 y0 > 40.8%),在 z = 2 y 的时候可以无缝接上内部解,
但是其他的情况就没有一个明确的判断式 (应该是没有解析解)。
不过因为这个时候边界解与内部解的伤害期望值函数值差距不太大,
所以只要先把 y 跟 z 调配到接近 1 : 2 之后,
按 1 : 2 的比例叠高暴击率及暴击伤害并接上内部解 (3(1/y + 2 y)/4, y, 2 y),
就可以得到 (接近) 最大化的伤害期望值。
如果需要準确的转换区资讯,可以参考下表。
暴击伤害 z |
转换区配额 c |
转换区参数 (x, y, z) |
转换区伤害期望值 f |
50% |
1.175 ~ 1.25864 |
(307.5%, 5%, 50%) ~ (320.0%, 13.4%, 50%) |
3.1519 ~ 3.4143 |
81.7% |
0.86641 ~ 1.22474 |
(191.2%, 5%, 81.7%) ~ (244.9%, 40.8%, 81.7%) |
1.9898 ~ 3.2660 |
100% |
0.8 ~ 1.25 |
(157.5%, 5%, 100%) ~ (225%, 50%, 100%) |
1.6538 ~ 3.375 |
141.4% |
0.75711 ~ 1.41421 |
(113.6%, 5%, 141.4%) ~ (212.1%, 70.7%, 141.4%) |
1.2160 ~ 4.2426 |
200%* |
0.91667 ~ 1.75 |
(100%, 16.7%, 200%) ~ (225.0%, 100%, 200%) |
1.3333 ~ 6.75 |
(初始暴击率小于初始暴击伤害的一半时的转换区参数。)* 暴击率达到 16.7% 前全出暴击率。
暴击率 y |
转换区配额 c |
转换区参数 (x, y, z) |
转换区伤害期望值 f |
25%* |
1.25 |
(300%, 25%, 50%) |
3.375 |
40.8% |
1.06641 ~ 1.22474 |
(221.2%, 40.8%, 50%) ~ (244.9%, 40.8%, 81.7%) |
2.6633 ~ 3.2660 |
50% |
1.0 ~ 1.25 |
(187.5%, 50%, 50%) ~ (225%, 50%, 100%) |
2.3438 ~ 3.375 |
70.7% |
0.95711 ~ 1.41421 |
(143.6%, 70.7%, 50%) ~ (212.1%, 70.7%, 141.4%) |
1.9432 ~ 4.2426 |
100% |
1.0 ~ 1.75 |
(112.5%, 100%, 50%) ~ (225.0%, 100%, 200%) |
1.6875 ~ 6.75 |
(初始暴击伤害未达初始暴击率的两倍时的转换区参数。)* 攻击力达到 300% 前全出攻击力,之后接上内部解。
剩下的内容就跟懒人包一样了。
这个结果可以解释为什幺有些角色应该按 1 : 2 叠暴击率及暴击伤害,
有些只需要叠攻击力,有些则需要交互叠。
主 C 配额够高,可以毫无悬念叠双暴,
副 C、工具人如果暴击伤害 (或暴击率) 不够高,就多叠攻击力,
暴击伤害 (或暴击率) 够高,就轮流出攻击力跟暴击率。
实际操作方面,
因为属性加成可能受到武器属性、效果、圣遗物属性和词条等各种来源影响,
不可能随意调控相关参数的比例,
所以常常是搭好几套装备之后,
计算输出分数来决定优劣。
输出分数可以写成:
DS = 面板攻击力 × (1 + 暴击率 × 暴击伤害)
最后选择输出分数最高的那套装备来使用。
举例来说,第一套装备给你 1800 点攻击力、30% 暴击率及 80% 暴击伤害,
第二套装备给你 1400 攻击力、50% 暴击率及 100% 暴击伤害,
计算得第一套的输出分数 = 1800 × (1 + 0.3 × 0.8) = 2232
第二套的输出分数 = 1400 × (1 + 0.5 × 1.0) = 2100
第一套略胜,故选择第一套。
需要特别注意的是这里的输出分数没有考虑元素精通加成及反应伤害增强,
如果关注的是吃重元素反应的角色,
则上述的讨论将无法直接适用。
另外,如果要考虑有特定属性伤害加成的装备,
请看接下来的讨论。
(最大伤害期望值函数值对配额作图。)
(最大伤害期望值函数值的边际成长率与配额的关係图)
上图灰线是对数化的伤害期望值函数,
下图灰线则为前述函数的微分,
令 F = ln f
则 F' = f' / f = G
该微分即为前述函数的边际成长率。
我们可以看到当配额超过 0.817,
边际成长率不会再超过 1.5。
因此叠属性伤害加成 (及普攻伤害加成、大招伤害加成) 的时候,
不建议叠到边际成长率小于 1.5。
(之所以把属性伤害加成分开讨论,是因为只能从空之杯和套装效果获得,相对独立。)
设优势属性伤害占所有伤害的比例为 p,
属性伤害加成为 w,
则 G (属性伤害) = 3 d ln(1 + p w) / dw = 3 p / (1 + p w) ≧ 1.5
得 w ≦ 2 - 1/p。
如果是纯元素输出 (普攻也是属性伤害的法师角色) 大可把属性伤害加成当成攻击力叠。
如果是元素、物理混伤输出,优势属性伤害的占比 (p 值) 越重,
越适合叠高属性伤害加成,
但是除非你是全程后台挂元素工具人,
不然不适合像法师那样堆叠属性伤害加成。
个人是建议穿对应的属性伤害加成套,
之后的空之杯用边际成长法判断应该出攻击力还是属性伤害加成。
(或是反过来,先穿属伤杯,再决定要穿什幺套装)
普攻伤害加成、大招伤害加成等等有的没有的加成
与属性伤害加成属于同一个增幅项 (多数人称之为「乘区」),
其边际成长率会受到彼此的数值稀释影响,
故除非普攻 (或大招) 佔角色输出手段的绝大部分,
否则不建议跟属性伤害加成一起出。
结论
用拉格朗日乘数可以得到在配额够高的情况下,1 : 2 叠双暴是效益最高的选择。
(此时只要总攻击力 > 212.1%,不需要过度叠高攻击力。)
若是配额不足,则按照暴击伤害与暴击率的高低比例,
决定如何交互叠高攻击力与暴击率 (或暴击伤害)。
初始暴击伤害越高,越适合提早出暴击率;
初始暴击率越高,越适合提早出暴击伤害。
主 C 装备成形后,叠双暴效果最佳;
副 C、辅助若攻击属性配额较少或装备较差,以出攻击力为主。
(天赋有吃其他属性加成的另当别论。)
属性伤害加成 (及普攻伤害加成、大招伤害加成) 则根据你的角色类型及你惯用的输出手段,
搭配其他攻击属性来出。
任何攻击属性都不应该单独叠高 (属性伤害加成也不例外),
需要时用边际成长法来衡量什幺时候是出太多了,
或是做为套装效果选择的参考。
多套武器、圣遗物搭配在选择时,
计算最后的输出分数做比较,
分数越高的配装效果越好。
谢谢大家的观看。欢迎批评指教。