基于线性规划的仿射缩放内点法求解示例
题目描述
考虑线性规划问题:
\[\begin{aligned} \text{最大化} \quad & 3x_1 + 2x_2 \\ \text{约束条件} \quad & x_1 + x_2 \leq 4 \\ & 2x_1 + x_2 \leq 5 \\ & x_1, x_2 \geq 0 \end{aligned} \]
要求使用仿射缩放内点法求解该问题。该方法通过迭代在可行域内部移动,逐步逼近最优解,避免单纯形法的顶点遍历,适用于大规模问题。
解题过程
1. 标准化问题
将问题转化为标准型(最小化、等式约束、非负变量):
\[\begin{aligned} \text{最小化} \quad & -3x_1 - 2x_2 \\ \text{约束条件} \quad & x_1 + x_2 + x_3 = 4 \\ & 2x_1 + x_2 + x_4 = 5 \\ & x_1, x_2, x_3, x_4 \geq 0 \end{aligned} \]
其中 \(x_3, x_4\) 是松弛变量。
令 \(c = [-3, -2, 0, 0]^T\),\(A = \begin{bmatrix} 1 & 1 & 1 & 0 \\ 2 & 1 & 0 & 1 \end{bmatrix}\),\(b = [4, 5]^T\)。
2. 初始内点选择
需选择一个严格可行的初始点(所有变量 > 0)。
通过观察,取 \(x_1 = 1, x_2 = 1\),则:
\[x_3 = 4 - (1+1) = 2, \quad x_4 = 5 - (2+1) = 2 \]
初始点 \(x^{(0)} = [1, 1, 2, 2]^T > 0\),满足 \(Ax = b\)。
3. 仿射缩放方向计算
设当前点为 \(x^{(k)} > 0\),定义对角矩阵 \(D_k = \text{diag}(x^{(k)})\)。
仿射缩放方向 \(d_x\) 通过投影梯度法得到:
- 计算梯度:\(\nabla f(x) = c\)(本例中为常数)。
- 将梯度变换到“缩放空间”:\(c_s = D_k c\)。
- 将 \(c_s\) 投影到 \(A D_k\) 的零空间:
\[ d_s = -\left[ I - (A D_k)^T (A D_k^2 A^T)^{-1} (A D_k) \right] c_s \]
- 变换回原空间:\(d_x = D_k d_s\)。
以第一次迭代为例:
- \(x^{(0)} = [1, 1, 2, 2]^T\),\(D_0 = \text{diag}(1, 1, 2, 2)\)。
- \(c = [-3, -2, 0, 0]^T\),\(c_s = D_0 c = [-3, -2, 0, 0]^T\)。
- 计算 \(A D_0 = \begin{bmatrix} 1 & 1 & 2 & 0 \\ 2 & 1 & 0 & 2 \end{bmatrix}\)。
- 计算 \(A D_0^2 A^T = \begin{bmatrix} 1 & 1 & 2 & 0 \\ 2 & 1 & 0 & 2 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 4 & 0 \\ 0 & 0 & 0 & 4 \end{bmatrix} A^T = \begin{bmatrix} 6 & 3 \\ 3 & 10 \end{bmatrix}\)。
- 求逆:\((A D_0^2 A^T)^{-1} = \frac{1}{51} \begin{bmatrix} 10 & -3 \\ -3 & 6 \end{bmatrix}\)。
- 投影矩阵 \(P = I - (A D_0)^T (A D_0^2 A^T)^{-1} (A D_0)\)(计算略)。
- 得 \(d_s = -P c_s = [0.235, -0.294, -0.471, 0.588]^T\)。
- \(d_x = D_0 d_s = [0.235, -0.294, -0.942, 1.176]^T\)。
4. 步长选择
为保证新点 \(x^{(k+1)} = x^{(k)} + \alpha d_x\) 保持内点(所有分量 > 0),需限制步长:
\[\alpha = \min \left\{ \frac{-x_i}{(d_x)_i} \ \middle| \ (d_x)_i < 0 \right\} \]
但实际中常取更保守的步长(如乘以系数 0.99 避免触碰边界)。
本例中 \(d_x\) 的负分量为第 2、3 个:
\[\alpha_{\max} = \min \left\{ \frac{-1}{-0.294}, \frac{-2}{-0.942} \right\} \approx \min\{3.40, 2.12\} = 2.12 \]
取 \(\alpha = 0.99 \times 2.12 \approx 2.10\)。
5. 更新迭代点
\[x^{(1)} = x^{(0)} + \alpha d_x = [1, 1, 2, 2]^T + 2.10 \times [0.235, -0.294, -0.942, 1.176]^T \]
计算得 \(x^{(1)} \approx [1.494, 0.382, 0.022, 4.469]^T\)。
验证可行性:
- \(x_3\) 接近 0,但仍 > 0(内点性保持)。
- \(Ax = [1.876, 4.999]^T \approx b\)(数值误差可接受)。
6. 收敛判断
重复步骤 3–5,直到目标函数变化小于阈值或点接近最优。
本例的最优解为 \(x^* = [1, 3, 0, 0]^T\),最优值 \(3 \times 1 + 2 \times 3 = 9\)。
经过多次迭代后,\(x^{(k)}\) 会逼近 \(x^*\),且目标值从 \(-3 \times 1 - 2 \times 1 = -5\) 趋近于 \(-9\)(最小化标准型)。
关键点总结
- 仿射缩放法通过缩放梯度方向在可行域内移动。
- 步长控制确保迭代点不触碰边界。
- 适用于大规模稀疏问题,但收敛速度较慢(线性收敛)。
- 实际实现需处理数值稳定性(如矩阵求逆的正则化)。