基于线性规划的图最小顶点覆盖问题的分解算法求解示例
题目描述
给定一个无向图 \(G = (V, E)\),其中 \(V\) 是顶点集,\(E\) 是边集。最小顶点覆盖问题要求找到一个顶点子集 \(S \subseteq V\),使得每条边至少有一个端点在 \(S\) 中,且 \(S\) 的规模最小。该问题是NP难问题,但可以通过线性规划松弛与分解算法(如列生成或Dantzig-Wolfe分解)结合分支定界来求解。
解题过程
1. 问题建模
- 对每个顶点 \(i \in V\),定义二进制变量 \(x_i \in \{0, 1\}\):
\[ x_i = \begin{cases} 1 & \text{顶点 } i \text{ 被选入覆盖集} \\ 0 & \text{否则} \end{cases} \]
- 目标函数:最小化覆盖集规模
\[ \min \sum_{i \in V} x_i \]
- 约束条件:每条边至少有一个端点被覆盖(对每条边 \((u, v) \in E\))
\[ x_u + x_v \geq 1 \]
2. 线性规划松弛
将整数约束 \(x_i \in \{0, 1\}\) 松弛为连续约束:
\[0 \leq x_i \leq 1 \]
得到线性规划问题:
\[\min \sum_{i \in V} x_i \quad \text{s.t.} \quad x_u + x_v \geq 1 \ \forall (u,v) \in E, \ 0 \leq x_i \leq 1 \]
3. 分解算法思路
直接求解上述线性规划可能因规模过大而低效。采用Dantzig-Wolfe分解:
- 将问题分解为主问题(Master Problem) 和子问题(Subproblem)。
- 主问题:从顶点覆盖的可行解(即边覆盖约束的凸组合)中选择最优组合。
- 子问题:生成新的可行解(即顶点覆盖的极端点或路径),以改进主问题的目标值。
4. 主问题建模
设 \(P\) 为所有可行顶点覆盖的集合(可能指数级大小)。对每个覆盖 \(p \in P\),定义二进制变量 \(\lambda_p\) 表示是否选择该覆盖。主问题为:
\[\min \sum_{p \in P} c_p \lambda_p \quad \text{s.t.} \quad \sum_{p \in P} a_{ep} \lambda_p \geq 1 \ \forall e \in E, \ \lambda_p \geq 0 \]
其中:
- \(c_p = \sum_{i \in V} x_i^p\) 是覆盖 \(p\) 的顶点数;
- \(a_{ep} = 1\) 若边 \(e\) 被覆盖 \(p\) 覆盖,否则为 0。
5. 限制主问题(Restricted Master Problem, RMP)
由于 \(P\) 过大,初始RMP仅包含少量可行解(如每个顶点单独构成的覆盖)。通过列生成动态添加新解。
6. 子问题:生成改进的顶点覆盖
子问题的目标是为RMP生成一个负检验数的列(即降低目标值的新覆盖)。检验数公式为:
\[\text{检验数} = c_p - \sum_{e \in E} \pi_e a_{ep} \]
其中 \(\pi_e\) 是RMP中对偶变量(对应边约束 \(\sum_p a_{ep} \lambda_p \geq 1\))。
子问题转化为:
\[\min \sum_{i \in V} \left(1 - \sum_{e \in \delta(i)} \pi_e \right) x_i \]
其中 \(\delta(i)\) 是与顶点 \(i\) 关联的边集。约束为 \(x_i \in \{0, 1\}\)(因需生成可行覆盖)。
- 若子问题最优值 \(< 0\),则对应列加入RMP;否则达到线性规划最优。
7. 整数解处理
线性规划松弛解可能非整数。若解为分数,需结合分支定界:
- 分支:选择分数变量 \(x_i\),分别固定 \(x_i = 0\) 或 \(x_i = 1\)。
- 定界:在每个节点用分解算法求解线性规划松弛,提供下界。
8. 算法流程总结
- 初始化RMP(包含简单覆盖,如所有顶点全选)。
- 求解RMP,得到对偶变量 \(\pi_e\)。
- 求解子问题:生成检验数最小的顶点覆盖。
- 若检验数 \(\geq 0\),停止;否则添加新列到RMP,返回步骤2。
- 若线性规划解非整数,启动分支定界。
示例
考虑图 \(G = (V, E)\) 含顶点 \(\{1,2,3\}\) 和边 \(\{(1,2), (2,3)\}\):
- 初始RMP:包含覆盖 \(p_1 = \{1,2,3\}\)(成本3)。
- 第一次迭代后,子问题可能生成覆盖 \(p_2 = \{1,2\}\)(成本2),加入RMP。
- 最终线性规划松弛解为 \(x_1 = 0.5, x_2 = 1, x_3 = 0.5\),目标值2(需分支定界得整数解 \(\{1,2\}\) 或 \(\{2,3\}\))。
通过分解算法,避免显式枚举所有顶点覆盖,显著提升大规模问题求解效率。