基于线性规划的图最小顶点k中心问题的原始-对偶近似算法求解示例
题目描述
考虑一个无向图 \(G = (V, E)\),其中 \(V\) 是顶点集,\(E\) 是边集。每个顶点对之间有一个非负距离 \(d(u,v)\)(满足三角不等式),表示顶点 \(u\) 和 \(v\) 之间的代价或距离。我们要选择 \(k\) 个顶点作为“中心”,使得每个顶点都被分配到离它最近的中心,并最小化所有顶点到其分配中心的最大距离。这个问题称为最小顶点k中心问题(Minimum Vertex k-Center Problem)。它是一种典型的设施选址问题,目标是使最坏情况下的服务距离最小。
这个问题是NP难的,但存在基于线性规划松弛的原始-对偶近似算法,可得到一个2-近似解,即算法解的最大距离不超过最优解的两倍。
解题过程
步骤1:问题建模
设 \(x_{ij}\) 表示顶点 \(i\) 是否分配给顶点 \(j\) 作为中心(\(x_{ij}=1\) 表示分配,否则为0)。但更常见的建模是使用集合覆盖的思路:
定义决策变量 \(y_j\) 表示顶点 \(j\) 是否被选为中心(1为是,0为否)。目标是选择 \(k\) 个中心,并让每个顶点到某个中心的距离不超过某个值 \(D\)。我们可以将问题转化为:对于给定的距离上界 \(D\),是否存在一个选择不超过 \(k\) 个中心的方案,使得所有顶点都在某个中心的距离 \(D\) 范围内?若存在,则最小化 \(D\)。
形式化描述:
\[\text{最小化 } D \]
\[ \text{满足:} \sum_{j \in V} y_j \le k \]
\[ \forall i \in V: \sum_{j: d(i,j) \le D} y_j \ge 1 \]
\[ y_j \in \{0,1\}, \quad D \ge 0 \]
约束解释:
- 选择的中心数不超过 \(k\)。
- 每个顶点 \(i\) 必须至少有一个中心 \(j\) 与之距离不超过 \(D\)。
由于 \(D\) 是变量,直接建模为线性规划较困难。通常采用二分搜索法:对可能的 \(D\) 值进行二分搜索,每次检查是否存在可行的中心选择(即是否满足上述约束)。检查过程可以建模为整数规划,但我们可以用其线性规划松弛来设计近似算法。
步骤2:对偶问题的构造
对于固定的 \(D\),我们考虑一个简化的集合覆盖问题:定义“球” \(B(j) = \{ i \in V: d(i,j) \le D \}\),即所有距离顶点 \(j\) 不超过 \(D\) 的顶点集合。问题转化为:能否选择最多 \(k\) 个球(对应选择中心),覆盖所有顶点?
这是集合覆盖的变种(带基数约束)。我们可以写出其整数规划:
\[\min \sum_{j} y_j \]
\[ \text{s.t. } \sum_{j: i \in B(j)} y_j \ge 1, \quad \forall i \in V \]
\[ \sum_{j} y_j \le k \]
\[ y_j \in \{0,1\} \]
目标是最小化选择的球数量,但我们必须要求选择数量 \(\le k\)。我们可以先解松弛问题,忽略数量约束,然后对偶。
去掉数量约束的原始问题(集合覆盖):
\[\min \sum_{j} y_j \]
\[ \text{s.t. } \sum_{j: i \in B(j)} y_j \ge 1, \quad \forall i \in V \]
\[ y_j \ge 0 \]
其对偶问题为:
\[\max \sum_{i} \alpha_i \]
\[ \text{s.t. } \sum_{i: i \in B(j)} \alpha_i \le 1, \quad \forall j \in V \]
\[ \alpha_i \ge 0, \quad \forall i \in V \]
这里 \(\alpha_i\) 是对偶变量,可以理解为顶点 \(i\) 的“权重”。
步骤3:原始-对偶算法思路
原始-对偶方法:我们同时构造原始解(选择中心的集合 \(S\))和对偶解 \(\alpha\)。算法过程如下(给定距离上界 \(D\)):
- 初始化所有 \(\alpha_i = 0\),所有顶点未覆盖,中心集合 \(S = \emptyset\)。
- 当存在未被覆盖的顶点时:
- 选择一个未被覆盖的顶点 \(i\)。
- 增加其 \(\alpha_i\) 直到某个约束 \(\sum_{i' \in B(j)} \alpha_{i'} \le 1\) 变为紧的(即等于1)对于某个 \(j\)。
- 将顶点 \(j\) 加入中心集合 \(S\)。
- 将 \(B(j)\) 中的所有顶点标记为已覆盖。
- 如果最终 \(|S| > k\),则对于这个 \(D\) 值没有可行解(需增大 \(D\) 重新尝试)。
- 否则,算法成功,返回中心集合 \(S\)。
但我们需要一个近似保证:即使 \(|S| \le k\),返回的解的最大距离可能超过 \(D\),因为算法中一个顶点可能被距离 \(2D\) 的中心覆盖。这是因为:假设顶点 \(i\) 最初被选为增加 \(\alpha_i\) 的起点,它触发了 \(j\) 被选为中心。另一个顶点 \(i'\) 如果距离 \(i\) 不超过 \(D\),则可能在同一次迭代中被覆盖。但若顶点 \(v\) 未被覆盖,它必须距离所有已选中心超过 \(D\)。然而,由于我们的算法在增加 \(\alpha\) 时可能使不同球有重叠,最终每个顶点到最近中心的距离不超过 \(2D\)。
步骤4:算法详述
具体算法(Hochbaum-Shmoys 原始-对偶风格):
- 输入:图 \(G\),距离 \(d\),整数 \(k\)。
- 输出:中心集合 \(S\),满足 \(|S| \le k\) 且最大服务距离不超过 \(2D^*\),其中 \(D^*\) 是最优解的最大距离。
步骤:
- 将所有距离排序,二分搜索可能的 \(D\) 值。
- 对于每个测试的 \(D\):
a. 初始化 \(S = \emptyset\),所有顶点未标记。
b. 当存在未标记顶点时:- 选择一个未标记顶点 \(u\)。
- 找到距离 \(u\) 不超过 \(2D\) 的任意顶点 \(v\)(可以是 \(u\) 本身),将 \(v\) 加入 \(S\)。
- 将所有距离 \(v\) 不超过 \(2D\) 的顶点标记为已覆盖。
c. 如果 \(|S| \le k\),则记录此 \(S\) 为候选解,并尝试更小的 \(D\);否则,尝试更大的 \(D\)。
- 返回满足 \(|S| \le k\) 的最小 \(D\) 对应的解 \(S\)。
这个算法是原始-对偶思想的简化实现,它不显式计算对偶变量,但隐含了类似的对偶上升过程。它能保证:
- 如果存在距离不超过 \(D^*\) 的解,则算法找到的解的最大距离不超过 \(2D^*\)。
- 选择中心数 \(|S| \le k\)(通过二分搜索找到最小的可行 \(D\) 满足 \(|S| \le k\))。
步骤5:近似比证明
关键观察:在算法中,每次迭代选择一个未覆盖顶点 \(u\),并加入一个中心 \(v\) 使得 \(d(u,v) \le D\)。这是因为我们在二分搜索时假设距离 \(D\) 是可行的,所以总存在这样一个顶点 \(v\) 距离 \(u \le D\) 在最优解中。算法实际选择的是距离 \(u \le 2D\) 的 \(v\)(可能不是最优中心,但可以保证覆盖)。这样,任意顶点最终会被距离不超过 \(2D\) 的中心覆盖。
近似比2是最优的,除非P=NP。
步骤6:算法复杂度
- 二分搜索需要 \(O(\log (\max d))\) 次迭代。
- 每次迭代检查所有顶点,每个顶点最多被标记一次,每次需要检查距离,总复杂度 \(O(n^2)\)(对于稠密图)。
- 整体复杂度 \(O(n^2 \log (\max d))\)。
总结
我们针对最小顶点k中心问题,描述了基于线性规划松弛的原始-对偶近似算法。核心是通过二分搜索距离上界 \(D\),并用贪心方法选择中心,保证解的最大距离不超过最优解的两倍。这种方法结合了对偶理论的思想,是组合优化中经典的近似算法设计技巧。