随想随记2-常见属性分配问题
简单的问题
正式问题来之前,先来一个简单的问题。
假设一个技能的伤害为a*(1+0.2b)*(2+0.5c).现在假设手里有30个技能点。那么我该如何分配技能点,才能让技能伤害最大化。
这个问题首先可以明确是一个收益线性规划问题。
第一种方式:拉格朗日乘数法。设参数为线性约束a+b+c=30。求解即可。不过使用这个方法有点舍近求远。具体工作场景当中是可以用excel或者python等工具的,所以可以有更好的解决办法。
第二种方式:均值不等式。比较显然的解决办法,三个因子相乘,且三个数都是正,经过一定的运算变换,是可以整理成均值不等式方法的,把系数归一化就可以。原式=a*(5+b)*(4+c)/10,然后只需要求a*(5+b)*(4+c)的最大值,且求解最大值点,就可以得到结果了,后面就不详述了。
第三种方式:边际递减法。这里详细介绍一下第三种方式。计算点三种类参数的每加点边际收益,只要能够使得,三种加点的边际收益一致,那接下来就只需要再轮番加点每个属性,就可以得到最优解。

根据计算,当a,b,c,分别加点到11,6,7的时候,边际收益相同。所以我们的加点策略只需要满足。先把a,b,c加点到11,6,7.剩下再轮流加点就可以了。即,我们的30点数,分配为13=11+2,8=6+2,9=7+2
第四种方式:excel自带的规划求解或者程序的暴力搜索。
excel自带的规划求解功能可以直接解决该问题:

输入参数后,得到结果也与第三种方法的计算一致。
简单的问题看完了,再来看一个复杂的问题。
复杂的问题
下图,是我崩铁中,希儿不穿任何遗物的练度情况和终结技技能倍率。


