非线性规划中的自适应惩罚函数法基础题
题目描述
考虑非线性规划问题:
最小化目标函数 \(f(x) = (x_1 - 2)^2 + (x_2 - 1)^2\)
约束条件为:
- \(g_1(x) = x_1 + x_2 - 2 \leq 0\)
- \(g_2(x) = x_1^2 - x_2 \leq 0\)
初始点 \(x^{(0)} = (0, 0)\),允许误差 \(\epsilon = 10^{-3}\)。
要求使用自适应惩罚函数法求解该问题,通过动态调整惩罚权重使迭代收敛到约束最优解。
解题过程
自适应惩罚函数法的核心思想是:将约束违反程度融入目标函数,形成惩罚函数 \(P(x, \mu)\),并随着迭代动态调整惩罚权重 \(\mu\),使解逐渐逼近可行域。具体步骤如下:
1. 构造自适应惩罚函数
- 定义约束违反量 \(V(x) = \sum_{i=1}^{2} \max(0, g_i(x))\),即所有违反约束的正值之和。
- 惩罚函数为 \(P(x, \mu) = f(x) + \mu \cdot V(x)^2\)(使用平方惩罚增强敏感度)。
- 初始权重 \(\mu^{(0)} = 1\),权重更新公式:\(\mu^{(k+1)} = \beta \cdot \mu^{(k)}\),其中 \(\beta > 1\)(例如 \(\beta = 2\))。
2. 迭代求解无约束子问题
-
步骤 2.1:初始化
设 \(k = 0\),\(x^{(0)} = (0, 0)\),\(\mu^{(0)} = 1\),\(\beta = 2\)。
计算初始约束违反量:
\(V(x^{(0)}) = \max(0, 0+0-2) + \max(0, 0-0) = 2 + 0 = 2\)。 -
步骤 2.2:求解当前惩罚函数的最小值
当前子问题:最小化 \(P(x, \mu^{(k)}) = (x_1-2)^2 + (x_2-1)^2 + \mu^{(k)} \cdot V(x)^2\)。
使用梯度下降法(或牛顿法)求解:- 梯度计算:
\(\nabla P = \left[ 2(x_1-2) + 2\mu^{(k)} V(x) \cdot \frac{\partial V}{\partial x_1}, \quad 2(x_2-1) + 2\mu^{(k)} V(x) \cdot \frac{\partial V}{\partial x_2} \right]\)
其中 \(\frac{\partial V}{\partial x_1} = \mathbf{1}_{g_1>0} + 2x_1 \cdot \mathbf{1}_{g_2>0}\)(\(\mathbf{1}_{g_i>0}\) 为示性函数,当约束违反时取 1)。 - 以 \(k=0\) 为例:
在 \(x^{(0)}\) 处,\(g_1 > 0\),\(g_2 \leq 0\),故 \(\frac{\partial V}{\partial x_1} = 1\),\(\frac{\partial V}{\partial x_2} = 1\)。
梯度下降更新:\(x^{(1)} = x^{(0)} - \alpha \nabla P\),步长 \(\alpha\) 通过线搜索确定。
经多次梯度下降迭代后,得到 \(\mu^{(0)}\) 下的近似解 \(x^{(1)} \approx (0.8, 0.5)\)。
- 梯度计算:
-
步骤 2.3:检查收敛条件
计算约束违反量 \(V(x^{(k)})\)。若 \(V(x^{(k)}) < \epsilon\) 且连续两次迭代解的变化 \(\|x^{(k)} - x^{(k-1)}\| < \epsilon\),则停止;否则进入下一步。 -
步骤 2.4:更新惩罚权重
令 \(\mu^{(k+1)} = \beta \cdot \mu^{(k)}\),\(k = k+1\),返回步骤 2.2。
3. 迭代过程示例
-
迭代 1(\(\mu^{(0)}=1\)):
子问题解 \(x^{(1)} \approx (0.8, 0.5)\),\(V(x^{(1)}) \approx 0.3\)(轻微违反 \(g_1\))。
不满足收敛条件,更新 \(\mu^{(1)} = 2\)。 -
迭代 2(\(\mu^{(1)}=2\)):
重新最小化 \(P(x, 2)\),解 \(x^{(2)} \approx (1.0, 1.0)\),\(V(x^{(2)}) = 0\)(完全可行)。
检查收敛:\(V(x^{(2)}) = 0 < \epsilon\),且 \(\|x^{(2)} - x^{(1)}\| \approx 0.36 > \epsilon\),需继续迭代。 -
迭代 3(\(\mu^{(2)}=4\)):
解 \(x^{(3)} \approx (1.0, 1.0)\),与 \(x^{(2)}\) 相同,约束满足。
此时 \(\|x^{(3)} - x^{(2)}\| = 0 < \epsilon\),算法终止。
4. 结果分析
最终解 \(x^* = (1.0, 1.0)\),目标函数值 \(f(x^*) = 1.0\)。
该点满足所有约束,且为全局最优解(通过一阶必要性条件验证)。
自适应惩罚函数法通过动态增加 \(\mu\),有效平衡了目标函数优化与约束满足的权衡。