基于线性规划的图最大闭合子图问题求解示例
题目描述
最大闭合子图问题(Maximum Closure Problem)是图论与线性规划结合的一个经典问题。给定一个有向图 \(G = (V, E)\),每个顶点 \(v \in V\) 有一个权重 \(w_v\)(可为正、负或零)。闭合子图(Closure)指顶点子集 \(S \subseteq V\),满足:若 \(u \in S\) 且存在有向边 \((u, v) \in E\),则 \(v \in S\)(即从 \(S\) 中顶点出发的边必须指向 \(S\) 内部)。目标是选择闭合子图 \(S\),使其权重和 \(\sum_{v \in S} w_v\) 最大。
应用场景
例如在项目管理中,顶点代表任务(权重为收益),边代表依赖关系(任务 \(u\) 完成后才能启动 \(v\))。最大闭合子图对应收益最大的可行任务集合。
解题过程
- 问题建模为线性规划
引入决策变量 \(x_v \in \{0, 1\}\):若 \(x_v = 1\) 表示顶点 \(v\) 被选入 \(S\),否则为 0。目标函数为最大化总权重:
\[ \max \sum_{v \in V} w_v x_v \]
闭合性约束:对每条边 \((u, v) \in E\),若 \(u\) 被选(\(x_u = 1\)),则 \(v\) 必须被选(\(x_v = 1\)),即 \(x_u \leq x_v\)。整体模型为:
\[ \begin{align} \max \quad & \sum_{v \in V} w_v x_v \\ \text{s.t.} \quad & x_u \leq x_v, \quad \forall (u, v) \in E \\ & x_v \in \{0, 1\}, \quad \forall v \in V \end{align} \]
-
整数规划松弛为线性规划
将 \(x_v \in \{0, 1\}\) 松弛为 \(0 \leq x_v \leq 1\)。由于约束矩阵是全单模的(Totally Unimodular),线性规划的最优解自动为整数解(0 或 1),因此可直接用线性规划求解。 -
构造对偶问题(最小割模型)
通过最大流/最小割算法高效求解:- 构建流网络:添加源点 \(s\) 和汇点 \(t\)。
- 对权重 \(w_v > 0\) 的顶点,从 \(s\) 向 \(v\) 连容量 \(w_v\) 的边(选 \(v\) 获益)。
- 对权重 \(w_v < 0\) 的顶点,从 \(v\) 向 \(t\) 连容量 \(-w_v\) 的边(不选 \(v\) 避免损失)。
- 对每条边 \((u, v) \in E\),从 \(u\) 向 \(v\) 连容量 \(\infty\) 的边(保证闭合性)。
- 计算 \(s-t\) 最小割:割集将顶点分为包含 \(s\) 的集合 \(S\) 和包含 \(t\) 的集合 \(T\)。
- 最大闭合子图即为 \(S \setminus \{s\}\),其权重 = 正权重之和 − 最小割容量。
- 构建流网络:添加源点 \(s\) 和汇点 \(t\)。
-
示例计算
考虑图:顶点集 \(V = \{1, 2, 3\}\),边 \((1, 2), (1, 3)\),权重 \(w_1 = 3, w_2 = -2, w_3 = -1\)。- 正权重和 = \(3\)。
- 建流网络:\(s \to 1\)(容量 3),\(2 \to t\)(容量 2),\(3 \to t\)(容量 1),边 \((1,2)\) 和 \((1,3)\) 容量 \(\infty\)。
- 最小割:割集 \(\{s, 1, 2, 3\} / \{t\}\) 容量 = \(2 + 1 = 3\)(割边为 \(2 \to t, 3 \to t\)),或割集 \(\{s\} / \{1,2,3,t\}\) 容量 = 3(割边为 \(s \to 1\))。最小割容量 = 3。
- 最大闭合子图权重 = \(3 - 3 = 0\),即 \(S = \emptyset\)(选顶点 1 必选 2 和 3,总权重 \(3 - 2 - 1 = 0\),不如不选)。
-
算法总结
通过线性规划松弛和网络流转化,将 NP-hard 的整数规划问题转化为多项式时间可解问题,体现了线性规划在图优化中的强大作用。