注:图中希儿1210为白板攻击力,无任何百分比攻击词条。
问题:假设一个攻击力词条为4.3%攻击力加成,一个暴击率词条为3.2%,一个暴击伤害词条为6.4%。然后假设我的圣遗物一共可以获得20/50/70个进攻词条(包含攻双暴)。如何分配词条,能够让我的希儿大招打出最高输出。
求解前提
在解决问题之前。要先确定一些“正确的废话”
1.技能倍率和初始攻击力和该问题的解答无关。因为输出公式可以写为:技能倍率*攻击力基数*(1+攻击力%)*(1+暴击率*暴击伤害)。很明显,技能倍率和攻击力基数是可以不考虑的,可以把这两个因子拿出去。并且在考虑该问题的时候,并不需要关注额外攻击力是固定词条还是百分比词条,只要关注”额外的/基本的“比值,换算出来的攻击力百分比对应的词条数量即可。
2.暴击率*暴击伤害一定是1:2最优,原因是,游戏中的暴击率和暴击伤害均是成双倍投放的。因此:设暴击率单词条为单位1,暴击伤害即为2.假设暴击率和暴击伤害共有z个词条。z=x+y,x为暴击率词条数量,y为暴击伤害词条数量。那么暴击率*暴击伤害=2xy。能取到最大值,当且仅当x=y。即暴击率和暴击伤害等价词条数量一致。即数值为1:2.
3.词条数量更多的“最优解”要大于词条数量更少的“最优解”。
另外:
这个问题用拉格朗日乘数法并没有求出合适的解(已经尝试过了)
直接套用上文的方法三,也不可以。(一会儿会说到为什么不可以)
求解过程
第一步:设定暴击乘区收益价值,方便计算。根据前提2.我们可以提前知道,暴击和暴伤应该是同步提升的。所以设定一词条”暴击收益“为0.5词条暴击和0.5词条暴伤。
第二步:依旧采用词条的边际收益概念,求解一下攻击力和"暴击收益”,每一个词条的边际收益。
(边际收益=提升后/提升前-1,攻击力边际收益=(1+(n+1)*0.043)/(1+n*0.043),
暴击收益边际收益=(1+(n+1)*(0.5*0.032)*(n+1)*(0.5*0.064))/(1+n*(0.5*0.032)*n*(0.5*0.064))
得到如下规律

利用攻击力和暴击收益绘图

橙色线条为攻击力边际收益,蓝色线条为暴击收益的边际收益。(这也解释了,为什么直接使用方法三是不奏效的,因为这两个属性,并不如同前面问题一样,两个属性的边际效益都保持全局边际递减,而是一个分段函数)
根据读表,交点大概是在横坐标27-28处。我们可以大致按照28处理,28词条的暴击收益也就是对应暴击率和暴击伤害为(44.8%,89.6%)在这点之前,我们可以粗暴地看作攻击力收益高于双暴,这点之后,双暴收益高于攻击力。该点正是两种状态的切换点。
暂时将这部分结果保留,后面还会用到。
第三步:求解动态最优解点。词条总数不同的时候,最优解点也不同,但无论词条总数有多少,最优解点(稳态点)即使变化,也应该是具备一个性质即:下一次词条无论点在哪里,收益相同。所以根据这个结果,列方程。以暴击率为锚点。设暴击率为y,攻击力为x
可以得到:x=(43+86y²-64y)/64y。根据该方程。带入每词条暴击率提升,得到如下表格数据。

对表格数据进行绘图:可以得到:

最优解的暴击收益拐点位于暴击率,攻击力(70.4%,90.04%)。
关于这个拐点,还可以从之前的暴击收益的边际效益图里观察到。


暴击收益值45.利用44计算即可。也就是暴击率=22*3.2%=70.4%,暴击伤害=140.8%。
即为上面得到的拐点,在该拐点前暴击属性稀释逐渐减小,之后又慢慢增大,满暴击率以后再变成线性变化收益递减(满暴部分图里未体现。)
第四步:重点局部点
上面那个图中,有四个很重要的点。
第一个,状态8:状态8的暴击收益等价于我的希儿目前初始状态的暴击收益。我的希儿的暴击收益可以通过,计算SQRT(暴击*爆伤/2)计算。最终可以得到,只看暴击收益我的希儿目前位于状态8
第二个,状态14:即为攻击力和暴击收益的边际收益切换点。理论上,最优解只要不完全恰好等于该点,就会跳跃该点,所以该点也是一个理想点。不会发生的点。
第三个:状态15:即为攻击力和暴击收益交替后的点,当词条数量能够满足状态15的暴击收益最优解点的时候,就会立刻跳过14状态,如果词条数量不能满足,则不会跳过14状态(表现为一直堆攻击力的收益总要大于双暴)
第四个:状态22:即为暴击收益的拐点,该点是游戏里角色的长期理想点的起点。游戏内的词条配置策略,完全可以先追求到该点,然后同步提升暴击和爆伤,然后暴击满了以后,只追求爆伤,爆伤过高的时候(几乎不可能),再反过去追求攻击。
第五个:状态31:暴击达到100%,暴击收益逐步降低,后续暴击收益曲线越发和攻击授收益曲线逐渐贴合,直至相交。
第五步:结论
最优解的变化会根据,词条约束数量,在上面的最优解表格当中向其中一个结果靠近,其中最特殊的为状态15和22。作为两个变化点,词条约束是否能够达到15和22所要求的水平,哪怕只差一个,获得最优解的策略都是不同的。
第六步:带入情况,得到结果。
把问题回到现实问题当中来。上面说的结论可能还是让人有些云里雾里,那么带入一下实际数据,再详细结算一下会清晰的多。上面已经说过。我的希儿目前位于状态8的水平。而看到属性里面,攻击力还远远没有达到要求 。
那么问题描述的三种情况:
情况1:20个词条:首先分析一下20个词条能带来的收益,如果全点攻击力,可以让攻击力达到20*4.3%=86%。此时,即使把词条全部分配给攻击力,也无法达到状态15的攻击力要求。也就意味着,攻击和暴击收益的边际效应,目前还是攻击力作为主要。(即仅仅20个词条,无法跳跃到攻击力收益和暴击收益切换的点。所以只堆攻击即可)
所以当20个词条的时候,20个词条全点攻击就可以了。
情况2:50个词条:分析一下50个人词条带来的收益,如果全点攻击力,可以获得50*4.3%=215%。目前看来是远远超出了状态15要求的104.47%。那么现在只把攻击力给到104.47%,即24个攻击词条。剩余词条数量为26个。然后基于原本就具有的属性23%暴击率和55.3%的暴击伤害,即暴击率原本具有23%/3.2%≈7个词条。暴击伤害约等于8-9个词条。看作8个。我们把26个词条分配14个给暴击率12个给暴击伤害。得到:暴击率=67.8%。
其实算到这里,情况2,就可以暂时停手了。因为我们把24个词条分配给攻击,这一步,这个尝试是错误的。暴击率能够被分配至67.8%即,50个词条已经具备可以让状态达到状态22的可能性了。少分配一些攻击力,转而给暴击率。就可以达到状态22.接下来重新计算。
攻击力=90.4%/4.3%≈21个词条,此时暴击收益还有29个待分配。此时分配给暴击率15个,暴击伤害14个。
可以得到暴击率=23%+3.2%*15=71%,暴击伤害=55.3%+6.4%*14=144.9%
最后的词条分配为:(21,15,14)属性值为(90.4%,71%,144.9%)
情况3:其实基于情况2的前提,继续思考即可。依旧从最优解集合入手,此时的词条有70条。
由于已经通过了拐点,暴击收益和攻击的边际收益都在下降,此时有点类似“上一个简单问题里的解法3”了,因为此时满足了所有属性都是同走向的变化。所以原则上来说,经过拐点状态22以后,依旧边际收益递减速度分配即可。当边际收益递减速度一致,轮番分配即可。
说回正题,对于情况3,可以向最优解状态31去靠近,这里就不详述了,过程还是和上面大差不大,最终拟合的最优结果为攻击力分配24条,暴击率分配24条,暴击伤害分配22条。
求解验证
下面写了一段程序,用来暴力搜索最优结果(excel的规划求解也可以,但偶尔精度选的不准会出错,所以就写了一段程序来保证正确)。来验证上面得到的每一组结果。
得到:词条数为20:

词条数为50:

词条数为70:

列表中第一个元素为计算出的最大局部伤害。验证得到,我们上面的结果均正确。
备注
这里可以基于这个程序,更直观看一下上面说的“状态跳跃”的情况。
计算一下,我的希儿想要达到状态15,所需要的最少词条为多少:首先攻击力为约为24个词条即103.2%最靠近状态里的104.47%。暴击率达到48%,至少需要48%-23%=25%/3.2%=8个词条,暴击伤害大约要7个词条。共计24+8+7=39个词条。也就是说如果达不到39个词条,就无法跳跃状态14,全堆攻击收益最高。
验证:
38词条:

39词条:

达成跳跃。
到这里,问题应该算是解决了。