基于线性规划的图最大密度子图问题求解示例
问题描述
图最大密度子图问题旨在从给定无向图 \(G = (V, E)\) 中找到一个顶点子集 \(S \subseteq V\),使得子图 \(G[S]\) 的密度 \(\rho(S) = \frac{|E(S)|}{|S|}\) 最大,其中 \(E(S)\) 是 \(S\) 的边集。该问题在社区发现、网络分析等领域有广泛应用。虽然可通过组合优化方法求解,但利用线性规划(LP)可将其转化为连续优化问题,并通过巧妙建模避免分式目标。
关键思路:线性分数规划转化
密度函数 \(\rho(S)\) 是分式形式,直接处理困难。我们使用 Dinkelbach 算法 的思想:将分式最大化问题转化为一系列线性规划问题。具体步骤如下:
- 问题形式化:
最大化 \(\rho(S) = \frac{\sum_{e \in E} y_e}{\sum_{v \in V} x_v}\),其中 \(x_v \in \{0,1\}\) 表示顶点 \(v\) 是否属于 \(S\),\(y_e \in \{0,1\}\) 表示边 \(e\) 是否完全包含于 \(S\)。
约束条件:若边 \(e = (u,v)\) 被选中(\(y_e = 1\)),则其端点 \(u,v\) 必须属于 \(S\)(即 \(x_u = x_v = 1\))。这一关系可写为线性约束:
\[ y_e \leq x_u,\quad y_e \leq x_v \quad \forall e = (u,v) \in E. \]
- 分式规划线性化:
引入参数 \(\lambda\),定义辅助问题:
\[ F(\lambda) = \max \left\{ \sum_{e \in E} y_e - \lambda \sum_{v \in V} x_v \ \middle|\ y_e \leq x_u, y_e \leq x_v,\ 0 \leq x_v, y_e \leq 1 \right\}. \]
注意:此处放松 \(x_v, y_e\) 为连续变量(在 [0,1] 区间),因目标函数和约束均为线性,LP 的最优解必在顶点取整数值(由约束矩阵的全单模性保证)。
原问题等价于找到 \(\lambda^*\) 使得 \(F(\lambda^*) = 0\),此时 \(\lambda^*\) 即为最大密度。
求解步骤
步骤 1:初始化参数
设置初始密度猜测值 \(\lambda_0\)(如 \(\lambda_0 = 0\)),容忍误差 \(\epsilon > 0\)(如 \(\epsilon = 10^{-6}\))。
步骤 2:迭代求解线性规划
对于第 \(k\) 次迭代(\(k = 0,1,2,\dots\)):
- 求解 LP 问题:
\[ \begin{aligned} \max \quad & \sum_{e \in E} y_e - \lambda_k \sum_{v \in V} x_v \\ \text{s.t.} \quad & y_e \leq x_u,\quad y_e \leq x_v \quad \forall e = (u,v) \in E, \\ & 0 \leq x_v \leq 1,\quad 0 \leq y_e \leq 1. \end{aligned} \]
使用单纯形法或内点法求解,得到最优解 \((x^{(k)}, y^{(k)})\) 和目标值 \(F(\lambda_k)\)。
- 更新密度猜测:
计算当前解的实际密度:
\[ \rho_k = \frac{\sum_{e \in E} y_e^{(k)}}{\sum_{v \in V} x_v^{(k)}} \quad (\text{若 } \sum x_v^{(k)} \neq 0,否则 \rho_k = 0). \]
更新 \(\lambda_{k+1} = \rho_k\).
步骤 3:收敛判断
若 \(|F(\lambda_k)| < \epsilon\)(即 \(\sum y_e^{(k)} - \lambda_k \sum x_v^{(k)}\) 接近 0),则停止迭代;否则返回步骤 2。
步骤 4:提取离散解
最终 LP 解 \((x^*, y^*)\) 为整数(0 或 1),直接得到顶点子集 \(S^* = \{ v \in V \mid x_v^* = 1 \}\)。
实例演示
考虑图 \(G\) 有顶点集 \(V = \{1,2,3,4\}\),边集 \(E = \{(1,2), (2,3), (3,4), (1,3)\}\)。
- 初始化:设 \(\lambda_0 = 0\),\(\epsilon = 0.001\)。
- 迭代 1:
解 LP:最大化 \(\sum y_e - 0 \cdot \sum x_v\),约束为 \(y_e \leq x_u, y_e \leq x_v\)。
最优解为全选(\(x_v = 1, y_e = 1\)),目标值 \(F(0) = 4\)。
密度 \(\rho_0 = 4/4 = 1\),更新 \(\lambda_1 = 1\)。 - 迭代 2:
最大化 \(\sum y_e - 1 \cdot \sum x_v\)。
最优解:选顶点 {1,2,3} 和边 {(1,2),(2,3),(1,3)},目标值 \(F(1) = 3 - 3 \times 1 = 0\)。
收敛,最大密度子图为 {1,2,3},密度为 1。
关键点总结
- 利用 Dinkelbach 算法将分式目标转化为序列线性规划。
- 约束 \(y_e \leq x_u, y_e \leq x_v\) 确保边与顶点的一致性。
- 全单模性保证 LP 解自动为整数,无需整数规划。
- 该方法可扩展至带权图的密度最大化问题。