基于线性规划的图最小顶点覆盖问题的分支定界算法求解示例
字数 4644 2025-12-08 02:33:25

基于线性规划的图最小顶点覆盖问题的分支定界算法求解示例

我将为你讲解如何用分支定界算法求解最小顶点覆盖问题。这是一个经典的组合优化问题,我们首先建立线性规划模型,然后通过分支定界找到整数最优解。


问题描述

最小顶点覆盖问题:给定一个无向图G = (V, E),其中V是顶点集合,E是边集合。一个顶点覆盖是一个顶点子集S ⊆ V,使得图中的每一条边至少有一个端点在S中。我们的目标是找到包含顶点数最少的顶点覆盖。

这是一个NP-hard问题。我们通过以下步骤求解:

  1. 建立整数规划模型
  2. 求解线性规划松弛
  3. 基于松弛解进行分支定界搜索
  4. 得到最优整数解

1. 建立整数规划模型

决策变量
对于每个顶点i ∈ V,定义二元变量:

  • \(x_i = 1\) 表示顶点i被选入覆盖集
  • \(x_i = 0\) 表示顶点i未被选中

目标函数:最小化覆盖中的顶点数

\[\min \sum_{i \in V} x_i \]

约束条件:每条边至少有一个端点被覆盖
对于每条边(i, j) ∈ E:

\[x_i + x_j \geq 1 \]

整数约束

\[x_i \in \{0, 1\}, \quad \forall i \in V \]

这是0-1整数规划问题。如果我们放松整数约束,允许 \(0 \leq x_i \leq 1\),就得到了线性规划松弛。


2. 构建示例图

为了具体说明,考虑一个简单但非平凡的例子:

  • 顶点:V = {1, 2, 3, 4, 5}
  • 边:E = {(1,2), (1,3), (2,3), (2,4), (3,4), (4,5)}

这是一个包含5个顶点、6条边的图。显然,最小顶点覆盖的大小应该是3(比如选择顶点{2,3,4}或{1,4,5}等)。


3. 求解线性规划松弛

首先求解松弛问题(去掉整数约束):

松弛问题

\[\min x_1 + x_2 + x_3 + x_4 + x_5 \]

约束:

\[\begin{aligned} &x_1 + x_2 \geq 1 \quad \text{(边1-2)} \\ &x_1 + x_3 \geq 1 \quad \text{(边1-3)} \\ &x_2 + x_3 \geq 1 \quad \text{(边2-3)} \\ &x_2 + x_4 \geq 1 \quad \text{(边2-4)} \\ &x_3 + x_4 \geq 1 \quad \text{(边3-4)} \\ &x_4 + x_5 \geq 1 \quad \text{(边4-5)} \\ &0 \leq x_i \leq 1, \quad i=1,...,5 \end{aligned} \]

求解松弛
这是一个线性规划,可以用单纯形法求解。我们观察结构:

  • 边(1,2,3)形成一个三角形,覆盖三角形需要至少2个顶点(因为每个边都要覆盖)
  • 顶点4与2、3、5相连
  • 顶点5只与4相连

手工求解思路
由于对称性,尝试对称解。实际上,最优松弛解可以通过互补松弛条件或简单推理得到:

\(x_1 = 0.5, x_2 = 0.5, x_3 = 0.5\) 可以覆盖三角形的三条边(每条边的和=1)
但这样 \(x_2+x_4 \geq 1\) ⇒ 0.5 + \(x_4\) ≥ 1 ⇒ \(x_4\) ≥ 0.5
同样 \(x_3+x_4 \geq 1\) ⇒ 同样要求 \(x_4\) ≥ 0.5
然后 \(x_4+x_5 \geq 1\) ⇒ 0.5 + \(x_5\) ≥ 1 ⇒ \(x_5\) ≥ 0.5

目标值 = 0.5+0.5+0.5+0.5+0.5 = 2.5

检查是否可更小?如果让某个变量=1,可能增加总值。例如,如果设 \(x_1=0, x_2=1, x_3=1\),则三角形覆盖,但值=2。然后 \(x_2+x_4 \geq 1\) ⇒ 1+ \(x_4\) ≥ 1 ⇒ \(x_4\) ≥ 0,但 \(x_3+x_4 \geq 1\) ⇒ 1+ \(x_4\) ≥ 1 ⇒ 自动满足。然而 \(x_4+x_5 \geq 1\) ⇒ 如果 \(x_4=0\),则需要 \(x_5=1\),总值=0+1+1+0+1=3,比2.5大。

