基于线性规划的图最小k边连通子图问题求解示例
1. 问题描述
我们考虑一个经典的图论与优化问题:最小k边连通子图问题(Minimum k-Edge Connected Spanning Subgraph, k-ECSS)。
- 输入:给定一个无向图 \(G=(V, E)\),其中 \(V\) 是顶点集,\(E\) 是边集。每一条边 \(e \in E\) 都有一个非负的成本 \(c_e\)。同时给定一个正整数 \(k\)(通常 \(k \ge 2\))。
- 目标:找到一个总成本最小的边子集 \(F \subseteq E\),使得由 \(V\) 和 \(F\) 构成的子图是 k边连通 的。这意味着在子图中,任意两个不同的顶点之间至少存在 \(k\) 条边不相交(edge-disjoint)的路径。或者说,删除任意 \(k-1\) 条边后,子图仍然是连通的。
这个问题在网络设计(如通信网络、交通网络)中非常重要,它确保网络在部分边失效时依然保持连通。当 \(k=1\) 时,问题退化为经典的最小生成树问题。对于 \(k \ge 2\),该问题是NP难的,但我们可以利用线性规划松弛和舍入算法来设计近似算法。
2. 整数规划建模
首先,我们为这个问题建立一个整数线性规划(ILP)模型。
对于每条边 \(e \in E\),定义一个决策变量 \(x_e \in \{0, 1\}\):
- \(x_e = 1\) 表示边 \(e\) 被选入子图 \(F\) 中。
- \(x_e = 0\) 表示边 \(e\) 未被选中。
目标是最小化总成本:
\[\min \sum_{e \in E} c_e x_e \]
我们需要约束条件来保证所选子图是k边连通的。在图论中,一个图是k边连通的,当且仅当对于任意非空的顶点真子集 \(S \subset V\),连接 \(S\) 和 \(V \setminus S\) 的边(称为边割)的数量至少为 \(k\)。因此,对于每个非空的 \(S \subset V\),我们要求:
\[\sum_{e \in \delta(S)} x_e \ge k \quad \forall S \subset V, S \neq \emptyset, S \neq V \]
其中 \(\delta(S)\) 表示一个端点位于 \(S\),另一个端点位于 \(V \setminus S\) 的边的集合(即边割)。
此外,变量是二进制的:
\[x_e \in \{0, 1\} \quad \forall e \in E \]
这就是一个完整的整数规划模型。然而,约束数量是指数级的(有 \(2^{|V|} - 2\) 个割约束),直接求解非常困难。
3. 线性规划松弛
为了获得一个可计算的松弛问题,我们将整数约束放宽为连续约束,得到线性规划(LP)松弛:
\[\begin{align*} \text{minimize} \quad & \sum_{e \in E} c_e x_e \\ \text{subject to} \quad & \sum_{e \in \delta(S)} x_e \ge k \quad \forall S \subset V, S \neq \emptyset, S \neq V \\ & 0 \le x_e \le 1 \quad \forall e \in E \end{align*} \]
这个LP仍然有指数多个约束,但它是多项式时间可解的,因为它的分离问题(separation problem)可以在多项式时间内解决。具体来说,给定一个解 \(x\),我们需要检查是否存在一个割 \(S\) 使得 \(\sum_{e \in \delta(S)} x_e < k\)。这等价于检查图(边权为 \(x_e\) )中的最小割值是否小于 \(k\)。而最小割问题可以通过最大流算法(如Stoer-Wagner算法或基于最大流的算法)在多项式时间内求解。因此,我们可以使用椭球法或内点法结合分离Oracle来求解这个LP。
设LP的最优解为 \(x^*\),最优值为 \(OPT_{LP}\)。显然,\(OPT_{LP} \le OPT\),其中 \(OPT\) 是原整数规划的最优值。
4. 算法设计:迭代舍入(Iterative Rounding)
对于最小k边连通子图问题,一个经典的近似算法是基于 迭代舍入 的框架。这个算法的核心思想是:求解LP松弛,如果某些变量 \(x_e^*\) 的值已经接近1(例如,大于等于 \(\frac{1}{2}\)),我们就把这些边固定到解中,然后简化问题,重新求解新的LP,直到所有边都被决定为止。
下面我们详细描述算法的步骤。
步骤0:初始化
设当前边集 \(F = \emptyset\),当前图 \(G' = (V, E)\),当前成本向量 \(c\) 不变。我们需要找到一个边集 \(F\) 使得 \(G'\)(在 \(F\) 中的边)是k边连通的。
步骤1:求解当前图的LP松弛
对于当前图 \(G'\) 和边集 \(E'\),求解上述LP松弛(约束针对当前顶点集 \(V\) 的所有非平凡割)。得到最优解 \(x^*\)。
步骤2:检查并舍入
在最优解 \(x^*\) 中,寻找满足 \(x_e^* \ge \frac{1}{2}\) 的边 \(e\)。根据线性规划的理论(特别是与k边连通相关的多面体性质),可以证明:在任意一个基本可行解(BFS)中,至少存在一条边 \(e\) 满足 \(x_e^* \ge \frac{1}{2}\)。这个性质源于约束矩阵是全幺模矩阵的推广形式以及约束的稀疏性。
因此,我们总能找到至少一条这样的边。将所有满足 \(x_e^* \ge \frac{1}{2}\) 的边 \(e\) 加入解集 \(F\) 中,即令 \(x_e = 1\)(最终解中选中这些边)。
步骤3:调整问题
将所有已选中的边从当前图 \(G'\) 中“固定”:
- 对于每条已选中的边 \(e\),将其从图 \(G'\) 的边集 \(E'\) 中移除(因为已经确定选择它,不需要再考虑)。
- 同时,因为已选中一条边,对于每个割 \(S\) 来说,k边连通的要求可以稍微降低:原来要求割 \(\delta(S)\) 中至少有 \(k\) 条边被选中,现在已经选中了一些边,剩余需要满足的边数相应减少。
更精确地说,设已选边集为 \(F\)。对于任意割 \(S\),令 \(f(S) = |F \cap \delta(S)|\) 表示已选中边中位于该割的数量。那么,剩余需要从当前图 \(G'\) 中选出的边数应满足:
\[\sum_{e \in \delta(S) \cap E'} x_e \ge k - f(S) \]
但注意,在新的LP中,我们将要求的是 \(k' = k - f(S)\)。然而,不同割的 \(f(S)\) 不同,导致每个割的右侧常数不同,这会使LP变得复杂。实际上,迭代舍入算法通常采用另一种等价的简化方式:将已选边“收缩”。
收缩(Contract)一条边 \(e = (u, v)\) 意味着将顶点 \(u\) 和 \(v\) 合并为一个超级顶点,移除所有连接 \(u\) 和 \(v\) 的边(包括 \(e\) 自身),并将所有连接到 \(u\) 或 \(v\) 的边重新连接到这个超级顶点(如果有多重边,则合并,并累加它们的 \(x\) 值)。收缩后,图的顶点数减少,k边连通的要求依然保持(因为已选边保证了 \(u\) 和 \(v\) 之间已经有一条边,合并后不会影响整体连通性要求)。
因此,在步骤3中,对于每条满足 \(x_e^* \ge \frac{1}{2}\) 且被选中的边 \(e\),我们在当前图 \(G'\) 中收缩这条边。收缩后,我们得到一个新图 \(G''\),新图的每条边可能对应原图的多条边(但我们会合并它们的变量)。然后,我们更新 \(G' \leftarrow G''\),并设置新的 \(k\) 不变(因为收缩操作隐式处理了已选边对割的贡献)。
步骤4:迭代
重复步骤1-3,直到当前图 \(G'\) 中所有顶点被收缩为一个顶点(即只剩下一个超级顶点)。此时,所有已选边 \(F\) 构成了原图的一个k边连通生成子图。
步骤5:输出
输出边集 \(F\)。
5. 算法正确性与近似比分析
正确性:算法的每次迭代都选中一些边并收缩它们。由于我们总是选择满足 \(x_e^* \ge \frac{1}{2}\) 的边,并且每次收缩后求解新的LP,最终得到的边集 \(F\) 满足:对于原图的每个割 \(S\),选中的边数至少为 \(k\)。这是因为LP的约束保证了每个割在每次迭代中都满足要求,而收缩操作不会破坏这个性质。因此,\(F\) 确实构成了一个k边连通生成子图。
近似比:我们证明算法是一个2-近似算法,即总成本 \(c(F) \le 2 \cdot OPT_{LP} \le 2 \cdot OPT\)。
证明思路如下:
- 在每次迭代中,我们选择的边 \(e\) 满足 \(x_e^* \ge \frac{1}{2}\)。因此,为这条边支付的成本 \(c_e \le 2 \cdot c_e x_e^*\)。
- 设算法总共进行了 \(T\) 次迭代。每次迭代选择的边集记为 \(F_t\),对应的LP解为 \(x_t^*\)(是当前图的解)。
- 关键点:原问题LP的最优值 \(OPT_{LP}\) 等于所有迭代中各个子问题LP最优值的和(因为收缩操作后,子问题的LP是原LP在已固定变量后的剩余部分)。
- 因此,总成本:
\[ c(F) = \sum_{t=1}^{T} \sum_{e \in F_t} c_e \le \sum_{t=1}^{T} \sum_{e \in F_t} 2 c_e x_{t,e}^* \le 2 \sum_{t=1}^{T} \sum_{e \in E_t} c_e x_{t,e}^* = 2 \cdot OPT_{LP} \]
其中 \(E_t\) 是第 \(t\) 次迭代时当前图的边集。
因此,算法输出的解的成本最多是最优解成本的两倍。
6. 实例演示
考虑一个简单例子:设图 \(G\) 为4个顶点的环 \(C_4\),顶点按顺序为 \(v_1, v_2, v_3, v_4\),边为 \(e_1=(v_1,v_2), e_2=(v_2,v_3), e_3=(v_3,v_4), e_4=(v_4,v_1)\),所有边成本 \(c_e = 1\)。取 \(k=2\)。
我们目标是找到最小成本的2边连通子图。显然,原图本身是2边连通的(实际上每个顶点度为2),总成本为4。但可能存在更便宜的2边连通子图吗?在这个小环中,移除任意一条边都会使图变成一条路径,该路径只是1边连通的(因为移除中间某条边会使图不连通)。因此,必须保留所有4条边才能保证2边连通。所以最优解就是整个环,成本为4。
我们应用迭代舍入算法:
- 初始LP松弛:变量 \(x_1, x_2, x_3, x_4\)。约束为每个割的边变量和至少为2。由于图是对称的,LP最优解可能是 \(x_e^* = \frac{1}{2}\) 对所有边(验证:每个割恰好包含两条边,每条边赋值为 \(\frac{1}{2}\) 则割和为1,不满足≥2;所以这个解不可行。实际上,我们需要更大的值)。更精确地,对于环 \(C_4\),最小割的基数是2(每条割恰好两条边)。为了满足每个割的和≥2,必须所有 \(x_e^* \ge 1\)。但由于上界是1,所以最优解是 \(x_e^* = 1\) 对所有边。因此LP最优值 \(OPT_{LP} = 4\)。
- 由于所有 \(x_e^* = 1 \ge \frac{1}{2}\),算法在第一轮就选中所有四条边,\(F = \{e_1, e_2, e_3, e_4\}\),成本为4。
- 收缩所有边后,图收缩为单个顶点,算法结束。
输出总成本为4,等于最优解。
7. 总结
- 最小k边连通子图问题是一个重要的网络设计问题,是NP难的。
- 通过整数规划建模和线性规划松弛,我们可以得到一个具有指数数量约束但可多项式时间求解的LP。
- 迭代舍入算法通过反复求解LP、选择值至少为 \(\frac{1}{2}\) 的边并收缩,最终构造一个可行解。
- 该算法保证了2倍近似比,并且运行时间在多项式范围内(因为每次迭代至少减少一条边或收缩顶点)。
- 这种方法展示了线性规划松弛与迭代舍入技术在设计组合优化问题近似算法中的强大作用。
这个算法框架可以推广到其他连通性要求的问题,如顶点连通性、有向图连通性等。