基于线性规划的分解算法求解示例
题目描述
考虑一个大规模线性规划问题:
\[\begin{aligned} \min \quad & c_1^T x_1 + c_2^T x_2 + \cdots + c_N^T x_N \\ \text{s.t.} \quad & A_1 x_1 + A_2 x_2 + \cdots + A_N x_N = b_0 \quad \text{(耦合约束)} \\ & B_i x_i = b_i, \quad x_i \geq 0 \quad \text{对 } i=1,\dots,N \quad \text{(独立约束)} \end{aligned} \]
其中,变量 \(x_i\) 和约束 \(B_i x_i = b_i\) 被分解为 \(N\) 个独立的子问题,而 \(A_i x_i\) 的求和约束将子问题关联起来。这种结构常见于资源分配、网络流等问题。
解题步骤
1. 问题分解思路
由于直接求解大规模问题计算成本高,分解算法将问题拆分为:
- 主问题(Master Problem):处理耦合约束 \(\sum_{i=1}^N A_i x_i = b_0\)。
- 子问题(Subproblems):每个子问题独立求解 \(B_i x_i = b_i, x_i \geq 0\),并向主问题提供可行解的信息(如极值点或极方向)。
2. 主问题的重构
利用凸组合表示法,每个子问题的可行域 \(X_i = \{x_i \mid B_i x_i = b_i, x_i \geq 0\}\) 可表示为极值点(顶点)的凸组合:
\[x_i = \sum_{k=1}^{K_i} \lambda_{i,k} p_{i,k}, \quad \sum_{k=1}^{K_i} \lambda_{i,k} = 1, \quad \lambda_{i,k} \geq 0 \]
其中 \(p_{i,k}\) 是 \(X_i\) 的极值点。代入原问题,主问题变为:
\[\begin{aligned} \min \quad & \sum_{i=1}^N \sum_{k=1}^{K_i} (c_i^T p_{i,k}) \lambda_{i,k} \\ \text{s.t.} \quad & \sum_{i=1}^N \sum_{k=1}^{K_i} (A_i p_{i,k}) \lambda_{i,k} = b_0 \\ & \sum_{k=1}^{K_i} \lambda_{i,k} = 1 \quad \forall i, \quad \lambda_{i,k} \geq 0 \end{aligned} \]
该问题称为广义主问题,变量为权重 \(\lambda_{i,k}\)。
3. 列生成(Column Generation)
由于极值点数量 \(K_i\) 可能极大,直接枚举不可行。列生成动态生成必要的列(即极值点):
- 限制主问题(RMP):初始仅包含部分极值点,求解 RMP 得到对偶变量 \(\pi\)(对应耦合约束)和 \(\sigma_i\)(对应凸性约束)。
- 子问题优化:对每个子问题 \(i\),求解定价问题(Pricing Problem):
\[ \min_{x_i \in X_i} (c_i - \pi^T A_i)^T x_i \]
目标函数值记为 \(\zeta_i\)。若 \(\zeta_i - \sigma_i < 0\),则当前极值点 \(x_i^*\) 可加入 RMP 作为新列;否则无改进列。
3. 迭代:重复求解 RMP 和子问题,直到所有子问题满足 \(\zeta_i - \sigma_i \geq 0\),此时主问题达到最优。
4. 算法流程
- 初始化:为每个子问题生成至少一个可行解 \(p_{i,1}\),构建初始 RMP。
- 循环直到收敛:
- 求解 RMP,得到对偶变量 \(\pi, \sigma_i\)。
- 对每个 \(i\),求解子问题 \(\min_{x_i \in X_i} (c_i - \pi^T A_i)^T x_i\)。
- 若存在 \(i\) 使目标值 \(\zeta_i < \sigma_i\),将解 \(x_i^*\) 作为新列加入 RMP;否则终止。
- 输出:由 RMP 的最优 \(\lambda^*\) 还原原变量 \(x_i^* = \sum_k \lambda_{i,k}^* p_{i,k}\)。
关键点说明
- 优势:分解后子问题可并行求解,适合分布式计算。
- 收敛性:由于线性规划的最优解在极值点达到,该算法有限步收敛。
- 实际应用:类似 Dantzig-Wolfe 分解,常用于块角结构问题(如多商品流)。
通过这种分解,大规模问题被拆分为易处理的子模块,显著降低计算复杂度。