实际上,最优松弛解是 \(x_1 = 0.5, x_2 = 0.5, x_3 = 0.5, x_4 = 0.5, x_5 = 0.5\),目标值=2.5。可以验证所有约束都满足(每条边的和=1)。

松弛下界:2.5
整数最优解的上界:我们可以找到一个可行整数解,比如选择{1,2,3,4},大小=4。但更好的是{2,3,4},大小=3。所以初始上界UB=3。

由于2.5 < 3,我们需要分支定界。


4. 分支定界过程

分支定界树搜索过程:

节点0:松弛解 \(x=(0.5,0.5,0.5,0.5,0.5)\),目标值=2.5

  • 下界LB=2.5
  • 当前最好整数解:{2,3,4},大小=3,UB=3

由于松弛解不是全整数,需要分支。选择分支变量:通常选分数值最接近0.5的变量。这里所有都是0.5,可以选\(x_1\)


分支1:固定 \(x_1 = 0\)
子问题变为:

\[\min x_2 + x_3 + x_4 + x_5 \]

约束:

\[\begin{aligned} &x_2 \geq 1 \quad \text{(由}x_1+x_2 \geq 1\text{)} \\ &x_3 \geq 1 \quad \text{(由}x_1+x_3 \geq 1\text{)} \\ &x_2 + x_3 \geq 1 \quad \text{(自动满足,因为}x_2\geq1\text{)} \\ &x_2 + x_4 \geq 1 \quad \text{(自动满足)} \\ &x_3 + x_4 \geq 1 \quad \text{(自动满足)} \\ &x_4 + x_5 \geq 1 \\ &0 \leq x_i \leq 1 \end{aligned} \]

由前两个约束,\(x_2 \geq 1, x_3 \geq 1\),但上限为1,所以 \(x_2=1, x_3=1\)
然后 \(x_4+x_5 \geq 1\)。最小化目标:\(1+1+x_4+x_5 = 2+x_4+x_5\),在 \(x_4+x_5 \geq 1\) 下,最小为3,当 \(x_4=1, x_5=0\)\(x_4=0, x_5=1\) 或分数组合。

松弛解\(x_1=0, x_2=1, x_3=1, x_4=0.5, x_5=0.5\),目标值=3.0
这是整数可行吗?不完全是,但目标值=3.0正好等于当前上界3。任何整数解不会比3更好,所以这个分支的下界=3。

由于下界=3=UB,这个分支不会产生更好的解,剪枝(bound剪枝)。


分支2:固定 \(x_1 = 1\)
子问题:

\[\min 1 + x_2 + x_3 + x_4 + x_5 \]

约束:

\[\begin{aligned} &1 + x_2 \geq 1 \quad \Rightarrow \quad x_2 \geq 0 \text{(无约束)} \\ &1 + x_3 \geq 1 \quad \Rightarrow \quad x_3 \geq 0 \\ &x_2 + x_3 \geq 1 \\ &x_2 + x_4 \geq 1 \\ &x_3 + x_4 \geq 1 \\ &x_4 + x_5 \geq 1 \\ &0 \leq x_i \leq 1 \end{aligned} \]

目标变为常数1 + 最小化 \(x_2+x_3+x_4+x_5\)

观察:由于 \(x_1=1\) 已经覆盖了边(1,2)和(1,3),所以约束 \(x_1+x_2 \geq 1\)\(x_1+x_3 \geq 1\) 变为冗余。但约束 \(x_2+x_3 \geq 1\) 仍然需要,因为边(2,3)未被覆盖。

试着最小化:我们需要覆盖三角形{2,3,4}的边。实际上,子图{2,3,4}构成一个三角形加上边(4,5)。

尝试:设 \(x_2=0.5, x_3=0.5, x_4=0.5, x_5=0.5\),检查约束:

  • \(x_2+x_3=1\) ≥1 ✓
  • \(x_2+x_4=1\) ≥1 ✓
  • \(x_3+x_4=1\) ≥1 ✓
  • \(x_4+x_5=1\) ≥1 ✓
    目标值=1+0.5+0.5+0.5+0.5=3.0

是否可以更小?如果让某个变量=0,可能会迫使其他变量增大。例如,设 \(x_2=0\),则 \(x_2+x_3 \geq 1\)\(x_3 \geq 1\),所以 \(x_3=1\)
然后 \(x_3+x_4 \geq 1\) ⇒ 1+ \(x_4\) ≥1 ⇒ 自动满足,但 \(x_2+x_4 \geq 1\) ⇒ 0+ \(x_4\) ≥1 ⇒ \(x_4=1\)
然后 \(x_4+x_5 \geq 1\) ⇒ 1+ \(x_5\) ≥1 ⇒ 自动满足,最小化让 \(x_5=0\)
目标值=1+0+1+1+0=3.0,相同。

