基于线性规划的图最小点割集问题的多项式时间原始-对偶近似算法求解示例
题目描述
给定一个无向图 \(G = (V, E)\) 以及每条边 \(e \in E\) 的非负费用 \(c(e)\),我们需要找到一组顶点集合 \(S \subset V\),使得移除 \(S\) 中的所有顶点后,图被分成至少两个连通分支(即 \(S\) 是一个点割集),并且 \(S\) 的总费用 \(\sum_{v \in S} w(v)\)(其中 \(w(v)\) 是移除顶点 \(v\) 的代价)最小。这个问题被称为最小点割集问题(Minimum Vertex Cut Problem)。如果要求分隔两个指定的顶点 \(s\) 和 \(t\),则称为 \(s-t\) 最小点割集问题。本示例中,我们考虑一般形式:找到最小费用的点割集使得图不连通。
问题分析
该问题本质上是NP-hard,因为它是经典的最小顶点覆盖问题的推广。但在某些特殊条件下(如平面图),有多项式时间算法。我们这里设计一个基于线性规划的原始-对偶近似算法,能够得到一个近似解,并证明其近似比。核心思想是:将点割集问题转化为边割集问题,通过对偶理论构建线性规划松弛,并利用原始-对偶框架迭代增加对偶变量,构造整数解。
步骤1:将点割集转化为边割集
一个点割集可以通过将每个顶点拆分为入点和出点,并添加一条从“入点”到“出点”的边来表示移除该顶点的代价。具体建模如下:
- 将原图 \(G\) 转换为一个有向图 \(G' = (V', E')\):
- 对每个原图顶点 \(v \in V\),创建两个顶点 \(v_{\text{in}}\) 和 \(v_{\text{out}}\)。
- 添加有向边 \((v_{\text{in}}, v_{\text{out}})\),容量为 \(w(v)\)(即移除 \(v\) 的代价)。
- 对原图的每条无向边 \((u, v) \in E\),添加两条有向边:\((u_{\text{out}}, v_{\text{in}})\) 和 \((v_{\text{out}}, u_{\text{in}})\),容量设为无穷大(或足够大的数 \(M\)),表示这些边不能被割。
- 在 \(G'\) 中,任选两个不同的源汇顶点 \(s_{\text{out}}\) 和 \(t_{\text{in}}\),计算它们之间的最小边割。由于 \(s_{\text{out}}\) 和 \(t_{\text{in}}\) 之间的路径必须经过某些 \((v_{\text{in}}, v_{\text{out}})\) 边,这些边对应原图的顶点,其容量和即为点割集的总代价。
这样,原问题转化为 \(G'\) 上的最小边割问题,可以写成线性规划形式。
步骤2:构建线性规划松弛
在 \(G'\) 中,设 \(x_e\) 为指示变量:若边 \(e\) 在割中,则 \(x_e = 1\),否则为 0。最小边割的整数规划为:
\[\min \sum_{e \in E'} c(e) x_e \]
\[ \text{s.t.} \quad \sum_{e \in P} x_e \ge 1 \quad \forall P \in \mathcal{P}(s_{\text{out}}, t_{\text{in}}) \]
\[ x_e \in \{0, 1\} \]
其中 \(\mathcal{P}(s_{\text{out}}, t_{\text{in}})\) 是所有从 \(s_{\text{out}}\) 到 \(t_{\text{in}}\) 的路径。这个约束保证了每条 \(s-t\) 路径至少有一条边被割。
松弛为线性规划(LP):
\[\min \sum_{e \in E'} c(e) x_e \]
\[ \text{s.t.} \quad \sum_{e \in P} x_e \ge 1 \quad \forall P \]
\[ x_e \ge 0 \]
其对偶问题为:
\[\max \sum_{P \in \mathcal{P}} y_P \]
\[ \text{s.t.} \quad \sum_{P: e \in P} y_P \le c(e) \quad \forall e \in E' \]
\[ y_P \ge 0 \]
其中 \(y_P\) 可解释为分配给路径 \(P\) 的“流量”。
步骤3:原始-对偶近似算法设计
我们采用类似最小边割的原始-对偶算法(即用于多商品流或 Steiner 树的框架):
- 初始化:所有 \(x_e = 0\),所有 \(y_P = 0\),集合 \(F = \emptyset\)(最终割的边集)。
- 主循环:
- 当 \(s_{\text{out}}\) 和 \(t_{\text{in}}\) 在 \(G'\) 中通过未割边(即 \(x_e = 0\) 的边)连通时:
- 找到一条最短路径 \(P\)(边数最少)从 \(s_{\text{out}}\) 到 \(t_{\text{in}}\) 仅使用未割边。
- 增加该路径对应的对偶变量 \(y_P\) 直到某条边 \(e \in P\) 的对偶约束变紧:即 \(\sum_{P': e \in P'} y_{P'} = c(e)\)。
- 将这条边 \(e\) 加入 \(F\),并令 \(x_e = 1\)(永久移除)。
- 当 \(s_{\text{out}}\) 和 \(t_{\text{in}}\) 在 \(G'\) 中通过未割边(即 \(x_e = 0\) 的边)连通时:
- 输出:\(F\) 对应的原图顶点集合:若 \(e = (v_{\text{in}}, v_{\text{out}}) \in F\),则将 \(v\) 加入点割集 \(S\)。
步骤4:近似比分析
该算法实际上是最小边割的原始-对偶算法,已知其近似比为 2(对于边割)。但在点割集的转化中,每条路径必须经过至少一条顶点边 \((v_{\text{in}}, v_{\text{out}})\),因此算法选择的割边集 \(F\) 仅包含顶点边(因为其他边容量为无穷大,不会在对偶约束中变紧)。
设算法得到的点割集费用为 \(\text{ALG}\),最优解费用为 \(\text{OPT}\)。由原始-对偶理论:
- 对偶可行解 \(y\) 的值 \(\sum_P y_P\) 是原问题最优值的下界,即 \(\sum_P y_P \le \text{OPT}\)。
- 算法构造的割满足:每条被选中的边 \(e\),其对应的对偶约束是紧的。
- 每条路径 \(P\) 在算法过程中至多贡献一次到 \(\sum_P y_P\)(因为一旦路径被割,就不再考虑)。
- 最终割的总费用 \(\text{ALG} = \sum_{e \in F} c(e) = \sum_{e \in F} \sum_{P: e \in P} y_P \le 2 \sum_P y_P \le 2 \cdot \text{OPT}\)。
这里系数 2 来源于:每条路径可能被多条选中的边覆盖,但最坏情况下每条路径最多贡献给两条不同的割边(因为路径是简单的,且算法选择最短路径)。因此近似比是 2。
步骤5:算法实现细节
- 在寻找最短路径时,可使用 BFS(因为边权视为单位权,目的是尽快使对偶约束变紧)。
- 需要动态更新每条边的对偶约束左值 \(\sum_{P: e \in P} y_P\)。实现时,可以维护每条边的“剩余容量” \(c(e) - \sum_{P} y_P\),当剩余容量降为 0 时,该边被选中。
- 由于路径数量指数多,实际上不需要显式枚举所有路径。我们可以用以下方法模拟:
- 维护一个变量 \(\delta\) 表示当前对偶增加量。
- 对当前最短路径 \(P\) 上的所有边,按剩余容量比例增加 \(y_P\),直到某条边剩余容量为 0。
- 这等价于找到 \(\min_{e \in P} \text{剩余容量}(e)\),然后将路径上所有边的剩余容量减去该值。
步骤6:举例说明
考虑一个简单图:顶点集 \(V = \{a, b, c, d\}\),边集 \(E = \{(a,b), (b,c), (c,d), (a,d)\}\),顶点移除费用 \(w(a)=2, w(b)=3, w(c)=1, w(d)=4\)。目标是找到最小费用的点割集使图不连通。
- 转化为 \(G'\):每个顶点拆为 \(v_{\text{in}}, v_{\text{out}}\),添加内部边费用 \(w(v)\),原图边改为双向无限容量。
- 选择 \(s = a_{\text{out}}, t = d_{\text{in}}\)。
- 运行原始-对偶算法:
- 初始所有边剩余容量 = 其费用。
- 找到最短路径 \(P_1: a_{\text{out}} \to b_{\text{in}} \to b_{\text{out}} \to c_{\text{in}} \to c_{\text{out}} \to d_{\text{in}}\)(经过顶点 b 和 c)。
- 增加对偶变量,直到边 \((b_{\text{in}}, b_{\text{out}})\) 或 \((c_{\text{in}}, c_{\text{out}})\) 变紧。由于 \(w(c)=1\) 更小,先达到紧边:选中 \(c_{\text{in}} \to c_{\text{out}}\)(对应移除顶点 c)。
- 更新剩余容量后,图仍连通(例如路径 \(a_{\text{out}} \to d_{\text{in}}\) 直接存在,因为 \(a\) 和 \(d\) 有原边)。
- 继续找到最短路径,可能选中 \(a\) 或 \(d\) 的顶点边。
- 最终可能得到点割集 \(\{c, a\}\),费用 \(1+2=3\)。最优解可能是 \(\{b\}\) 费用 3,或 \(\{c\}\) 费用 1(但 \(\{c\}\) 是否使图不连通需验证;此处 \(\{c\}\) 移去后图仍连通?实际上原图是四顶点环,移去 c 后 a-b-d 仍连通,所以 {c} 不是点割集)。算法结果接近最优。
总结
通过顶点拆分和原始-对偶框架,我们为最小点割集问题设计了一个近似比为 2 的多项式时间算法。该算法不仅理论上有保证,还可通过高效的最短路径搜索实现。此方法展示了如何利用线性规划对偶理论将 NP-hard 问题转化为可近似求解的形式。