kkt条件例题求最优解_用多元函数条件极值解一道经典数值策划题(二)

本文通过一个具体的数值策划问题,详细讲解如何应用Karush-Kuhn-Tucker (KKT)条件来求解多元函数在等式和不等式约束下的极值。通过建立拉格朗日函数,列出KKT方程组,逐步分析并得出不同解的情形,最终找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面我们来开始计算这道题目,题目如下:

假定游戏里玩家可以自由分配属性点数到攻击力,防御力和生命值上去,攻击间隔统一为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的最小值,约束条件为:

  1. x+y+z=100
  2. 10-az ≥0
  3. z≥0

我拿出了珍藏多年的同济版《高等数学》,第八章第八节正好有多元函数的极值求法,也有在等式约束下的用拉格朗日乘数法的详细介绍。但是没有介绍在不等式约束下如何计算极值的方法!还好知乎上有相关介绍,原来这种就叫Karush-Kuhn-Tucker (KKT)条件,点下面的链接有详细介绍:

Eureka:Karush-Kuhn-Tucker (KKT)条件​zhuanlan.zhihu.com
95d2511886cfcaf4956238eb8aea31f4.png

按照上文介绍的方法将原题转换成标准约束优化问题:

其中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
目描述: 某公司要生产一种塑料制品,它的制造成本由以下三个因素决定: 1.原材料成本,每吨为$C_1$元; 2.人工成本,每人每小时为$C_2$元; 3.设备折旧费,每小时为$C_3$元。 该公司现有$N$吨原材料,可以雇佣$M$个人,有$K$台机器可供使用。每件塑料制品需要消耗$W_1$吨原材料,$W_2$人时的人力和$W_3$机器小时。设生产出$x$件塑料制品的收益为$P(x)$元,试出该公司的最大收益及此时生产的塑料制品数目。 思路: 根据目设定,我们可以列出该问的目标函数和约束条件: 目标函数:$P(x)$ 约束条件: 1.原材料量:$W_1x\leqslant N$ 2.人力量:$W_2x\leqslant M$ 3.机器量:$W_3x\leqslant K$ 4.非负性:$x\geqslant 0$ 将目标函数和约束条件转化为多元函数的形式: 目标函数:$f(x_1,x_2,x_3)=P(x_1)$ 约束条件: 1.原材料量:$g_1(x_1,x_2,x_3)=W_1x_1-N\leqslant 0$ 2.人力量:$g_2(x_1,x_2,x_3)=W_2x_2-M\leqslant 0$ 3.机器量:$g_3(x_1,x_2,x_3)=W_3x_3-K\leqslant 0$ 4.非负性:$h(x_1,x_2,x_3)=x_1,x_2,x_3\geqslant 0$ 然后,使用拉格朗日乘数法: $$L(x_1,x_2,x_3,\lambda_1,\lambda_2,\lambda_3,\mu)=P(x_1)+\lambda_1(W_1x_1-N)+\lambda_2(W_2x_2-M)+\lambda_3(W_3x_3-K)-\mu x_1-\mu x_2-\mu x_3$$ 对$L(x_1,x_2,x_3,\lambda_1,\lambda_2,\lambda_3,\mu)$偏导数,并令其等于零,得到如下方程组: $$\begin{cases} P'(x_1)-\lambda_1W_1-\mu=0\\ -\lambda_2W_2-\mu=0\\ -\lambda_3W_3-\mu=0\\ W_1x_1-N\leqslant 0\\ W_2x_2-M\leqslant 0\\ W_3x_3-K\leqslant 0\\ \lambda_1\geqslant 0,\lambda_2\geqslant 0,\lambda_3\geqslant 0\\ \mu\geqslant 0\\ \lambda_1(W_1x_1-N)=0,\lambda_2(W_2x_2-M)=0,\lambda_3(W_3x_3-K)=0 \end{cases}$$ 根据KKT条件,当$x_1,x_2,x_3$满足约束条件时,有$\lambda_1(W_1x_1-N)=0,\lambda_2(W_2x_2-M)=0,\lambda_3(W_3x_3-K)=0$,即$\lambda_1$,$\lambda_2$,$\lambda_3$中至少有一个为零。 因此,我们可以列出所有可能的情况: 1.$\lambda_1=0, \lambda_2=0, \lambda_3=0$ 此时,$x_1=0,x_2=0,x_3=0$,目标函数值为$P(0)$ 2.$\lambda_1>0, \lambda_2=0, \lambda_3=0$ 此时,$x_1=\frac{N}{W_1},x_2=0,x_3=0$,目标函数值为$P(\frac{N}{W_1})$ 3.$\lambda_1=0, \lambda_2>0, \lambda_3=0$ 此时,$x_1=0,x_2=\frac{M}{W_2},x_3=0$,目标函数值为$P(0)$ 4.$\lambda_1=0, \lambda_2=0, \lambda_3>0$ 此时,$x_1=0,x_2=0,x_3=\frac{K}{W_3}$,目标函数值为$P(0)$ 5.$\lambda_1>0, \lambda_2>0, \lambda_3=0$ 此时,$x_1=\frac{N}{W_1},x_2=\frac{M}{W_2},x_3=0$,目标函数值为$P(\frac{N}{W_1})$ 6.$\lambda_1>0, \lambda_2=0, \lambda_3>0$ 此时,$x_1=\frac{N}{W_1},x_2=0,x_3=\frac{K}{W_3}$,目标函数值为$P(\frac{N}{W_1})$ 7.$\lambda_1=0, \lambda_2>0, \lambda_3>0$ 此时,$x_1=0,x_2=\frac{M}{W_2},x_3=\frac{K}{W_3}$,目标函数值为$P(0)$ 8.$\lambda_1>0, \lambda_2>0, \lambda_3>0$ 此时,$x_1=\frac{N}{W_1},x_2=\frac{M}{W_2},x_3=\frac{K}{W_3}$,目标函数值为$P(\frac{N}{W_1})$ 最终,我们只需要比较以上八种情况下的目标函数值,即可得到最大收益和此时生产的塑料制品数目。 参考代码: ``` #include <iostream> #include <cmath> using namespace std; double P(double x) { // 假设收益函数为x的平方 return x * x; } int main() { double C1, C2, C3, N, M, K, W1, W2, W3; cin >> C1 >> C2 >> C3 >> N >> M >> K >> W1 >> W2 >> W3; double x1 = 0, x2 = 0, x3 = 0; // 初始值 double maxP = P(0); // 枚举所有情况 for (int i = 0; i <= ceil(N / W1); i++) { for (int j = 0; j <= ceil(M / W2); j++) { for (int k = 0; k <= ceil(K / W3); k++) { if (W1 * i <= N && W2 * j <= M && W3 * k <= K) { double curP = P(i); if (curP > maxP) { maxP = curP; x1 = i; x2 = j; x3 = k; } } } } } cout << "最大收益为:" << maxP << endl; cout << "生产的塑料制品数目为:" << x1 << endl; cout << "原材料用量为:" << W1 * x1 << endl; cout << "人力用量为:" << W2 * x2 << endl; cout << "机器用量为:" << W3 * x3 << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值