另一个对称情况:\(x_2=1, x_3=0\) 同理。

所以最小松弛值=3.0。下界=3.0。

由于下界=3=UB,这个分支也剪枝。


5. 结论

所有分支都被剪枝,当前最好整数解{2,3,4}(大小为3)即为最优解。

验证:检查{2,3,4}是否覆盖所有边:

  • 边(1,2):顶点2覆盖 ✓
  • 边(1,3):顶点3覆盖 ✓
  • 边(2,3):顶点2或3覆盖 ✓
  • 边(2,4):顶点2或4覆盖 ✓
  • 边(3,4):顶点3或4覆盖 ✓
  • 边(4,5):顶点4覆盖 ✓
    所有边被覆盖。

最小顶点覆盖大小:3


6. 算法总结

  1. 建模:将最小顶点覆盖表示为0-1整数规划
  2. 线性规划松弛:去掉整数约束,得到下界
  3. 分支:选择分数变量,创建两个子问题(固定为0或1)
  4. 定界
    • 如果松弛值 ≥ 当前最好整数解值,剪枝
    • 如果松弛解是整数且值 < 当前最好解,更新最好解
  5. 搜索:深度优先或最佳下界优先搜索分支树
  6. 终止:当所有节点处理完毕,得到最优解

关键点

  • 线性规划松弛提供了最优值的下界
  • 分支定界系统地搜索解空间
  • 剪枝减少搜索量
  • 对于最小顶点覆盖,线性规划松弛总是给出下界,但可能需要很多分支才能找到整数最优解

这个示例展示了如何将组合优化问题转化为整数规划,并通过分支定界算法求解。

