基于线性规划的图最小顶点反馈集问题的整数规划建模与分支切割法求解示例
我将为您讲解线性规划与图论结合的一个经典问题——图最小顶点反馈集问题(Minimum Vertex Feedback Set Problem, MVFSP)的整数规划建模与分支切割法求解。
问题描述
给定一个无向简单图 \(G=(V,E)\),其中 \(V\) 是顶点集(\(|V|=n\)),\(E\) 是边集(\(|E|=m\))。一个顶点子集 \(S \subseteq V\) 称为一个顶点反馈集(Vertex Feedback Set),如果从 \(G\) 中移除 \(S\) 中的所有顶点后,剩下的图是无环的(即成为森林)。最小顶点反馈集问题要求找到一个顶点反馈集 \(S\),使得 \(|S|\)(即集合中顶点个数)最小。
通俗理解:在一个图中,环(圈)是导致“循环依赖”的结构。我们要删除最少的顶点,破坏图中所有的环,使剩余部分变成树或森林(无环)。
为什么用线性规划方法?
该问题是NP难的,对于大型实例需要借助整数规划结合线性规划松弛与分支切割法来求精确解或高质量近似解。
第一步:整数规划建模
我们需要为每个顶点定义一个决策变量:
\[x_v = \begin{cases} 1, & \text{如果顶点 } v \text{ 被选入反馈集 } S \\ 0, & \text{否则} \end{cases}, \quad \forall v \in V \]
目标是最小化选中的顶点数:
\[\text{minimize} \quad \sum_{v \in V} x_v \]
核心约束:如何保证移除选中的顶点后,剩余图无环?等价地,原图的每个环(cycle)上至少有一个顶点被选中。
设 \(\mathcal{C}\) 为图 \(G\) 中所有简单环(simple cycle)的集合。对每个环 \(C \in \mathcal{C}\),约束为:
\[\sum_{v \in C} x_v \geq 1 \]
即每个环至少有一个顶点在反馈集中。
整数规划模型(IP):
\[\begin{aligned} \min & \quad \sum_{v \in V} x_v \\ \text{s.t.} & \quad \sum_{v \in C} x_v \geq 1, \quad \forall C \in \mathcal{C} \\ & \quad x_v \in \{0,1\}, \quad \forall v \in V \end{aligned} \]
第二步:挑战与线性规划松弛
- 环的数量是指数级的:不可能枚举所有环约束。
- 策略:采用分支切割法(Branch-and-Cut)。先求解线性规划松弛(LP Relaxation):将 \(x_v \in \{0,1\}\) 松弛为 \(0 \leq x_v \leq 1\),并且不预先加入所有环约束,而是动态地在求解过程中识别被违反的环约束(切割),逐步添加。
初始线性规划松弛(只有边界约束):
\[\begin{aligned} \min & \quad \sum_{v \in V} x_v \\ \text{s.t.} & \quad 0 \leq x_v \leq 1, \quad \forall v \in V \end{aligned} \]
这个初始松弛的最优解是 \(x_v = 0\) 对一切 \(v\),目标值为0,显然不可行(除非原图无环)。因此我们需要通过添加割平面(cutting planes)来逼近整数可行解。
第三步:割平面生成(分离问题)
在分支切割法中,每得到一个线性规划松弛的解 \(x^*\)(可能分数),我们需要检查是否存在环约束 \(\sum_{v \in C} x_v^* < 1\) 被违反。寻找这样的环 \(C\) 称为分离问题。
分离问题的转化:
对于分数解 \(x^*\),构造辅助图 \(G'\):
- 顶点集不变:\(V\)。
- 为每条边 \(e = (u,v) \in E\) 赋予容量 \(c_e = \min(x_u^*, x_v^*)\)。
为什么?因为对于环 \(C\),约束 \(\sum_{v \in C} x_v \geq 1\) 可以重新表达为:环上每条边对应的两个顶点 \(x\) 值之和至少为1?不直接。更聪明的办法是:
我们检查是否存在一个环,其所有顶点 \(x_v^*\) 之和小于1。这可以转化为:在 \(G\) 中,若将 \(x_v^*\) 视为顶点“权重”,则寻找一个权重和小于1的环。
分离算法:
- 构造新图 \(H\):将每个顶点 \(v\) 拆分为两个节点 \(v_{in}\) 和 \(v_{out}\),并添加有向边 \((v_{in}, v_{out})\) 容量为 \(x_v^*\)(表示选择顶点v的代价)。
- 对原图每条边 \((u,v) \in E\),在 \(H\) 中添加两条有向边:\((u_{out}, v_{in})\) 和 \((v_{out}, u_{in})\),容量设为 \(+\infty\)(或一个很大的数)。
- 在这个新图 \(H\) 中,原图的一个环对应于 \(H\) 中的一个有向环,且该环的容量(即环上拆边容量之和)等于环上顶点 \(x_v^*\) 之和。
- 寻找 \(H\) 中容量小于1的有向环 → 这可以通过对每个顶点作为起点,运行修改的最短路算法(如Bellman-Ford检测负环)来实现:将边权设为 \(w(v_{in} \to v_{out}) = x_v^* - \epsilon\)(其中 \(\epsilon\) 很小,如 \(1/(n+1)\)),则总权小于0的环对应 \(\sum x_v^* < 1\) 的环。
- 若找到这样的环 \(C\),则添加割平面 \(\sum_{v \in C} x_v \geq 1\) 到线性规划中。
实际中,为简化,常用DFS搜索结合阈值判断的启发式方法:从某点出发搜索环,当路径上 \(x^*\) 累加和接近1时停止,若找到一个环的总和小于1,则生成切割。
第四步:分支切割法流程
- 初始化:创建根节点,初始LP只有 \(0 \leq x_v \leq 1\)。
- 循环(节点处理):
a. 求解当前节点的LP松弛。
b. 若LP不可行,剪枝。
c. 若LP最优值 ≥ 当前最优整数解的目标值,剪枝。
d. 若LP解为整数(所有 \(x_v \in \{0,1\}\)),检查是否为反馈集(即剩余图是否无环)。若是,更新全局最优解;否则,找到未被覆盖的环,添加相应切割。
e. 若LP解为分数,运行分离算法寻找违反的环约束。若找到,添加切割,返回步骤a。
f. 若未找到切割,则分支:选择一个分数变量 \(x_v\)(如最接近0.5的),创建两个子节点,分别固定 \(x_v=0\) 和 \(x_v=1\)。 - 继续处理其他节点(通常采用最佳优先搜索)。
第五步:算法结束与输出
当所有节点被处理完(剪枝或求解完毕),当前记录的最优整数解即为最小顶点反馈集。算法可以给出精确最优解,但受时间限制也可提前终止获得近似解。
举例说明
考虑一个简单图:三角形(3个顶点 \(a,b,c\) 两两相连)。
- IP模型:
变量 \(x_a, x_b, x_c \in \{0,1\}\)
约束:对环 \((a,b,c)\):\(x_a + x_b + x_c \geq 1\)
目标:最小化 \(x_a + x_b + x_c\)
最优解:选择任意一个顶点(如 \(x_a=1, x_b=x_c=0\)),目标值=1。
分支切割法过程:
- 初始LP:\(\min x_a+x_b+x_c, \quad 0 \leq x_v \leq 1\)。最优解 \(x^*=(0,0,0)\),值=0。
- 分离:环 \((a,b,c)\) 的 \(\sum x_v^* = 0 < 1\),添加切割 \(x_a+x_b+x_c \geq 1\)。
- 求解新LP:最优解 \(x^*=(1/3,1/3,1/3)\),值=1。
- 分离:无违反环约束(因为环上和=1,等于约束边界)。
- 分支:选 \(x_a\)(分数)。创建子节点:
- 节点1:\(x_a=0\)。LP变为 \(\min x_b+x_c\),约束 \(x_b+x_c \geq 1\)(因为 \(x_a=0\)),\(0 \leq x_b,x_c \leq 1\)。最优解 \(x_b=1,x_c=0\) 或对称,值=1(整数)。
- 节点2:\(x_a=1\)。LP为 \(\min 1+x_b+x_c\),约束 \(1+x_b+x_c \geq 1\) 自动满足。最优解 \(x_b=0,x_c=0\),值=1(整数)。
- 两个整数解对应的集合分别是 \(\{b\}\) 和 \(\{a\}\),都是最小反馈集(大小1)。全局最优值=1。
总结
通过将最小顶点反馈集问题建模为整数规划,并利用分支切割法动态添加环约束切割,我们能够有效求解该NP难问题。核心创新点在于分离问题的设计——将寻找“权重和小于1的环”转化为图上的搜索问题,使得算法可以处理大规模实例。这种方法不仅限于此问题,也可推广到其他需要指数级约束的图覆盖问题。