用多元函数条件极值解一道经典数值策划题(二)
下面我们来开始计算这道题目,题目如下:
假定游戏里玩家可以自由分配属性点数到攻击力,防御力和生命值上去,攻击间隔统一为1秒(为了计算过程简化,不考虑取整因素,可以把伤害认为是持续伤害,总伤害严格等于攻击时间乘以攻击力),现在玩家拥有100点属性点,怪物的攻击力为10,防御力为30,生命值为60,称一场战斗过程中自身所损失的生命值与自身的总生命值的比值为损血百分比p,玩家希望杀死怪物后,损血百分比最小化(如果玩家无法战胜怪物,那么损血百分比就是100%),在以下两种伤害结算公式的情形下,分别计算玩家如何分配属性点数,能够达到损血百分比p最小化这个目的(a>0)
情形一:最终伤害=攻击方攻击力-a*防御方防御力
情形二:最终伤害=攻击方攻击力/(1+a*防御方防御力)
讨论a取值的不同如何影响p?
林培俊:用多元函数条件极值解一道经典数值策划题(一)zhuanlan.zhihu.com

先计算情形1,即减法公式的情况。
设玩家生命值为x,攻击力为y,防御为z,击杀怪物需要的时间为t,则有:
,玩家在t受到的伤害
则损血百分比
目的是求p的最小值,约束条件为:
- x+y+z=100
- 10-az ≥0
- z≥0
我拿出了珍藏多年的同济版《高等数学》,第八章第八节正好有多元函数的极值求法,也有在等式约束下的用拉格朗日乘数法的详细介绍。但是没有介绍在不等式约束下如何计算极值的方法!还好知乎上有相关介绍,原来这种就叫Karush-Kuhn-Tucker (KKT)条件,点下面的链接有详细介绍:
Eureka:Karush-Kuhn-Tucker (KKT)条件zhuanlan.zhihu.com

按照上文介绍的方法将原题转换成标准约束优化问题:
其中a>0
定义拉格朗日函数:
KKT 方程组如下:
对L求偏导,由方程1,2,3可得:
- (11)
- (12)
- (13)
由(11),(12)解得:
(14)
由方程5,7,9分情况讨论:
- : 约束条件5有效 (15)
- :约束条件5无效 (16)
由方程6,8,10分情况讨论:
- : 约束条件6有效 (17)
- :约束条件6无效 (18)
解1
若(15)成立,显然(17)不成立,则(18)成立,将(15)、(14)代入4,解得一组解:
- (19)
- (20)
- (21)
代入p(x,y,z)可得p=0 (22)
由题意知x>0,代入(19)解得a的取值范围为
(23)
解2
若(17)成立,显然(15)不成立,则(16)成立,将(17)、(14)代入4,解得第2组解:
- (24)
- (25)
- (26)
代入p(x,y,z)可得
(27)
由题意知x>0,代入(24)解得a的取值范围为
(28)
又由题意知p<=1,代入(27)解得a的取值范围为
(29)
因为(28)包含(29),因此舍弃(28)。
又因为(27)的p值比(22)大,因此在(29)和(23)的重合部分取解1。
因此解2的a的取值范围为
(30)
解3
若(16)成立且(18)成立,代入(13)和(14)及(12)联立可解得:
(31)
将(31),(14)带入4可解得第三组解:
- (32)
- (33)
- (34)
由题意知x>0,代入(33)解得a的取值范围为
(35)
发现(35)解一的a的取值范围(23)相同,而根据题意解一在取值范围内必定是极小值,因此舍去解3。
答案
综上,a在不同取值范围下能战胜怪物且让玩家损血百分比p最小的属性点数分配方案如下:
1.
时:给防御分配0点,攻击分配50+15a点,生命分配50-15a可使损血百分比p最小,此时p值为
2.
时:给防御分配10/a点,攻击分配50+15a-5/a点,生命分配50-15a-5/a点可使损血百分比p最小,此时p值为0
3.
时:玩家无论如何分配都无法战胜怪物(怪也不一定能杀死玩家,但根据题意也算玩家失败),此时p值为1