基于线性规划的图最小顶点覆盖问题的分支定界算法求解示例 我将为你讲解如何用分支定界算法求解最小顶点覆盖问题。这是一个经典的组合优化问题,我们首先建立线性规划模型,然后通过分支定界找到整数最优解。 问题描述 最小顶点覆盖问题 :给定一个无向图G = (V, E),其中V是顶点集合,E是边集合。一个顶点覆盖是一个顶点子集S ⊆ V,使得图中的每一条边至少有一个端点在S中。我们的目标是找到包含顶点数最少的顶点覆盖。 这是一个NP-hard问题。我们通过以下步骤求解: 建立整数规划模型 求解线性规划松弛 基于松弛解进行分支定界搜索 得到最优整数解 1. 建立整数规划模型 决策变量 : 对于每个顶点i ∈ V,定义二元变量: \( x_ i = 1 \) 表示顶点i被选入覆盖集 \( x_ i = 0 \) 表示顶点i未被选中 目标函数 :最小化覆盖中的顶点数 \[ \min \sum_ {i \in V} x_ i \] 约束条件 :每条边至少有一个端点被覆盖 对于每条边(i, j) ∈ E: \[ x_ i + x_ j \geq 1 \] 整数约束 : \[ x_ i \in \{0, 1\}, \quad \forall i \in V \] 这是0-1整数规划问题。如果我们放松整数约束,允许 \( 0 \leq x_ i \leq 1 \),就得到了线性规划松弛。 2. 构建示例图 为了具体说明,考虑一个简单但非平凡的例子: 顶点:V = {1, 2, 3, 4, 5} 边:E = {(1,2), (1,3), (2,3), (2,4), (3,4), (4,5)} 这是一个包含5个顶点、6条边的图。显然,最小顶点覆盖的大小应该是3(比如选择顶点{2,3,4}或{1,4,5}等)。 3. 求解线性规划松弛 首先求解松弛问题(去掉整数约束): 松弛问题 : \[ \min x_ 1 + x_ 2 + x_ 3 + x_ 4 + x_ 5 \] 约束: \[ \begin{aligned} &x_ 1 + x_ 2 \geq 1 \quad \text{(边1-2)} \\ &x_ 1 + x_ 3 \geq 1 \quad \text{(边1-3)} \\ &x_ 2 + x_ 3 \geq 1 \quad \text{(边2-3)} \\ &x_ 2 + x_ 4 \geq 1 \quad \text{(边2-4)} \\ &x_ 3 + x_ 4 \geq 1 \quad \text{(边3-4)} \\ &x_ 4 + x_ 5 \geq 1 \quad \text{(边4-5)} \\ &0 \leq x_ i \leq 1, \quad i=1,...,5 \end{aligned} \] 求解松弛 : 这是一个线性规划,可以用单纯形法求解。我们观察结构: 边(1,2,3)形成一个三角形,覆盖三角形需要至少2个顶点(因为每个边都要覆盖) 顶点4与2、3、5相连 顶点5只与4相连 手工求解思路 : 由于对称性,尝试对称解。实际上,最优松弛解可以通过互补松弛条件或简单推理得到: 设 \( x_ 1 = 0.5, x_ 2 = 0.5, x_ 3 = 0.5 \) 可以覆盖三角形的三条边(每条边的和=1) 但这样 \( x_ 2+x_ 4 \geq 1 \) ⇒ 0.5 + \( x_ 4 \) ≥ 1 ⇒ \( x_ 4 \) ≥ 0.5 同样 \( x_ 3+x_ 4 \geq 1 \) ⇒ 同样要求 \( x_ 4 \) ≥ 0.5 然后 \( x_ 4+x_ 5 \geq 1 \) ⇒ 0.5 + \( x_ 5 \) ≥ 1 ⇒ \( x_ 5 \) ≥ 0.5 目标值 = 0.5+0.5+0.5+0.5+0.5 = 2.5 检查是否可更小?如果让某个变量=1,可能增加总值。例如,如果设 \( x_ 1=0, x_ 2=1, x_ 3=1 \),则三角形覆盖,但值=2。然后 \( x_ 2+x_ 4 \geq 1 \) ⇒ 1+ \( x_ 4 \) ≥ 1 ⇒ \( x_ 4 \) ≥ 0,但 \( x_ 3+x_ 4 \geq 1 \) ⇒ 1+ \( x_ 4 \) ≥ 1 ⇒ 自动满足。然而 \( x_ 4+x_ 5 \geq 1 \) ⇒ 如果 \( x_ 4=0 \),则需要 \( x_ 5=1 \),总值=0+1+1+0+1=3,比2.5大。 实际上,最优松弛解是 \( x_ 1 = 0.5, x_ 2 = 0.5, x_ 3 = 0.5, x_ 4 = 0.5, x_ 5 = 0.5 \),目标值=2.5。可以验证所有约束都满足(每条边的和=1)。 松弛下界 :2.5 整数最优解的上界 :我们可以找到一个可行整数解,比如选择{1,2,3,4},大小=4。但更好的是{2,3,4},大小=3。所以初始上界UB=3。 由于2.5 < 3,我们需要分支定界。 4. 分支定界过程 分支定界树搜索过程: 节点0 :松弛解 \( x=(0.5,0.5,0.5,0.5,0.5) \),目标值=2.5 下界LB=2.5 当前最好整数解:{2,3,4},大小=3,UB=3 由于松弛解不是全整数,需要分支。选择分支变量:通常选分数值最接近0.5的变量。这里所有都是0.5,可以选\( x_ 1 \)。 分支1 :固定 \( x_ 1 = 0 \) 子问题变为: \[ \min x_ 2 + x_ 3 + x_ 4 + x_ 5 \] 约束: \[ \begin{aligned} &x_ 2 \geq 1 \quad \text{(由}x_ 1+x_ 2 \geq 1\text{)} \\ &x_ 3 \geq 1 \quad \text{(由}x_ 1+x_ 3 \geq 1\text{)} \\ &x_ 2 + x_ 3 \geq 1 \quad \text{(自动满足,因为}x_ 2\geq1\text{)} \\ &x_ 2 + x_ 4 \geq 1 \quad \text{(自动满足)} \\ &x_ 3 + x_ 4 \geq 1 \quad \text{(自动满足)} \\ &x_ 4 + x_ 5 \geq 1 \\ &0 \leq x_ i \leq 1 \end{aligned} \] 由前两个约束,\( x_ 2 \geq 1, x_ 3 \geq 1 \),但上限为1,所以 \( x_ 2=1, x_ 3=1 \)。 然后 \( x_ 4+x_ 5 \geq 1 \)。最小化目标:\( 1+1+x_ 4+x_ 5 = 2+x_ 4+x_ 5 \),在 \( x_ 4+x_ 5 \geq 1 \) 下,最小为3,当 \( x_ 4=1, x_ 5=0 \) 或 \( x_ 4=0, x_ 5=1 \) 或分数组合。 松弛解 :\( x_ 1=0, x_ 2=1, x_ 3=1, x_ 4=0.5, x_ 5=0.5 \),目标值=3.0 这是整数可行吗?不完全是,但目标值=3.0正好等于当前上界3。任何整数解不会比3更好,所以这个分支的下界=3。 由于下界=3=UB,这个分支不会产生更好的解,剪枝(bound剪枝)。 分支2 :固定 \( x_ 1 = 1 \) 子问题: \[ \min 1 + x_ 2 + x_ 3 + x_ 4 + x_ 5 \] 约束: \[ \begin{aligned} &1 + x_ 2 \geq 1 \quad \Rightarrow \quad x_ 2 \geq 0 \text{(无约束)} \\ &1 + x_ 3 \geq 1 \quad \Rightarrow \quad x_ 3 \geq 0 \\ &x_ 2 + x_ 3 \geq 1 \\ &x_ 2 + x_ 4 \geq 1 \\ &x_ 3 + x_ 4 \geq 1 \\ &x_ 4 + x_ 5 \geq 1 \\ &0 \leq x_ i \leq 1 \end{aligned} \] 目标变为常数1 + 最小化 \( x_ 2+x_ 3+x_ 4+x_ 5 \)。 观察 :由于 \( x_ 1=1 \) 已经覆盖了边(1,2)和(1,3),所以约束 \( x_ 1+x_ 2 \geq 1 \) 和 \( x_ 1+x_ 3 \geq 1 \) 变为冗余。但约束 \( x_ 2+x_ 3 \geq 1 \) 仍然需要,因为边(2,3)未被覆盖。 试着最小化:我们需要覆盖三角形{2,3,4}的边。实际上,子图{2,3,4}构成一个三角形加上边(4,5)。 尝试:设 \( x_ 2=0.5, x_ 3=0.5, x_ 4=0.5, x_ 5=0.5 \),检查约束: \( x_ 2+x_ 3=1 \) ≥1 ✓ \( x_ 2+x_ 4=1 \) ≥1 ✓ \( x_ 3+x_ 4=1 \) ≥1 ✓ \( x_ 4+x_ 5=1 \) ≥1 ✓ 目标值=1+0.5+0.5+0.5+0.5=3.0 是否可以更小?如果让某个变量=0,可能会迫使其他变量增大。例如,设 \( x_ 2=0 \),则 \( x_ 2+x_ 3 \geq 1 \) ⇒ \( x_ 3 \geq 1 \),所以 \( x_ 3=1 \)。 然后 \( x_ 3+x_ 4 \geq 1 \) ⇒ 1+ \( x_ 4 \) ≥1 ⇒ 自动满足,但 \( x_ 2+x_ 4 \geq 1 \) ⇒ 0+ \( x_ 4 \) ≥1 ⇒ \( x_ 4=1 \)。 然后 \( x_ 4+x_ 5 \geq 1 \) ⇒ 1+ \( x_ 5 \) ≥1 ⇒ 自动满足,最小化让 \( x_ 5=0 \)。 目标值=1+0+1+1+0=3.0,相同。 另一个对称情况:\( x_ 2=1, x_ 3=0 \) 同理。 所以最小松弛值=3.0。下界=3.0。 由于下界=3=UB,这个分支也剪枝。 5. 结论 所有分支都被剪枝,当前最好整数解{2,3,4}(大小为3)即为最优解。 验证 :检查{2,3,4}是否覆盖所有边: 边(1,2):顶点2覆盖 ✓ 边(1,3):顶点3覆盖 ✓ 边(2,3):顶点2或3覆盖 ✓ 边(2,4):顶点2或4覆盖 ✓ 边(3,4):顶点3或4覆盖 ✓ 边(4,5):顶点4覆盖 ✓ 所有边被覆盖。 最小顶点覆盖大小 :3 6. 算法总结 建模 :将最小顶点覆盖表示为0-1整数规划 线性规划松弛 :去掉整数约束,得到下界 分支 :选择分数变量,创建两个子问题(固定为0或1) 定界 : 如果松弛值 ≥ 当前最好整数解值,剪枝 如果松弛解是整数且值 < 当前最好解,更新最好解 搜索 :深度优先或最佳下界优先搜索分支树 终止 :当所有节点处理完毕,得到最优解 关键点 : 线性规划松弛提供了最优值的下界 分支定界系统地搜索解空间 剪枝减少搜索量 对于最小顶点覆盖,线性规划松弛总是给出下界,但可能需要很多分支才能找到整数最优解 这个示例展示了如何将组合优化问题转化为整数规划,并通过分支定界算法求解。