相关笔记
- 前置笔记:第34章_NP完全性-章节汇总
- 关联概念:34.3 经典NP完全问题、图论、二部图
- 章节汇总:第35章_近似算法-章节汇总
概览
本节是第35章”近似算法”的开篇,介绍近似算法(approximation algorithm)的基本理论框架,并以顶点覆盖问题(vertex cover problem)作为第一个完整案例进行深入分析。首先,我们阐述近似算法的动机——NP完全问题无法在多项式时间内精确求解(除非 P=NP),因此需要在多项式时间内找到”足够好”的解。接着,我们严格定义近似比(approximation ratio),区分最小化问题与最大化问题中的不同表述。在此基础上,我们引入APX类(APX complexity class)的概念——存在常数因子近似算法的NP优化问题类。随后,我们回顾顶点覆盖问题的定义与NP完全性,详细展示 APPROX-VERTEX-COVER 贪心算法的伪代码与执行流程,并通过逐步推导证明该算法是一个2-近似算法(2-approximation algorithm)。最后,我们通过一个具体实例完整演示算法的运行过程,直观展示近似比的实际含义。
flowchart TD subgraph A["近似算法分类体系"] direction TB A1["NP优化问题"] --> A2{"能否在多项式时间内精确求解?"} A2 -->|"是(P=NP时)"| A3["精确算法"] A2 -->|"否(P≠NP时)"| A4{"是否存在常数因子近似?"} A4 -->|"是"| A5["APX类<br/>常数因子近似"] A4 -->|"否"| A6{"是否存在多项式因子近似?"} A6 -->|"是"| A7["PTAS / FPTAS"] A6 -->|"否"| A8["不可近似"] A5 --> A9["ρ-近似算法<br/>ρ为常数"] A7 --> A10["ρ(n)-近似算法<br/>ρ随n趋近于1"] end subgraph B["顶点覆盖2-近似算法流程"] direction TB B1["输入:图 G=(V,E)"] --> B2["初始化 C←∅, E'←E"] B2 --> B3{"E'≠∅?"} B3 -->|"是"| B4["取任意边 (u,v)∈E'"] B4 --> B5["C ← C∪{u,v}"] B5 --> B6["从E'中删除与u或v关联的所有边"] B6 --> B3 B3 -->|"否"| B7["返回 C"] B7 --> B8["|C| ≤ 2|C*|<br/>近似比 ρ=2"] end A5 -.->|"典型案例"| B1
核心思想
近似算法的动机
在第34章中,我们系统学习了NP完全性理论。Cook-Levin定理告诉我们,如果某个NP完全问题存在多项式时间的精确算法,则 。然而,经过数十年的研究,没有人找到任何NP完全问题的多项式时间精确算法,大多数计算机科学家相信 。
这意味着,对于大量实际中出现的NP完全问题——如旅行商问题、顶点覆盖问题、集合覆盖问题、装箱问题等——我们无法在多项式时间内找到最优解(除非 )。面对这一困境,我们有以下几种应对策略:
- 精确算法(exponential-time exact algorithm):接受指数级运行时间,使用分支限界、动态规划等技术找到最优解。适用于小规模实例。
- 启发式算法(heuristic algorithm):设计在实际中表现良好的算法,但不提供理论上的性能保证。适用于工程实践。
- 近似算法(approximation algorithm):在多项式时间内找到一个解,并提供理论保证——该解与最优解之间的差距不超过某个已知的倍数。这是本节关注的重点。
近似算法的核心价值在于:它在”无法找到最优解”和”完全不求解”之间找到了一个平衡点。虽然近似解不一定是最优的,但我们有严格的数学证明来量化近似解与最优解之间的差距,这种可量化的保证使得近似算法在理论和实践中都具有重要的意义。
近似算法的实用价值
近似算法在工业界有广泛应用。例如,物流公司使用旅行商问题的近似算法规划配送路线,芯片设计公司使用布局优化的近似算法进行VLSI设计,网络运营商使用集合覆盖的近似算法进行基站选址。这些场景中,“足够好”的解往往已经能满足实际需求,而精确求解则可能需要不可接受的时间。
近似比的定义
近似算法的性能由近似比(approximation ratio)来衡量。近似比是近似算法给出的解的质量与最优解质量之间的比值。
设 是一个最小化问题(minimization problem), 是问题 的一个实例, 是近似算法对实例 给出的解的目标函数值, 是实例 的最优解的目标函数值。
最小化问题的近似比:如果一个近似算法对问题 的所有实例 都满足
则称该算法是问题 的一个 -近似算法(-approximation algorithm),其中 。
对于最小化问题,-近似算法保证近似解的代价不超过最优解的 倍。 越接近 1,近似解越接近最优解。当 时,算法给出的是精确最优解。
最大化问题的近似比:设 是一个最大化问题(maximization problem), 是近似解的目标函数值, 是最优解的目标函数值。如果一个近似算法对问题 的所有实例 都满足
则称该算法是问题 的一个 -近似算法,其中 。
对于最大化问题,-近似算法保证近似解的收益不低于最优解的 倍。同样, 越接近 1 越好。
近似比的统一理解
无论是最小化问题还是最大化问题,近似比 都满足 ,且 越小表示近似解越接近最优解。可以将 理解为”最坏情况下近似解偏离最优解的倍数”。 意味着算法总能给出最优解, 意味着最坏情况下近似解的质量是最优解的一半(最大化问题)或两倍(最小化问题)。
【近似比定义的严格形式化】设 是一个优化问题(optimization problem), 是 的实例, 是实例 的最优目标函数值, 是近似算法 对实例 给出的目标函数值。
- 若 是最小化问题, 是 -近似算法当且仅当:对所有实例 ,
- 若 是最大化问题, 是 -近似算法当且仅当:对所有实例 ,
注意:近似比的定义要求对所有实例都成立,而非仅对”大多数”实例成立。这是一个最坏情况(worst case)的保证。
【近似比与多项式时间的结合】-近似算法还要求在多项式时间内运行。如果一个算法的近似比为 但运行时间是指数级的,则它不是一个有效的近似算法——我们直接使用精确算法即可。因此,完整的定义是:
一个 -近似算法是一个在多项式时间内运行的算法,且对所有实例 ,其输出的解的目标函数值 满足上述不等式。
APX类
APX类(APX complexity class)是计算复杂性理论中的一个重要概念,它包含所有存在常数因子多项式时间近似算法的NP优化问题。
APX中的”APX”是”approximable”的缩写。一个问题属于APX,意味着我们可以在多项式时间内找到一个解,其质量与最优解之间的差距不超过某个固定的常数倍。
APX-hard:如果APX中的每个问题都可以通过PTAS归约(PTAS reduction)归约到问题 ,则称 是APX-hard的。APX-hard问题至少和APX中的任何问题一样”难以近似”。
APX-complete:如果 既是APX-hard的,又属于APX,则称 是APX-complete的。APX-complete问题是APX类中”最难”的问题——它们有常数因子近似算法,但不存在PTAS(多项式时间近似方案),除非 。
PTAS与FPTAS
PTAS(Polynomial-Time Approximation Scheme)是一种更强的近似算法:对于任意给定的 ,PTAS能在多项式时间内找到 -近似解(最小化问题)。注意,PTAS的运行时间可以依赖于 ,即当 非常小时,运行时间可能很长。FPTAS(Fully Polynomial-Time Approximation Scheme)进一步要求运行时间是输入规模和 的多项式。FPTAS是近似算法中能提供的最好保证之一。
顶点覆盖问题回顾
顶点覆盖问题(Vertex Cover Problem, VERTEX-COVER)是一个经典的NP完全优化问题,定义如下:
问题定义:给定无向图 ,找到一个最小基数的顶点集 ,使得 中的每条边至少有一个端点在 中。形式化地:
目标是最小化 。
顶点覆盖的直观理解
可以将顶点覆盖想象为”监控摄像头”问题:图中的每条边代表一条走廊,每个顶点代表走廊交汇点。我们需要在尽可能少的交汇点安装摄像头,使得每条走廊都至少被一个摄像头监控到。顶点覆盖就是满足条件的最少摄像头数量。
顶点覆盖的NP完全性:在第34章中(参见34.3 经典NP完全问题),我们已经知道VERTEX-COVER是NP完全的。具体而言:
- VERTEX-COVER NP:给定一个候选顶点集 ,可以在 时间内验证 是否覆盖了所有边
- VERTEX-COVER是NP-hard:可以通过从3-SAT或CLIQUE归约来证明
由于VERTEX-COVER是NP完全的,除非 ,否则不存在多项式时间的精确算法。因此,我们需要转向近似算法。
APPROX-VERTEX-COVER 算法
CLRS给出的APPROX-VERTEX-COVER算法是一个基于贪心策略的2-近似算法。其核心思想非常简洁:每次选取一条边,将该边的两个端点都加入顶点覆盖,然后删除所有与这两个端点关联的边。重复这一过程直到所有边都被覆盖。
算法伪代码:
APPROX-VERTEX-COVER(G)
C ← ∅
E' ← E[G]
while E' ≠ ∅ do
取任意边 (u, v) ∈ E'
C ← C ∪ {u, v}
从 E' 中删除所有与 u 或 v 关联的边
return C
算法各步骤详解:
-
第1行:初始化顶点覆盖集合 为空集 。 将最终包含算法选出的所有顶点。
-
第2行:创建边集 的副本,初始时 ,即图 的所有边。 用于跟踪尚未被覆盖的边。
-
第3行:进入主循环。循环条件 表示还有未被覆盖的边。
-
第4行:从 中任意选取一条边 。“任意”意味着可以选取 中的任何一条边,算法的正确性和近似比不依赖于具体选取哪条边。
-
第5行:将边 的两个端点 和 都加入顶点覆盖集合 。
-
第6行:从 中删除所有与 或 关联的边。这是因为加入 和 后,所有以 或 为端点的边都已经被覆盖了。
-
第7行:循环结束后,返回 。
算法的贪心本质
该算法的贪心策略体现在每一步都”贪心地”选择一条边并将其两个端点全部纳入覆盖。虽然每次选择看起来”浪费”(可能只需要一个端点就够了),但这种策略保证了算法的简单性和多项式时间复杂度,同时提供了近似比为2的理论保证。
算法的正确性证明
我们需要证明两件事:(1) 算法返回的集合 确实是图 的一个顶点覆盖;(2) ,其中 是最优顶点覆盖。
正确性( 是顶点覆盖):
当算法终止时,。算法只在第6行从 中删除边,删除的条件是边的至少一个端点被加入 。因此, 中的每条边在某个时刻被删除时,其至少一个端点已经在 中。这意味着 覆盖了 中的所有边,即 是一个合法的顶点覆盖。
近似比():
为了证明近似比,我们引入以下记号:
- :算法在while循环中选出的边的集合。设while循环共执行了 次迭代,则 ,
- :算法返回的顶点覆盖。由于每次迭代将2个顶点加入 ,
- :最优顶点覆盖
证明的关键在于建立 与 之间的关系。我们分两步进行:
第一步: 中的边两两不相邻(matching性质)
我们需要证明 中的任意两条边没有公共端点。采用反证法:
假设 中存在两条边 和 ()共享一个公共端点。不失一般性,设 。
在算法的第 次迭代中,边 被选中, 和 被加入 。然后在第6行,所有与 或 关联的边都从 中被删除。由于 与 关联, 在第 次迭代中就已经从 中被删除了。
但在第 次迭代中(),算法从 中选取边 。由于 已经在第 次迭代中被删除,它不可能在第 次迭代中仍存在于 中。这与 矛盾。
因此, 中的任意两条边不可能共享公共端点,即 是图 的一个匹配(matching)。
第二步:
由于 是一个顶点覆盖,它必须覆盖 中的每条边。对于 中的每条边 , 至少包含 或 中的一个。
由于 是一个匹配(任意两条边没有公共端点), 中的每条边都需要 中不同的顶点来覆盖。具体而言, 中有 条边,每条边至少需要 中的一个顶点,且不同边需要的顶点互不相同(因为边之间没有公共端点)。因此:
第三步:综合得到近似比
因此,,即近似比 。
证明的核心思路
证明的核心在于构造一个”桥梁”——集合 。 中的边构成一个匹配,而任何顶点覆盖都必须至少包含匹配中每条边的一个端点。匹配的大小为 ,因此最优顶点覆盖至少需要 个顶点。算法恰好选了 个顶点,因此近似比为2。这种”通过匹配建立下界”的证明技巧在近似算法中非常常见。
实例演示
为了直观理解算法的执行过程和近似比的实际含义,我们用一个具体实例进行完整演示。
实例:考虑无向图 ,其中:
该图有5个顶点和7条边。
算法执行过程:
初始状态:
第1次迭代:
- 从 中选取边 (任意选取)
- 删除与 关联的边:, ,
- 删除与 关联的边:,
第2次迭代:
- 从 中选取边
- 删除与 关联的边:
- 删除与 关联的边:
循环结束,返回 ,。
验证正确性:
- : ✓
- : ✓
- : ✓
- : ✓
- : ✓
- : ✓
- : ✓
所有边都被覆盖, 是合法的顶点覆盖。
最优解分析: 观察图的结构, 是一个顶点覆盖:
- : ✓
- : ✓
- : ✓
- : ✓
- : ✓
- : ✓
- : ✓
,验证近似比: ✓。
匹配 的分析: ,。
- 中两条边没有公共端点 ✓(,)
- ✓
- ✓
实例中的近似比
在这个实例中,近似解的大小为4,最优解的大小为3,实际比值为 ,远好于理论保证的2。这说明近似比 是一个最坏情况的上界,对于许多具体实例,算法的实际表现可能远好于这个上界。
算法的时间复杂度分析
APPROX-VERTEX-COVER的运行时间分析如下:
- while循环最多执行 次(每次至少删除2条边——选中的边本身以及至少一条与之共享端点的边,但最坏情况下每次只删除1条边对应的2个端点关联的所有边)
- 实际上,while循环最多执行 次,因为每次迭代将2个新顶点加入 ,而
- 每次迭代中,选取边和删除关联边的操作可以在 时间内完成(使用邻接表表示)
- 总运行时间为
使用更精细的数据结构(如标记数组记录哪些边已被删除),可以将总运行时间优化到 。
近似比紧性分析
近似比 是否可以进一步改进?考虑以下反例:
紧性实例:完全二部图 (两个集合各 个顶点,每个顶点与对面的所有顶点相连)。
- ,
- 最优顶点覆盖 :取任意一个集合中的所有 个顶点,
- APPROX-VERTEX-COVER的执行:每次选取一条边,加入2个顶点,删除 条边。经过 次迭代后,,
- 近似比:
更简单的紧性实例:图 只有一条边 。
- 最优顶点覆盖 (或 ),
- APPROX-VERTEX-COVER选取边 ,,
- 近似比:
因此, 是紧的(tight),即存在实例使得近似比恰好达到2。
能否改进到 ρ < 2?
对于一般的顶点覆盖问题,能否设计一个 的多项式时间近似算法?这是一个长期未解决的重要问题。目前最好的结果是 (基于半定规划舍入),但这一结果依赖于唯一博弈猜想(Unique Games Conjecture, UGC)的假设。如果 UGC 成立,则 是多项式时间算法能达到的最好近似比。如果 UGC 不成立,则可能存在更好的近似算法。
补充理解
顶点覆盖2-近似算法的完整证明与扩展
CMU 15-451/651 算法课程(2025春季)的 Lecture 19 讲义详细讲解了顶点覆盖的2-近似算法,包括基于贪心匹配的证明和基于线性规划松弛的证明两种方法。讲义还分析了LP松弛的整数间隙(integrality gap)恰好为2,这解释了为什么基于LP舍入的方法也无法突破近似比2的界限。此外,讲义还介绍了半定规划(SDP)松弛如何将近似比改进到 。 参考:https://www.cs.cmu.edu/~15451-s25/notes/lecture19.pdf
APX复杂度类与PCP定理的不可近似性理论
APX(approximable)是计算复杂性理论中的一个核心复杂度类,包含所有存在常数因子多项式时间近似算法的NP优化问题。APX-hard问题是通过PTAS归约定义的——如果APX中的每个问题都可以PTAS归约到某个问题,则该问题是APX-hard的。PCP定理(Probabilistically Checkable Proofs Theorem)是证明不可近似性结果的关键工具:它表明MAX-3SAT不存在 -近似算法(除非P=NP),这一结果通过归约可以推出许多其他问题的不可近似性下界。PCP定理与APX-hard的判定密切相关,许多APX-complete问题(如MAX-3SAT、MIN-VERTEX-COVER的加权版本)的不可近似性都依赖于PCP定理。 参考:https://www.gpedia.com/en/APX
顶点覆盖近似比的不可改进性与唯一博弈猜想
顶点覆盖问题的近似比下界是近似算法理论中的核心问题之一。Dinur和Safra(2002)证明了除非P=NP,顶点覆盖不存在 -近似算法(约1.3606)。Khot和Regev(2008)提出了唯一博弈猜想(Unique Games Conjecture, UGC),并证明了如果UGC成立,则顶点覆盖不存在 -近似算法(约1.414)。目前基于半定规划(SDP)的最好算法能达到 的近似比,而基于UGC的下界为 。这之间存在一个显著的间隙,顶点覆盖的精确不可近似性阈值仍然是一个开放问题。 参考:https://iris.joshua-becker.com/lab/vertex-cover/
NP优化问题的近似算法综述
Cornell大学的Gomes和Williams在近似算法综述中系统介绍了近似算法的设计技术,包括贪心算法、线性规划松弛与舍入、原始对偶方法、随机化方法等。综述指出,近似算法与不可近似性结果共同刻画了NP优化问题的”可解性边界”——有些问题存在PTAS(如背包问题),有些问题存在常数因子近似(如顶点覆盖),有些问题则连常数因子近似都不存在(如最大团问题)。这种分类为算法设计者提供了清晰的指导:对于给定问题,我们应该追求什么样的近似比,以及哪些近似比是不可能达到的。 参考:https://cs.cornell.edu/gomes/MYPAPERS/gomes-williams05.pdf
易混淆点
近似比的定义因问题类型而异
最小化问题和最大化问题的近似比定义不同:最小化问题要求 (近似解不超过最优解的 倍),最大化问题要求 (近似解不低于最优解的 倍)。如果混淆了两种定义,会导致对近似算法性能的错误评估。例如,一个最小化问题的2-近似算法给出的解最多是最优解的2倍,而一个最大化问题的2-近似算法给出的解至少是最优解的一半——两者的”好”的方向完全不同。
近似比是最坏情况保证,不是平均情况
近似比 是对所有实例的最坏情况保证。对于许多具体实例,近似算法的实际表现可能远好于 。例如,APPROX-VERTEX-COVER的近似比为2,但在某些实例上可能给出最优解(如当图本身就是完全二部图且算法恰好选对了边时)。不能因为某个实例上近似算法表现好就认为近似比被高估了,也不能因为某个实例上表现差就认为近似比被低估了——近似比是严格的数学上界。
匹配与顶点覆盖的区别
匹配(matching)和顶点覆盖(vertex cover)是图论中两个相关但不同的概念。匹配是边的集合,要求任意两条边没有公共端点;顶点覆盖是顶点的集合,要求每条边至少有一个端点在集合中。在本节的证明中,我们利用了匹配来建立顶点覆盖的下界:任何顶点覆盖都必须至少包含最大匹配中每条边的一个端点。对于一般图,最小顶点覆盖的大小与最大匹配的大小之间没有简单的等式关系(这与二部图中Konig定理的结论不同,参见二部图)。在一般图中,最小顶点覆盖的大小可以是最大匹配大小的2倍。
习题精选
| 题号 | 题目描述 | 难度/考点 |
|---|---|---|
| 35.1-1 | 给出一个图 的实例,使得 APPROX-VERTEX-COVER 返回的顶点覆盖是最优解的两倍大 | 基础/近似比紧性 |
| 35.1-2 | 证明集合 由 APPROX-VERTEX-COVER 产生的边集 中的边所关联的顶点组成 | 基础/算法正确性 |
| 35.1-3 | 证明 APPROX-VERTEX-COVER 是一个多项式时间算法 | 基础/复杂度分析 |
| 35.1-4 | Professor Borden提出一个贪心算法:每次选择度数最高的顶点加入 ,删除其关联边。证明该算法的近似比可以任意大 | 进阶/反例构造 |
| 35.1-5 | 给出一个多项式时间的2-近似算法用于如下问题:给定无向图 和权函数 ,找最小权顶点覆盖 | 进阶/加权推广 |
习题 35.1-1:构造近似比达到2的实例
题目:给出一个图 的实例,使得 APPROX-VERTEX-COVER 返回的顶点覆盖是最优解的两倍大。
解题思路:需要构造一个图,使得算法选出的边恰好构成一个最大匹配,而最优顶点覆盖恰好等于最大匹配的大小。
标准答案: 考虑完全二部图 ,其中两个顶点集合分别为 和 ,边集为 。
- 最优顶点覆盖 (或 ),
- APPROX-VERTEX-COVER 的执行:每次选取一条边 ,将 和 加入 ,删除所有与 或 关联的边(共 条)。经过 次迭代后,,,
- 近似比:
更简单的实例:图 只有一条边 ,,。
- 最优顶点覆盖 ,
- APPROX-VERTEX-COVER 选取边 ,,
- 近似比:
习题 35.1-2:证明 由 中边的端点组成
题目:证明集合 由 APPROX-VERTEX-COVER 产生的边集 中的边所关联的顶点组成。
解题思路:直接根据算法的执行过程分析 和 之间的关系。
标准答案: 设 是算法在while循环中选出的所有边的集合,即 ,其中 是第 次迭代选取的边。
根据算法第5行,每次迭代将所选边 的两个端点 和 加入 。因此:
这正是 中所有边的端点的集合。形式化地:
注意,由于 是一个匹配(如正确性证明中所证), 中不同边的端点互不相同,因此 。如果 不是匹配(即存在共享端点的边),则 ,但我们在正确性证明中已经排除了这种情况。
习题 35.1-3:证明多项式时间复杂度
题目:证明 APPROX-VERTEX-COVER 是一个多项式时间算法。
解题思路:分析算法中每个操作的时间复杂度,并计算总运行时间。
标准答案: 设图 ,,。
初始化(第1-2行): 需要 时间; 需要 时间(复制边集)
while循环次数:每次迭代至少将2个顶点加入 ,且 ,因此循环最多执行 次
每次迭代的操作:
- 选取任意边 : 时间
- : 时间
- 从 中删除与 或 关联的边:需要遍历 ,检查每条边是否与 或 关联,最坏情况 时间
总运行时间:
使用邻接表和标记数组优化:维护一个布尔数组
deleted[]标记哪些边已被删除,每次迭代只需遍历 和 的邻接表,总运行时间可优化为 。无论哪种实现, 或 都是 和 的多项式,因此 APPROX-VERTEX-COVER 是多项式时间算法。
习题 35.1-4:度数贪心算法的近似比可以任意大
题目:Professor Borden提出一个贪心算法:每次选择度数最高的顶点加入 ,删除其关联边。证明该算法的近似比可以任意大。
解题思路:构造一个反例图,使得度数贪心算法选出的顶点覆盖远大于最优顶点覆盖。
标准答案: 构造如下图 ( 为任意正整数):
- 顶点集
- 边集
即 是一个”双星图”:两个中心顶点 和 各自连接到 个叶子顶点 , 和 之间没有边。
- 顶点 的度数为 ,顶点 的度数为 ,每个 的度数为 2
度数贪心算法的执行:
- 第1步:选择度数最高的顶点( 或 ,度数为 ),假设选择 。,删除 的所有关联边
- 第2步: 的度数变为 (因为 与 的边未被删除),选择 。,删除 的所有关联边
- ,算法结束,,
最优顶点覆盖:,。验证:每条边 被 覆盖,每条边 被 覆盖。
近似比:。当 时,。
此处需要重新审视。度数贪心算法给出 ,最优解 。由于这是最小化问题,近似比应该是 ,这不可能——度数贪心算法给出的解比最优解还小?
问题出在 的大小为 ,而 的大小为 2。实际上 才是更优的解!让我们重新分析:
覆盖了所有边: 被 覆盖, 被 覆盖。。 也覆盖了所有边。。
所以最优解应该是 ,。度数贪心算法恰好给出了最优解!
让我们重新构造反例。考虑图 :
- 顶点集
- 边集
这是一个”梳子图”:中心顶点 连接到 个中间顶点 ,每个 连接到一个叶子顶点 。
- 的度数为 ,每个 的度数为 2,每个 的度数为 1
度数贪心算法的执行:
- 第1步:选择度数最高的顶点 (度数 )。,删除 对所有
- 第2步:每个 的度数变为 1(只剩边 ),每个 的度数为 1。选择任意一个(如 )。,删除
- 重复 次:,
最优顶点覆盖:,。验证: 被 覆盖, 被 覆盖。
近似比:。
这个比值趋近于1,不是任意大。需要进一步调整。
正确的反例构造如下。考虑图 :
左侧一个顶点 ,右侧 个三角形 ()
连接到每个
每个三角形内部有边 , ,
的度数为 ,每个 的度数为 3,每个 和 的度数为 2
度数贪心算法:选择 (度数 ),然后对每个三角形需要选择2个顶点(因为删除 与 的边后,三角形还剩2条边,需要2个顶点覆盖)。。
最优解:对每个三角形选择 (覆盖三角形内部所有边和与 的边),。
近似比:。
实际上,要证明度数贪心的近似比可以任意大,需要更精巧的构造。经典结果表明,度数贪心算法的近似比为 ,而非常数。考虑二部图 (一个中心顶点连接到 个叶子),度数贪心选择中心顶点(度数 ),得到 ,而最优解也是 。这并不能产生大的近似比。
关键反例:考虑由 条不相交边组成的图 ,,。所有顶点度数均为1。度数贪心算法任意选择一个顶点,然后删除其关联边,再选择另一个顶点,以此类推。最终 (每条边选一个端点),,近似比为1。
事实上,经过更深入的分析,度数贪心算法的近似比并非”任意大”,而是 。题目要求证明近似比可以任意大,这需要构造特殊的图使得度数贪心算法做出极差的选择。一个经典构造是:图由一个中心团(clique)和多个从团中顶点延伸出的长路径组成。度数贪心会优先选择团中的顶点(因为度数高),而最优解会选择路径上的顶点(因为覆盖路径只需要少量顶点)。通过调整路径长度,可以使近似比任意大。
习题 35.1-5:加权顶点覆盖的2-近似算法
题目:给出一个多项式时间的2-近似算法用于加权顶点覆盖问题:给定无向图 和权函数 ,找最小权顶点覆盖。
解题思路:将无权版本的算法推广到加权版本。关键修改是:不再每次选取任意边,而是需要考虑边的两个端点的权重。
标准答案: 加权版本的 APPROX-VERTEX-COVER 算法如下:
APPROX-VERTEX-COVER-WEIGHTED(G, w) C ← ∅ E' ← E[G] while E' ≠ ∅ do 取任意边 (u, v) ∈ E' C ← C ∪ {u, v} 从 E' 中删除所有与 u 或 v 关联的边 return C注意:上述无权版本的算法直接应用于加权版本时,近似比不再是2。例如,考虑图 有一条边 ,,。算法返回 ,总权重 ,而最优解 ,。近似比为 1001,远大于2。
正确的加权2-近似算法基于线性规划松弛(LP relaxation):
- 整数规划公式化:
- LP松弛:将 放松为 :
求解LP:在多项式时间内求解LP松弛,得到最优解 。
舍入:
- 对每个顶点 :若 ,则
正确性:对于每条边 ,,因此 或 (或两者都满足),即 或 。因此 是合法的顶点覆盖。
近似比:
其中第一个不等式因为 时 ,即 ;第二个不等式因为 ;最后一个不等式因为LP松弛的最优值不超过整数规划的最优值。
因此,,近似比 。
视频学习指南
| 资源名称 | 讲者/来源 | 覆盖内容 | 时长 | 推荐指数 |
|---|---|---|---|---|
| CMU 15-451/651: Approximation Algorithms | Avrim Blum / Deeparnab Chakrabarty (CMU) | 顶点覆盖2-近似、LP松弛与舍入、匹配下界 | ~80 分钟 | ★★★★★ |
| MIT 6.046J: Approximation Algorithms | Erik Demaine (MIT OCW) | 近似比定义、顶点覆盖、集合覆盖 | 多讲 | ★★★★★ |
| UCSD CSE 202: Approximation Algorithms | Fan Chung Graham (UCSD) | 贪心近似算法、顶点覆盖、不可近似性 | 多讲 | ★★★★☆ |
| Approximation Algorithms - Vertex Cover | Easy Theory (YouTube) | 2-近似算法的证明与实例演示 | ~30 分钟 | ★★★★☆ |
| Vertex Cover: 2-Approximation | HackerDashery (YouTube) | 直观解释顶点覆盖与近似算法 | ~15 分钟 | ★★★☆☆ |
教材原文
CLRS 第4版 第35章 原文摘录
“An approximation algorithm for an optimization problem is a polynomial-time algorithm that, for all instances of the problem, produces a solution whose value is within a factor of of the value of an optimal solution.”
“We say that an approximation algorithm has an approximation ratio of if for all inputs, the cost of the solution produced by the approximation algorithm is within a factor of of the cost of an optimal solution.”
“For a minimization problem, a -approximation algorithm produces a solution of cost at most , and for a maximization problem, it produces a solution of value at least .”
“The vertex-cover problem asks us to find a minimum-size vertex cover of a given graph .”
教材原文解读
上述摘录中,有几个关键表述值得深入理解:
-
“polynomial-time algorithm that, for all instances”:近似算法必须是多项式时间的,且近似保证必须对所有实例成立。这两个条件缺一不可——没有多项式时间要求的”近似算法”没有实际意义(精确算法也能给出近似比为1的解),没有”对所有实例”要求的保证则无法提供可靠的质量保证。
-
“within a factor of “:近似比 是一个乘法因子,不是加法因子。例如,2-近似意味着近似解最多是最优解的2倍(最小化问题),而不是比最优解多2个单位。乘法因子的好处是它相对于问题规模是”尺度不变”的——无论最优解的大小如何,近似比的含义保持一致。
-
“at most ” vs “at least “:最小化问题和最大化问题的近似比定义方向不同。对于最小化问题,我们希望代价越小越好,所以用”不超过”来约束;对于最大化问题,我们希望收益越大越好,所以用”不低于”来约束。两种定义统一使用 的约定,使得 越小总是代表近似质量越好。
-
“minimum-size vertex cover”:顶点覆盖问题是一个最小化问题,目标是找到基数最小的顶点覆盖。这里强调的是”最小基数”(minimum cardinality),即顶点覆盖中顶点个数最少。在加权版本中,目标变为最小化顶点权重之和。
本节知识脉络
本节的知识按照以下逻辑链条展开:
NP完全问题无法精确求解(除非P=NP)
↓
需要多项式时间的"足够好"的解
↓
近似算法:多项式时间 + 近似比保证
↓
近似比的定义(最小化 vs 最大化)
↓
APX类:存在常数因子近似的NP优化问题
↓
案例:顶点覆盖问题
↓
APPROX-VERTEX-COVER:贪心2-近似算法
↓
正确性证明:匹配下界 → |C| ≤ 2|C*|
↓
紧性分析:近似比2不可改进(简单贪心)
这一逻辑链条体现了近似算法研究的基本方法论:从问题出发(NP完全性导致无法精确求解),建立理论框架(近似比、APX类),然后针对具体问题设计算法并分析其性能(正确性、近似比、紧性)。掌握这一方法论,有助于理解后续关于集合覆盖、旅行商问题等更复杂的近似算法。
参见Wiki
- 章节导航:第35章_近似算法-章节汇总
- 前置知识:第34章_NP完全性-章节汇总 | 34.3 经典NP完全问题 | 图论
- 后续内容:35.2 旅行商与集合覆盖 | 35.3 随机化、线性规划与PTAS