基于线性规划的图最小带权点覆盖问题的原始-对偶近似算法求解示例
字数 4491 2025-12-11 09:27:07

基于线性规划的图最小带权点覆盖问题的原始-对偶近似算法求解示例

我将为您讲解线性规划在图算法中的一个经典应用:如何用原始-对偶方法设计近似算法来求解“最小带权点覆盖”问题。我们循序渐进地讲解。


1. 问题描述

最小带权点覆盖问题

  • 给定一个无向图 \(G = (V, E)\),其中每个顶点 \(v \in V\) 有一个正权值 \(w(v) > 0\)
  • 目标是找到一个顶点子集 \(S \subseteq V\),使得每条边 \(e \in E\) 至少有一个端点在 \(S\) 中(即 \(S\) 是一个点覆盖),并且所选顶点总权值 \(\sum_{v \in S} w(v)\) 尽可能小。

这是一个经典的 NP-hard 问题。当所有权值相同时,是标准的最小点覆盖问题。我们希望通过线性规划松弛和原始-对偶方法,设计一个能在多项式时间内运行、并保证近似比(解的质量上界)的算法。


2. 整数规划建模

我们为每个顶点 \(v\) 引入一个 0/1 决策变量 \(x_v\)

\[x_v = \begin{cases} 1, & \text{如果顶点 } v \text{ 被选中进入点覆盖集合 } S, \\ 0, & \text{否则}. \end{cases} \]

整数规划模型

\[\begin{aligned} \min \quad & \sum_{v \in V} w(v) x_v \\ \text{s.t.} \quad & x_u + x_v \geq 1, \quad \forall (u,v) \in E, \\ & x_v \in \{0,1\}, \quad \forall v \in V. \end{aligned} \]

  • 目标函数:最小化所选顶点总权值。
  • 约束条件:对每条边 \((u,v)\),至少有一个端点的 \(x\) 值为 1(即至少有一个顶点在覆盖中)。

3. 线性规划松弛与对偶

松弛整数约束,得到线性规划(LP)松弛:

\[\begin{aligned} \min \quad & \sum_{v \in V} w(v) x_v \\ \text{s.t.} \quad & x_u + x_v \geq 1, \quad \forall (u,v) \in E, \\ & x_v \geq 0, \quad \forall v \in V. \end{aligned} \]

注意这里去掉了 \(x_v \leq 1\) 的限制,因为如果 \(x_v > 1\),必然不最优(会增加目标值)。实际上最优解中一定有 \(x_v \le 1\)


构造其对偶问题

  • 为每条边 \(e = (u,v) \in E\) 引入对偶变量 \(y_e \ge 0\)
  • 对偶线性规划为:

\[\begin{aligned} \max \quad & \sum_{e \in E} y_e \\ \text{s.t.} \quad & \sum_{e: v \in e} y_e \leq w(v), \quad \forall v \in V, \\ & y_e \geq 0, \quad \forall e \in E. \end{aligned} \]

  • 解释:对偶变量 \(y_e\) 可以理解为边 \(e\) 的“价格”或“收益”。约束条件是说,对于每个顶点 \(v\),关联到它的所有边的 \(y_e\) 之和不超过该顶点的权值 \(w(v)\)。目标函数是最大化所有边的总价格。

4. 原始-对偶近似算法思想

原始-对偶方法常用于设计组合优化问题的近似算法,其一般步骤是:

  1. 从原始可行解(通常全为 0)和对偶可行解(通常全为 0)开始。
  2. 逐步增加对偶变量(“提升”对偶解),直到某些对偶约束变为紧的(等号成立)。
  3. 根据紧约束选取原始解(顶点),构造一个整数可行解(点覆盖)。
  4. 证明这个整数解的总权值不超过对偶目标值的某个倍数,从而得到近似比保证。

5. 具体算法步骤

