基于线性规划的投影梯度法求解示例
题目描述
考虑线性规划问题:
\[\begin{aligned} \min \quad & c^T x \\ \text{s.t.} \quad & Ax = b \\ & x \geq 0 \end{aligned} \]
其中 \(A \in \mathbb{R}^{m \times n}\)(行满秩),\(b \in \mathbb{R}^m\),\(c \in \mathbb{R}^n\)。投影梯度法通过将梯度下降与可行性保持结合,在约束集上迭代求解。本示例以具体数值演示该过程:
\[A = \begin{bmatrix}1 & 2 & 1\end{bmatrix},\ b = 4,\ c = \begin{bmatrix}-2 & -3 & -1\end{bmatrix}^T. \]
目标是在约束 \(x_1 + 2x_2 + x_3 = 4\) 和 \(x \geq 0\) 下最小化 \(c^T x\)。
解题过程
1. 问题重构与投影矩阵
等式约束 \(Ax = b\) 定义了一个仿射空间。令 \(x_0\) 为任意特解(如 \(x_0 = [4, 0, 0]^T\)),则解空间可表示为 \(x = x_0 + Fy\),其中 \(F \in \mathbb{R}^{n \times (n-m)}\) 是 \(A\) 的零空间基矩阵(即 \(AF = 0\))。
投影矩阵 \(P = I - A^T(AA^T)^{-1}A\) 将向量投影到 \(A\) 的零空间。对本例:
- \(AA^T = [6]\),\((AA^T)^{-1} = 1/6\)。
- \(P = I_3 - \frac{1}{6}A^TA = \frac{1}{6}\begin{bmatrix}5 & -2 & -1 \\ -2 & 2 & -2 \\ -1 & -2 & 5\end{bmatrix}\)。
梯度投影的更新公式为:
\[x^{k+1} = \pi\left(x^k - \alpha_k P \nabla f(x^k)\right), \]
其中 \(\pi\) 表示向非负象限的投影,\(\alpha_k\) 为步长,\(\nabla f(x^k) = c\)。
2. 初始点选择与梯度投影
取可行初始点 \(x^0 = [2, 1, 0]^T\)(满足 \(Ax^0 = 4\) 且 \(x^0 \geq 0\))。
计算梯度投影方向 \(d^0 = -Pc\):
- \(c = [-2, -3, -1]^T\),
- \(Pc = \frac{1}{6}\begin{bmatrix}5\cdot(-2) + (-2)\cdot(-3) + (-1)\cdot(-1) \\ (-2)\cdot(-2) + 2\cdot(-3) + (-2)\cdot(-1) \\ (-1)\cdot(-2) + (-2)\cdot(-3) + 5\cdot(-1)\end{bmatrix} = \frac{1}{6}\begin{bmatrix}-3 \\ 0 \\ 3\end{bmatrix}\),
- \(d^0 = -Pc = [0.5, 0, -0.5]^T\)。
方向 \(d^0\) 需满足可行下降条件:沿 \(d^0\) 移动时,\(A(x^0 + \beta d^0) = b\) 恒成立(因 \(Ad^0 = 0\)),但需检查非负约束。
3. 步长选择与投影操作
步长限制:沿 \(d^0\) 移动时,若 \(d^0_i < 0\),则 \(x_i\) 减少,需防止 \(x_i < 0\)。对 \(x^0 = [2, 1, 0]^T\):
- \(x_3 = 0\) 且 \(d^0_3 = -0.5 < 0\),因此步长 \(\alpha\) 必须为 0(否则 \(x_3\) 变负)。
此时直接投影到边界:由于 \(d^0\) 在 \(x_3\) 方向不可行,需将搜索方向修正为可行下降方向。实际中,我们采用梯度投影到活跃约束的策略: - 当前活跃约束为 \(x_3 \geq 0\)(因 \(x_3 = 0\))。
- 将梯度投影到满足 \(Ax = b\) 和 \(x_3 = 0\) 的子空间:约束变为 \(A'x = b'\),其中 \(A' = \begin{bmatrix}1 & 2 & 1 \\ 0 & 0 & 1\end{bmatrix}\),\(b' = [4, 0]^T\)。
但更高效的方法是直接计算修正方向:
令 \(M\) 为活跃约束矩阵(本例中为 \([0, 0, 1]\)),则投影矩阵更新为 \(P' = I - A_c^T(A_c A_c^T)^{-1}A_c\),其中 \(A_c = \begin{bmatrix}A \\ M\end{bmatrix}\)。
计算得 \(P'c\) 为下降方向,且满足 \(x_3 \equiv 0\)。
4. 迭代过程与收敛
简化计算:在子空间 \(x_3 = 0\) 中,问题退化为:
\[\min -2x_1 - 3x_2 \quad \text{s.t.} \quad x_1 + 2x_2 = 4,\ x_1, x_2 \geq 0. \]
梯度为 \([-2, -3]^T\),约束梯度为 \([1, 2]\)。投影方向需垂直于约束梯度:
- 解 \(d\) 满足 \(d_1 + 2d_2 = 0\),且使目标下降(如 \(d = [2, -1]^T\) 需投影到非负域)。
实际迭代:
- 从 \(x^0 = [2, 1, 0]^T\) 开始,沿方向 \(d = [1, -0.5, 0]^T\)(满足 \(Ad=0\))移动,步长受 \(x_2 \geq 0\) 限制:最大步长 \(\beta_{\max} = 2\)(使 \(x_2\) 减至 0)。
- 取 \(\alpha = 2\),得 \(x^1 = [4, 0, 0]^T\),目标值 \(-8\)。
- 在 \(x^1\) 处,活跃约束为 \(x_2 = 0\) 和 \(x_3 = 0\),投影梯度为零(验证:子问题达最优)。
最优解为 \(x^* = [4, 0, 0]^T\),最优值 \(-8\)。
5. 算法总结
投影梯度法的核心步骤:
- 从可行点开始,计算梯度 \(c\) 在约束空间的投影 \(Pc\)。
- 若 \(Pc \neq 0\),确定最大可行步长并更新点;否则检查是否满足最优性条件(如 KKT 条件)。
- 遇到边界时,将梯度投影到活跃约束定义的子空间,重复直至收敛。
本例中,算法在两步内收敛到顶点解,体现了其高效性。