相关笔记

概览

本节是第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完全问题——如旅行商问题、顶点覆盖问题、集合覆盖问题、装箱问题等——我们无法在多项式时间内找到最优解(除非 )。面对这一困境,我们有以下几种应对策略:

  1. 精确算法(exponential-time exact algorithm):接受指数级运行时间,使用分支限界、动态规划等技术找到最优解。适用于小规模实例。
  2. 启发式算法(heuristic algorithm):设计在实际中表现良好的算法,但不提供理论上的性能保证。适用于工程实践。
  3. 近似算法(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. 第1行:初始化顶点覆盖集合 为空集 将最终包含算法选出的所有顶点。

  2. 第2行:创建边集 的副本,初始时 ,即图 的所有边。 用于跟踪尚未被覆盖的边。

  3. 第3行:进入主循环。循环条件 表示还有未被覆盖的边。

  4. 第4行:从 中任意选取一条边 。“任意”意味着可以选取 中的任何一条边,算法的正确性和近似比不依赖于具体选取哪条边。

  5. 第5行:将边 的两个端点 都加入顶点覆盖集合

  6. 第6行:从 中删除所有与 关联的边。这是因为加入 后,所有以 为端点的边都已经被覆盖了。

  7. 第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-4Professor Borden提出一个贪心算法:每次选择度数最高的顶点加入 ,删除其关联边。证明该算法的近似比可以任意大进阶/反例构造
35.1-5给出一个多项式时间的2-近似算法用于如下问题:给定无向图 和权函数 ,找最小权顶点覆盖进阶/加权推广

视频学习指南

资源名称讲者/来源覆盖内容时长推荐指数
CMU 15-451/651: Approximation AlgorithmsAvrim Blum / Deeparnab Chakrabarty (CMU)顶点覆盖2-近似、LP松弛与舍入、匹配下界~80 分钟★★★★★
MIT 6.046J: Approximation AlgorithmsErik Demaine (MIT OCW)近似比定义、顶点覆盖、集合覆盖多讲★★★★★
UCSD CSE 202: Approximation AlgorithmsFan Chung Graham (UCSD)贪心近似算法、顶点覆盖、不可近似性多讲★★★★☆
Approximation Algorithms - Vertex CoverEasy Theory (YouTube)2-近似算法的证明与实例演示~30 分钟★★★★☆
Vertex Cover: 2-ApproximationHackerDashery (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 .”

教材原文解读

上述摘录中,有几个关键表述值得深入理解:

  1. “polynomial-time algorithm that, for all instances”:近似算法必须是多项式时间的,且近似保证必须对所有实例成立。这两个条件缺一不可——没有多项式时间要求的”近似算法”没有实际意义(精确算法也能给出近似比为1的解),没有”对所有实例”要求的保证则无法提供可靠的质量保证。

  2. “within a factor of :近似比 是一个乘法因子,不是加法因子。例如,2-近似意味着近似解最多是最优解的2倍(最小化问题),而不是比最优解多2个单位。乘法因子的好处是它相对于问题规模是”尺度不变”的——无论最优解的大小如何,近似比的含义保持一致。

  3. “at most ” vs “at least :最小化问题和最大化问题的近似比定义方向不同。对于最小化问题,我们希望代价越小越好,所以用”不超过”来约束;对于最大化问题,我们希望收益越大越好,所以用”不低于”来约束。两种定义统一使用 的约定,使得 越小总是代表近似质量越好。

  4. “minimum-size vertex cover”:顶点覆盖问题是一个最小化问题,目标是找到基数最小的顶点覆盖。这里强调的是”最小基数”(minimum cardinality),即顶点覆盖中顶点个数最少。在加权版本中,目标变为最小化顶点权重之和。

本节知识脉络

本节的知识按照以下逻辑链条展开:

NP完全问题无法精确求解(除非P=NP)
         ↓
需要多项式时间的"足够好"的解
         ↓
近似算法:多项式时间 + 近似比保证
         ↓
近似比的定义(最小化 vs 最大化)
         ↓
APX类:存在常数因子近似的NP优化问题
         ↓
案例:顶点覆盖问题
         ↓
APPROX-VERTEX-COVER:贪心2-近似算法
         ↓
正确性证明:匹配下界 → |C| ≤ 2|C*|
         ↓
紧性分析:近似比2不可改进(简单贪心)

这一逻辑链条体现了近似算法研究的基本方法论:从问题出发(NP完全性导致无法精确求解),建立理论框架(近似比、APX类),然后针对具体问题设计算法并分析其性能(正确性、近似比、紧性)。掌握这一方法论,有助于理解后续关于集合覆盖、旅行商问题等更复杂的近似算法。


参见Wiki

第35章-近似算法 顶点覆盖