非线性规划中的序列二次规划-代理模型-信赖域混合算法进阶题
题目描述:
考虑非线性规划问题:
\[\min f(x) = (x_1 - 1)^2 + (x_2 - 2.5)^2 + \sin(x_1 x_2) \]
约束条件为:
\[g_1(x) = x_1 - 2x_2 + 1 \geq 0 \]
\[g_2(x) = -x_1^2 - x_2^2 + 4 \geq 0 \]
\[x_1, x_2 \in \mathbb{R} \]
要求使用序列二次规划(SQP)结合代理模型(如二次近似)和信赖域策略求解该问题,初始点 \(x^{(0)} = [2, 0]\),初始信赖域半径 \(\Delta_0 = 0.5\)。
解题过程:
-
问题分析
- 目标函数 \(f(x)\) 包含非线性项 \(\sin(x_1 x_2)\),约束 \(g_2(x)\) 为非线性不等式。
- 核心思想:通过SQP将原问题转化为一系列二次规划子问题,并用代理模型(如拉格朗日函数的二次近似)简化计算,再通过信赖域控制步长以保证收敛。
-
构建拉格朗日函数
引入拉格朗日乘子 \(\lambda_1, \lambda_2\),定义拉格朗日函数:
\[ L(x, \lambda) = f(x) - \lambda_1 g_1(x) - \lambda_2 g_2(x) \]
其中 \(\lambda_1, \lambda_2 \geq 0\)。
-
初始化
设初始点 \(x^{(0)} = [2, 0]\),初始乘子 \(\lambda^{(0)} = [0, 0]\),初始信赖域半径 \(\Delta_0 = 0.5\),容忍误差 \(\epsilon = 10^{-6}\)。 -
迭代步骤(第k次迭代)
步骤1:计算梯度与Hessian- 计算目标函数梯度 \(\nabla f(x^{(k)})\) 和约束梯度 \(\nabla g_1(x^{(k)}), \nabla g_2(x^{(k)})\)。
例如在 \(x^{(0)}\) 处:
- 计算目标函数梯度 \(\nabla f(x^{(k)})\) 和约束梯度 \(\nabla g_1(x^{(k)}), \nabla g_2(x^{(k)})\)。
\[ \nabla f = [2(x_1-1) + x_2 \cos(x_1 x_2), \ 2(x_2-2.5) + x_1 \cos(x_1 x_2)] \]
代入得 $ \nabla f(x^{(0)}) \approx [2, -3] $。
\[ \nabla g_1 = [1, -2], \quad \nabla g_2 = [-2x_1, -2x_2] \approx [-4, 0] \]
- 计算拉格朗日函数的Hessian近似 \(B_k\)(用BFGS更新或精确Hessian):
\[ B_k = \nabla^2 L(x^{(k)}, \lambda^{(k)}) \]
若用精确Hessian,需计算二阶导数。
步骤2:构建二次规划子问题
在 \(x^{(k)}\) 处建立代理模型(二次近似):
\[ \min_p \frac{1}{2} p^T B_k p + \nabla f(x^{(k)})^T p \]
约束为线性化约束:
\[ \nabla g_1(x^{(k)})^T p + g_1(x^{(k)}) \geq 0 \]
\[ \nabla g_2(x^{(k)})^T p + g_2(x^{(k)}) \geq 0 \]
且满足信赖域约束 \(\|p\| \leq \Delta_k\)。
步骤3:求解子问题
使用积极集法或内点法求解该二次规划,得到步长 \(p_k\)。
步骤4:计算实际下降与预测下降
- 实际下降:
\[ \text{ared}_k = f(x^{(k)}) - f(x^{(k)} + p_k) \]
- 预测下降(基于代理模型):
\[ \text{pred}_k = -\left( \nabla f(x^{(k)})^T p_k + \frac{1}{2} p_k^T B_k p_k \right) \]
- 计算比值 \(\rho_k = \frac{\text{ared}_k}{\text{pred}_k}\)。
步骤5:更新信赖域半径
- 若 \(\rho_k < 0.25\),拒绝步长,缩小信赖域: \(\Delta_{k+1} = 0.5 \Delta_k\)。
- 若 \(\rho_k > 0.75\),接受步长,扩大信赖域: \(\Delta_{k+1} = 2 \Delta_k\)。
- 否则保持 \(\Delta_{k+1} = \Delta_k\)。
步骤6:更新迭代点与乘子
- 若 \(\rho_k > \eta\)(如 \(\eta = 0.1\)),接受步长: \(x^{(k+1)} = x^{(k)} + p_k\),并更新乘子 \(\lambda^{(k+1)}\) 为子问题解。
- 否则保持 \(x^{(k+1)} = x^{(k)}\)。
- 收敛判断
检查KKT条件的残差:
\[ \|\nabla L(x^{(k)}, \lambda^{(k)})\| \leq \epsilon, \quad |\lambda_i g_i(x^{(k)})| \leq \epsilon \]
若满足则停止,否则返回步骤1。
关键点:
- 代理模型简化了非线性的Hessian计算。
- 信赖域确保迭代稳定性,避免无效大步长。
- 通过比值 \(\rho_k\) 动态调整信赖域半径,平衡近似精度与效率。