基于线性规划的集合覆盖问题求解示例
字数 1706 2025-11-10 00:38:55
基于线性规划的集合覆盖问题求解示例
题目描述
集合覆盖问题是组合优化中的经典问题,其目标是用最少的集合覆盖一个全集的所有元素。具体来说,给定一个全集 \(U = \{1, 2, ..., m\}\) 和一系列子集 \(S_1, S_2, ..., S_n \subseteq U\),每个子集有一个成本 \(c_j > 0\)。问题要求选择一组总成本最小的子集,使得它们的并集包含 \(U\) 的所有元素。
线性规划建模
- 定义决策变量:对每个子集 \(S_j\),引入二进制变量 \(x_j \in \{0, 1\}\),其中 \(x_j = 1\) 表示选择子集 \(S_j\),否则为 0。
- 目标函数:最小化总成本 \(\min \sum_{j=1}^n c_j x_j\)。
- 约束条件:对每个元素 \(i \in U\),要求至少有一个包含它的子集被选中,即 \(\sum_{j: i \in S_j} x_j \geq 1\)。
- 松弛为线性规划:将整数约束 \(x_j \in \{0,1\}\) 松弛为 \(0 \leq x_j \leq 1\),得到线性规划模型:
\[ \begin{aligned} \min \quad & \sum_{j=1}^n c_j x_j \\ \text{s.t.} \quad & \sum_{j: i \in S_j} x_j \geq 1, \quad \forall i \in U, \\ & 0 \leq x_j \leq 1, \quad \forall j=1,\dots,n. \end{aligned} \]
求解步骤
-
输入数据:
- 假设 \(U = \{1,2,3\}\),子集及成本为:
\(S_1 = \{1,2\}, c_1=3\);
\(S_2 = \{2,3\}, c_2=2\);
\(S_3 = \{1,3\}, c_3=4\)。
- 假设 \(U = \{1,2,3\}\),子集及成本为:
-
构建线性规划模型:
- 目标函数:\(\min 3x_1 + 2x_2 + 4x_3\)。
- 约束:
- 元素1被覆盖:\(x_1 + x_3 \geq 1\);
- 元素2被覆盖:\(x_1 + x_2 \geq 1\);
- 元素3被覆盖:\(x_2 + x_3 \geq 1\)。
- 变量范围:\(0 \leq x_1, x_2, x_3 \leq 1\)。
-
求解线性规划松弛:
- 使用单纯形法或内点法求解。通过计算得到最优解:
\(x_1 = 0.5, x_2 = 0.5, x_3 = 0.5\),目标值 \(= 4.5\)。 - 该解是整数规划的松弛下界。
- 使用单纯形法或内点法求解。通过计算得到最优解:
-
整数解启发式构造:
- 舍入法:根据松弛解的值,优先选择值较大的变量。
- 例如,设定阈值 0.5,选择所有 \(x_j \geq 0.5\) 的子集,即选择 \(S_1, S_2, S_3\),总成本为 9。
- 但此解非最优,可进一步优化。
- 贪心法:每次选择“单位成本覆盖新元素数”最高的子集:
- 初始未覆盖元素 \(U = \{1,2,3\}\)。
- \(S_1\) 单位成本覆盖元素数:\(2/3 \approx 0.67\);
\(S_2\):\(2/2 = 1\);
\(S_3\):\(2/4 = 0.5\)。选择 \(S_2\),覆盖元素 \(\{2,3\}\)。 - 剩余未覆盖元素 \(\{1\}\),可选 \(S_1\)(成本3)或 \(S_3\)(成本4),选择 \(S_1\)。
- 最终解为 \(\{S_1, S_2\}\),总成本 5。
- 舍入法:根据松弛解的值,优先选择值较大的变量。
-
验证最优性:
- 松弛下界为 4.5,整数解成本 5,差距 0.5,说明贪心解接近最优。
关键点总结
- 线性规划松弛提供问题下界,指导启发式算法。
- 贪心策略在实际中常有效,但最优性需通过更精确的整数规划方法(如分支定界)保证。