算法:最小带权点覆盖的原始-对偶近似算法

  1. 初始化

    • 设原始变量 \(x_v = 0\)(对所有 \(v \in V\))。
    • 设对偶变量 \(y_e = 0\)(对所有 \(e \in E\))。
    • 设边集合 \(E' = E\)(初始为所有边)。
  2. 循环迭代

    • 只要 \(E'\) 非空(即还有未被覆盖的边),执行:
      a. 选择一条边 \(e = (u,v) \in E'\)
      b. 同时增加 \(y_e\),直到存在某个顶点 \(p \in \{u,v\}\) 使得其关联边的 \(y\) 之和等于其权值 \(w(p)\)(即对偶约束变为紧的)。记录这个顶点 \(p\)
      c. 将 \(p\) 加入点覆盖集合 \(S\)(即令 \(x_p = 1\))。
      d. 从 \(E'\) 中移除所有与 \(p\) 相关联的边(因为它们已被覆盖)。
  3. 输出:集合 \(S\) 即为点覆盖。


6. 算法演示(简单例子)

考虑一个三角形图(3 个顶点 \(a,b,c\),边 \((a,b), (b,c), (a,c)\)),权值:\(w(a)=3, w(b)=4, w(c)=5\)

  1. 初始化:\(x_a=x_b=x_c=0\)\(y_{ab}=y_{bc}=y_{ac}=0\)\(E' = \{(a,b),(b,c),(a,c)\}\)
  2. 迭代 1:
    • 选边 \((a,b)\),增加 \(y_{ab}\)
    • 约束检查:顶点 \(a\) 的约束:\(y_{ab} + y_{ac} \le 3\),顶点 \(b\) 的约束:\(y_{ab}+y_{bc} \le 4\)
    • 增加 \(y_{ab}\) 到 3 时,顶点 \(a\) 的约束变紧(因为目前 \(y_{ac}=0\),所以 \(y_{ab}=3\) 时等于 \(w(a)=3\))。
    • \(a\) 加入 \(S\)\(x_a=1\)
    • \(E'\) 中移除与 \(a\) 相关的边:\((a,b)\)\((a,c)\)。现在 \(E' = \{(b,c)\}\)
  3. 迭代 2:
    • 选边 \((b,c)\),增加 \(y_{bc}\)
    • 顶点 \(b\) 的约束:目前 \(y_{ab}=3\) 已计入,但 \(b\) 尚未被选,约束为 \(y_{ab}+y_{bc} \le 4\)\(3 + y_{bc} \le 4\),所以 \(y_{bc}\) 最多增加到 1 就会使顶点 \(b\) 的约束变紧。
    • 顶点 \(c\) 的约束:\(y_{bc} + y_{ac} \le 5\),目前 \(y_{ac}=0\),所以 \(y_{bc}\) 增加到 1 不会使 \(c\) 的约束变紧。
    • 因此增加 \(y_{bc}\) 到 1,顶点 \(b\) 约束变紧。
    • \(b\) 加入 \(S\)\(x_b=1\)
    • 移除边 \((b,c)\)\(E'\) 变为空。
  4. 算法结束,输出 \(S = \{a,b\}\)
  5. 总权值 = \(3+4=7\)

7. 算法正确性与近似比分析

正确性

  • 每次迭代,算法至少选择一条未被覆盖的边,并将其至少一个端点加入 \(S\)
  • 当算法终止时,所有边至少有一个端点在 \(S\) 中,所以 \(S\) 是一个点覆盖。

近似比证明(近似比 = 2):

  • 设算法输出的点覆盖为 \(S\),其总权值为 \(\sum_{v \in S} w(v)\)
  • 算法过程中,当我们把顶点 \(v\) 加入 \(S\) 时,必定是因为存在一条边 \(e\) 使得增加 \(y_e\) 导致 \(v\) 的对偶约束变紧,即:

\[ \sum_{e: v \in e} y_e = w(v). \]

  • 因此,对每个 \(v \in S\),有 \(w(v) = \sum_{e: v \in e} y_e\)
  • 于是:

\[ \sum_{v \in S} w(v) = \sum_{v \in S} \sum_{e: v \in e} y_e. \]

  • 交换求和顺序,上式等于 \(\sum_{e \in E} y_e \cdot |\{v \in S : v \in e\}|\)
  • 对每条边 \(e = (u,v)\),算法保证至少有一个端点在 \(S\) 中,但可能两个端点都在 \(S\)(即一条边可能被两个顶点覆盖)。
  • 所以 \(|\{v \in S : v \in e\}| \le 2\)
  • 因此:

\[ \sum_{v \in S} w(v) \le 2 \sum_{e \in E} y_e. \]

  • 由线性规划弱对偶定理,任意对偶可行解的目标值 \(\sum_{e} y_e\) 不超过原始线性规划松弛的最优值 \(OPT_{LP}\)
  • 而原始整数规划的最优值 \(OPT_{IP} \ge OPT_{LP}\)
  • 所以:

\[ \sum_{v \in S} w(v) \le 2 \cdot OPT_{LP} \le 2 \cdot OPT_{IP}. \]

  • 因此,算法是 2-近似的。

8. 算法复杂度与特点

  • 每次迭代至少覆盖一条边,至多 \(|E|\) 次迭代。
  • 每次迭代中,增加一条边的对偶变量直到某个顶点约束变紧,这可以在常数时间内通过比较相关顶点的“剩余权值”实现。
  • 总复杂度为 \(O(|E|)\)(如果使用合适的数据结构跟踪每个顶点的当前对偶约束和程度)。
  • 这是一个非常简洁、高效的组合算法,不需求解线性规划,但利用了对偶理论来保证近似比。

9. 小结

我们通过以下步骤解决了最小带权点覆盖问题的近似算法设计:

  1. 建立整数规划模型。
  2. 松弛为线性规划,写出对偶问题。
  3. 设计原始-对偶迭代算法:从对偶全 0 开始,逐步增加对偶变量,当对偶约束变紧时选择顶点,并覆盖相关边。
  4. 证明了算法输出是可行点覆盖,且总权值不超过最优解的 2 倍(2-近似)。
  5. 该算法是高效的组合算法,复杂度为 \(O(|E|)\)

这个示例展示了如何将线性规划对偶理论与组合算法设计巧妙结合,得到具有理论保证的近似算法。

基于线性规划的图最小带权点覆盖问题的原始-对偶近似算法求解示例 我将为您讲解线性规划在图算法中的一个经典应用:如何用原始-对偶方法设计近似算法来求解“最小带权点覆盖”问题。我们循序渐进地讲解。 1. 问题描述 最小带权点覆盖问题 : 给定一个无向图 \( G = (V, E) \),其中每个顶点 \( v \in V \) 有一个正权值 \( w(v) > 0 \)。 目标是找到一个顶点子集 \( S \subseteq V \),使得每条边 \( e \in E \) 至少有一个端点在 \( S \) 中(即 \( S \) 是一个点覆盖),并且所选顶点总权值 \( \sum_ {v \in S} w(v) \) 尽可能小。 这是一个经典的 NP-hard 问题 。当所有权值相同时,是标准的最小点覆盖问题。我们希望通过线性规划松弛和原始-对偶方法,设计一个能在多项式时间内运行、并保证近似比(解的质量上界)的算法。 2. 整数规划建模 我们为每个顶点 \( v \) 引入一个 0/1 决策变量 \( x_ v \): \[ x_ v = \begin{cases} 1, & \text{如果顶点 } v \text{ 被选中进入点覆盖集合 } S, \\ 0, & \text{否则}. \end{cases} \] 整数规划模型 : \[ \begin{aligned} \min \quad & \sum_ {v \in V} w(v) x_ v \\ \text{s.t.} \quad & x_ u + x_ v \geq 1, \quad \forall (u,v) \in E, \\ & x_ v \in \{0,1\}, \quad \forall v \in V. \end{aligned} \] 目标函数:最小化所选顶点总权值。 约束条件:对每条边 \( (u,v) \),至少有一个端点的 \( x \) 值为 1(即至少有一个顶点在覆盖中)。 3. 线性规划松弛与对偶 松弛整数约束 ,得到线性规划(LP)松弛: \[ \begin{aligned} \min \quad & \sum_ {v \in V} w(v) x_ v \\ \text{s.t.} \quad & x_ u + x_ v \geq 1, \quad \forall (u,v) \in E, \\ & x_ v \geq 0, \quad \forall v \in V. \end{aligned} \] 注意这里去掉了 \( x_ v \leq 1 \) 的限制,因为如果 \( x_ v > 1 \),必然不最优(会增加目标值)。实际上最优解中一定有 \( x_ v \le 1 \)。 构造其对偶问题 : 为每条边 \( e = (u,v) \in E \) 引入对偶变量 \( y_ e \ge 0 \)。 对偶线性规划为: \[ \begin{aligned} \max \quad & \sum_ {e \in E} y_ e \\ \text{s.t.} \quad & \sum_ {e: v \in e} y_ e \leq w(v), \quad \forall v \in V, \\ & y_ e \geq 0, \quad \forall e \in E. \end{aligned} \] 解释:对偶变量 \( y_ e \) 可以理解为边 \( e \) 的“价格”或“收益”。约束条件是说,对于每个顶点 \( v \),关联到它的所有边的 \( y_ e \) 之和不超过该顶点的权值 \( w(v) \)。目标函数是最大化所有边的总价格。 4. 原始-对偶近似算法思想 原始-对偶方法常用于设计组合优化问题的近似算法,其一般步骤是: 从原始可行解(通常全为 0)和对偶可行解(通常全为 0)开始。 逐步增加对偶变量(“提升”对偶解),直到某些对偶约束变为紧的(等号成立)。 根据紧约束选取原始解(顶点),构造一个整数可行解(点覆盖)。 证明这个整数解的总权值不超过对偶目标值的某个倍数,从而得到近似比保证。 5. 具体算法步骤 算法:最小带权点覆盖的原始-对偶近似算法 初始化 : 设原始变量 \( x_ v = 0 \)(对所有 \( v \in V \))。 设对偶变量 \( y_ e = 0 \)(对所有 \( e \in E \))。 设边集合 \( E' = E \)(初始为所有边)。 循环迭代 : 只要 \( E' \) 非空(即还有未被覆盖的边),执行: a. 选择一条边 \( e = (u,v) \in E' \)。 b. 同时增加 \( y_ e \),直到存在某个顶点 \( p \in \{u,v\} \) 使得其关联边的 \( y \) 之和等于其权值 \( w(p) \)(即对偶约束变为紧的)。记录这个顶点 \( p \)。 c. 将 \( p \) 加入点覆盖集合 \( S \)(即令 \( x_ p = 1 \))。 d. 从 \( E' \) 中移除所有与 \( p \) 相关联的边(因为它们已被覆盖)。 输出 :集合 \( S \) 即为点覆盖。 6. 算法演示(简单例子) 考虑一个三角形图(3 个顶点 \( a,b,c \),边 \( (a,b), (b,c), (a,c) \)),权值:\( w(a)=3, w(b)=4, w(c)=5 \)。 初始化:\( x_ a=x_ b=x_ c=0 \),\( y_ {ab}=y_ {bc}=y_ {ac}=0 \),\( E' = \{(a,b),(b,c),(a,c)\} \)。 迭代 1: 选边 \( (a,b) \),增加 \( y_ {ab} \)。 约束检查:顶点 \( a \) 的约束:\( y_ {ab} + y_ {ac} \le 3 \),顶点 \( b \) 的约束:\( y_ {ab}+y_ {bc} \le 4 \)。 增加 \( y_ {ab} \) 到 3 时,顶点 \( a \) 的约束变紧(因为目前 \( y_ {ac}=0 \),所以 \( y_ {ab}=3 \) 时等于 \( w(a)=3 \))。 将 \( a \) 加入 \( S \),\( x_ a=1 \)。 从 \( E' \) 中移除与 \( a \) 相关的边:\( (a,b) \) 和 \( (a,c) \)。现在 \( E' = \{(b,c)\} \)。 迭代 2: 选边 \( (b,c) \),增加 \( y_ {bc} \)。 顶点 \( b \) 的约束:目前 \( y_ {ab}=3 \) 已计入,但 \( b \) 尚未被选,约束为 \( y_ {ab}+y_ {bc} \le 4 \) 即 \( 3 + y_ {bc} \le 4 \),所以 \( y_ {bc} \) 最多增加到 1 就会使顶点 \( b \) 的约束变紧。 顶点 \( c \) 的约束:\( y_ {bc} + y_ {ac} \le 5 \),目前 \( y_ {ac}=0 \),所以 \( y_ {bc} \) 增加到 1 不会使 \( c \) 的约束变紧。 因此增加 \( y_ {bc} \) 到 1,顶点 \( b \) 约束变紧。 将 \( b \) 加入 \( S \),\( x_ b=1 \)。 移除边 \( (b,c) \),\( E' \) 变为空。 算法结束,输出 \( S = \{a,b\} \)。 总权值 = \( 3+4=7 \)。 7. 算法正确性与近似比分析 正确性 : 每次迭代,算法至少选择一条未被覆盖的边,并将其至少一个端点加入 \( S \)。 当算法终止时,所有边至少有一个端点在 \( S \) 中,所以 \( S \) 是一个点覆盖。 近似比证明 (近似比 = 2): 设算法输出的点覆盖为 \( S \),其总权值为 \( \sum_ {v \in S} w(v) \)。 算法过程中,当我们把顶点 \( v \) 加入 \( S \) 时,必定是因为存在一条边 \( e \) 使得增加 \( y_ e \) 导致 \( v \) 的对偶约束变紧,即: \[ \sum_ {e: v \in e} y_ e = w(v). \] 因此,对每个 \( v \in S \),有 \( w(v) = \sum_ {e: v \in e} y_ e \)。 于是: \[ \sum_ {v \in S} w(v) = \sum_ {v \in S} \sum_ {e: v \in e} y_ e. \] 交换求和顺序,上式等于 \( \sum_ {e \in E} y_ e \cdot |\{v \in S : v \in e\}| \)。 对每条边 \( e = (u,v) \),算法保证至少有一个端点在 \( S \) 中,但 可能两个端点都在 \( S \) 中 (即一条边可能被两个顶点覆盖)。 所以 \( |\{v \in S : v \in e\}| \le 2 \)。 因此: \[ \sum_ {v \in S} w(v) \le 2 \sum_ {e \in E} y_ e. \] 由线性规划弱对偶定理,任意对偶可行解的目标值 \( \sum_ {e} y_ e \) 不超过原始线性规划松弛的最优值 \( OPT_ {LP} \)。 而原始整数规划的最优值 \( OPT_ {IP} \ge OPT_ {LP} \)。 所以: \[ \sum_ {v \in S} w(v) \le 2 \cdot OPT_ {LP} \le 2 \cdot OPT_ {IP}. \] 因此,算法是 2-近似的。 8. 算法复杂度与特点 每次迭代至少覆盖一条边,至多 \( |E| \) 次迭代。 每次迭代中,增加一条边的对偶变量直到某个顶点约束变紧,这可以在常数时间内通过比较相关顶点的“剩余权值”实现。 总复杂度为 \( O(|E|) \)(如果使用合适的数据结构跟踪每个顶点的当前对偶约束和程度)。 这是一个非常简洁、高效的组合算法,不需求解线性规划,但利用了对偶理论来保证近似比。 9. 小结 我们通过以下步骤解决了最小带权点覆盖问题的近似算法设计: 建立整数规划模型。 松弛为线性规划,写出对偶问题。 设计原始-对偶迭代算法:从对偶全 0 开始,逐步增加对偶变量,当对偶约束变紧时选择顶点,并覆盖相关边。 证明了算法输出是可行点覆盖,且总权值不超过最优解的 2 倍(2-近似)。 该算法是高效的组合算法,复杂度为 \( O(|E|) \)。 这个示例展示了如何将线性规划对偶理论与组合算法设计巧妙结合,得到具有理论保证的近似算法。