基于线性规划的图最小顶点覆盖问题的线性规划舍入近似算法求解示例
题目描述
我们考虑一个无向图 \(G = (V, E)\),其中 \(V = \{1, 2, \dots, n\}\) 是顶点集合,\(E\) 是边集合。一个顶点覆盖是指一个顶点子集 \(S \subseteq V\),使得图中每条边至少有一个端点属于 \(S\)。最小顶点覆盖问题就是找到最小的顶点覆盖,即顶点数最少的覆盖。这是一个经典的NP-hard问题。
本题的目标是:利用线性规划松弛与舍入技巧,设计一个高效的2-近似算法,即找到的顶点覆盖大小不超过最优解大小的2倍,并给出算法的详细步骤和理论分析。
解题过程循序渐进讲解
步骤1:建立整数规划模型
首先,我们对每个顶点 \(i \in V\) 引入一个二进制决策变量 \(x_i \in \{0, 1\}\):
- 若 \(x_i = 1\),表示顶点 \(i\) 被选入覆盖集 \(S\);
- 若 \(x_i = 0\),表示顶点 \(i\) 未被选中。
每条边 \((u, v) \in E\) 必须被覆盖,即至少有一个端点在 \(S\) 中,因此约束条件为:
\[x_u + x_v \ge 1, \quad \forall (u, v) \in E. \]
目标是最小化覆盖的顶点数,即:
\[\min \sum_{i \in V} x_i. \]
这是一个0-1整数线性规划,它精确描述了最小顶点覆盖问题。
步骤2:线性规划松弛
整数规划难以直接求解(因为NP-hard)。我们将其松弛为线性规划:允许变量 \(x_i\) 在 \([0, 1]\) 区间内取实数值,即:
\[0 \le x_i \le 1, \quad \forall i \in V. \]
约束和目标保持不变:
\[\begin{aligned} \text{minimize} \quad & \sum_{i \in V} x_i \\ \text{subject to} \quad & x_u + x_v \ge 1, \quad \forall (u, v) \in E, \\ & 0 \le x_i \le 1, \quad \forall i \in V. \end{aligned} \]
这个线性规划是多项式时间可解的(例如用单纯形法或内点法)。设其最优解为 \(x^* = (x_1^*, \dots, x_n^*)\),最优值为 \(\text{LP}^* = \sum_{i} x_i^*\)。
步骤3:线性规划舍入构造整数解
我们通过一个简单的舍入规则,从分数解 \(x^*\) 构造一个整数解(即真正的顶点覆盖):
- 对每个顶点 \(i\):
- 如果 \(x_i^* \ge 0.5\),则令 \(\hat{x}_i = 1\)(将顶点放入覆盖);
- 否则,令 \(\hat{x}_i = 0\)。
用集合表示为:
\[S = \{ i \in V \mid x_i^* \ge 0.5 \}. \]
步骤4:验证覆盖可行性
我们需要证明 \(S\) 确实是一个顶点覆盖。
对任意边 \((u, v) \in E\),由线性规划约束有:
\[x_u^* + x_v^* \ge 1. \]
如果 \(x_u^* < 0.5\) 且 \(x_v^* < 0.5\),则 \(x_u^* + x_v^* < 1\),与约束矛盾。因此,至少有一个端点(比如 \(u\))满足 \(x_u^* \ge 0.5\),于是 \(u \in S\)。所以每条边都被覆盖,\(S\) 是一个合法的顶点覆盖。
步骤5:近似比分析
设 \(\text{OPT}\) 是原问题(整数规划)的最优值,即最小顶点覆盖的真实大小。显然有:
\[\text{LP}^* \le \text{OPT}, \]
因为线性规划是整数规划的松弛(可行域扩大了)。
现在估计舍入后覆盖的大小 \(|S| = \sum_{i} \hat{x}_i\)。
由舍入规则:
\[\hat{x}_i = \begin{cases} 1, & \text{if } x_i^* \ge 0.5, \\ 0, & \text{otherwise}. \end{cases} \]
那么 \(\hat{x}_i \le 2 x_i^*\),因为当 \(x_i^* \ge 0.5\) 时,\(1 \le 2 x_i^*\);当 \(x_i^* < 0.5\) 时,\(0 \le 2 x_i^*\)。
因此,
\[|S| = \sum_{i} \hat{x}_i \le \sum_{i} 2 x_i^* = 2 \cdot \text{LP}^* \le 2 \cdot \text{OPT}. \]
所以,我们构造的顶点覆盖大小不超过最优解的2倍,即这是一个2-近似算法。
步骤6:算法步骤总结
- 对图 \(G = (V, E)\),写出线性规划松弛:
\[ \begin{aligned} \min \quad & \sum_{i \in V} x_i \\ \text{s.t.} \quad & x_u + x_v \ge 1, \ \forall (u, v) \in E, \\ & 0 \le x_i \le 1, \ \forall i \in V. \end{aligned} \]
- 用线性规划求解器得到最优解 \(x^*\)。
- 对每个顶点 \(i\):若 \(x_i^* \ge 0.5\),则将 \(i\) 加入覆盖集 \(S\)。
- 输出 \(S\) 作为近似最小顶点覆盖。
步骤7:简单算例演示
考虑一个三角形图 \(V = \{1,2,3\}\),边 \(E = \{(1,2),(2,3),(1,3)\}\)。
线性规划:
\[\begin{aligned} \min \quad & x_1 + x_2 + x_3 \\ \text{s.t.} \quad & x_1 + x_2 \ge 1, \\ & x_2 + x_3 \ge 1, \\ & x_1 + x_3 \ge 1, \\ & 0 \le x_i \le 1. \end{aligned} \]
最优解为 \(x_1^* = x_2^* = x_3^* = 0.5\),目标值 \(\text{LP}^* = 1.5\)。
舍入:所有 \(x_i^* = 0.5 \ge 0.5\),所以 \(S = \{1,2,3\}\),大小 \(|S| = 3\)。
实际上最小顶点覆盖的最优解是任选两个顶点(大小2),近似比 \(3/2 = 1.5 \le 2\),满足理论保证。
步骤8:算法复杂度与讨论
- 线性规划可在多项式时间内求解(例如用内点法)。
- 舍入步骤是 \(O(|V|)\) 的,因此整体是多项式时间算法。
- 这个算法是经典的2-近似算法,在实际中简单有效,且近似比2是紧的(存在实例达到2倍)。
- 注意:该算法利用了线性规划松弛的最优解,但也可以不用求解整个线性规划,而用原始-对偶方法在线性时间内得到2-近似解(那是另一个常见算法,但本文的核心是展示线性规划舍入的技巧)。
通过以上步骤,我们完成了基于线性规划舍入的最小顶点覆盖2-近似算法的完整讲解。