非线性规划中的序列线性互补问题(SLCP)算法进阶题
题目描述
考虑非线性规划问题:
minimize \(f(x) = (x_1 - 2)^2 + (x_2 - 1)^2\)
subject to:
\(g_1(x) = x_1^2 - x_2 \leq 0\)
\(g_2(x) = x_1 + x_2 - 2 \leq 0\)
其中 \(x = (x_1, x_2) \in \mathbb{R}^2\)。
要求使用序列线性互补问题(SLCP)算法,从初始点 \(x^{(0)} = (0, 0)\) 出发,通过构造线性互补子问题逐步逼近原问题的解。
解题过程循序渐进讲解
1. 问题分析与算法原理
- SLCP算法将非线性规划转化为一系列线性互补子问题。每个子问题通过线性化目标函数和约束在当前迭代点构造,再求解该线性互补问题得到搜索方向。
- 互补问题要求找到向量 \(w\) 和 \(z\) 满足:
\(w = Mz + q\), \(w \geq 0\), \(z \geq 0\), \(w^T z = 0\)。 - 在SLCP中,子问题通过线性化KKT条件得到,其解提供迭代方向。
2. 计算梯度与Hessian矩阵
- 目标函数梯度:
\(\nabla f(x) = [2(x_1 - 2), 2(x_2 - 1)]^T\) - 约束梯度:
\(\nabla g_1(x) = [2x_1, -1]^T\), \(\nabla g_2(x) = [1, 1]^T\) - Lagrangian函数:
\(L(x, \lambda) = f(x) + \lambda_1 g_1(x) + \lambda_2 g_2(x)\) - Hessian矩阵(用于二阶近似):
\(\nabla_{xx}^2 L = \begin{bmatrix} 2 + 2\lambda_1 & 0 \\ 0 & 2 \end{bmatrix}\)
3. 构造初始点的线性互补子问题
在 \(x^{(0)} = (0, 0)\) 处:
- 梯度值:
\(\nabla f(x^{(0)}) = [-4, -2]^T\)
\(\nabla g_1(x^{(0)}) = [0, -1]^T\), \(\nabla g_2(x^{(0)}) = [1, 1]^T\) - 约束值:
\(g_1(x^{(0)}) = 0\), \(g_2(x^{(0)}) = -2\) - 线性化约束:
\(\tilde{g}_1(x) = g_1(x^{(0)}) + \nabla g_1(x^{(0)})^T (x - x^{(0)}) = -x_2\)
\(\tilde{g}_2(x) = g_2(x^{(0)}) + \nabla g_2(x^{(0)})^T (x - x^{(0)}) = -2 + x_1 + x_2\) - 线性化目标:
\(\tilde{f}(x) = f(x^{(0)}) + \nabla f(x^{(0)})^T (x - x^{(0)}) = 5 - 4x_1 - 2x_2\)
4. 形成线性互补问题
引入松弛变量 \(s = [s_1, s_2]^T \geq 0\) 和乘子 \(\lambda = [\lambda_1, \lambda_2]^T \geq 0\),子问题的KKT条件为:
- 平稳性:
\(\nabla \tilde{f}(x) + \lambda_1 \nabla g_1(x^{(0)}) + \lambda_2 \nabla g_2(x^{(0)}) = 0\)
\(\Rightarrow [-4, -2]^T + \lambda_1 [0, -1]^T + \lambda_2 [1, 1]^T = 0\) - 原始可行:
\(\tilde{g}_1(x) + s_1 = 0\), \(\tilde{g}_2(x) + s_2 = 0\)
\(\Rightarrow -x_2 + s_1 = 0\), \(-2 + x_1 + x_2 + s_2 = 0\) - 互补松弛:
\(\lambda_1 s_1 = 0\), \(\lambda_2 s_2 = 0\)
5. 求解线性互补子问题
将条件写为 \(w = Mz + q\) 形式:
设 \(z = [x_1, x_2, \lambda_1, \lambda_2]^T\), \(w = [s_1, s_2, r_1, r_2]^T\),其中 \(r\) 为平稳性残差。
从平稳性条件:
\(-4 + \lambda_2 = 0 \Rightarrow \lambda_2 = 4\)
\(-2 - \lambda_1 + \lambda_2 = 0 \Rightarrow \lambda_1 = 2\)
从原始可行条件:
\(s_1 = x_2\), \(s_2 = 2 - x_1 - x_2\)
互补松弛条件:
\(\lambda_1 s_1 = 2x_2 = 0 \Rightarrow x_2 = 0\)
\(\lambda_2 s_2 = 4(2 - x_1) = 0 \Rightarrow x_1 = 2\)
解得 \(x^{(1)} = (2, 0)\), \(\lambda^{(1)} = (2, 4)\)
6. 迭代与收敛检查
在 \(x^{(1)} = (2, 0)\) 处:
- 约束值:
\(g_1(x^{(1)}) = 4 > 0\)(违反约束)
\(g_2(x^{(1)}) = 0\)(活跃约束)
由于 \(g_1(x)\) 被违反,需继续迭代。重新线性化并求解新子问题,通过序列逼近使解满足约束并优化目标函数。经过数次迭代后,算法将收敛至满足KKT条件的点 \(x^* \approx (1, 1)\),此时 \(f(x^*) = 1\),约束 \(g_1(x^*) = 0\), \(g_2(x^*) = 0\)。
关键点
- SLCP通过线性化非线性约束,将问题转化为线性互补子问题序列。
- 每次迭代需检查约束违反情况,并调整线性化点。
- 收敛时解满足原问题的KKT条件,且互补条件确保约束处理正确。