相关笔记

前置依赖

关联知识

章节汇总


概览

本节探讨三种重要的近似算法设计技术:随机化方法线性规划松弛与取整,以及多项式时间近似方案(PTAS)

  • 35.4 随机化和线性规划:首先用最简单的随机赋值算法为 MAX-3-CNF 可满足性问题给出期望 -近似,然后通过条件期望方法去随机化,得到确定性近似算法;接着将加权顶点覆盖问题公式化为整数规划,通过LP松弛与取整技术获得2-近似。
  • 35.5 子集和问题的PTAS:在伪多项式时间精确算法的基础上,引入修剪(trimming)过程来控制列表规模,构造出完全多项式时间近似方案(FPTAS),使得对任意 ,都能在关于 的多项式时间内找到 -近似解。

这三种技术代表了近似算法从”固定近似比”到”任意精度逼近”的递进层次,是NP困难问题算法设计的核心工具箱。


flowchart TB
    subgraph Tech["三种近似技术对比"]
        direction TB
        R["🎲 随机化方法<br/>MAX-3-CNF 可满足性<br/>期望近似比 8/7<br/>可去随机化"]
        LP["📐 线性规划松弛<br/>加权顶点覆盖<br/>近似比 2<br/>ILP → LP → 取整"]
        PT["🎯 PTAS / FPTAS<br/>子集和问题<br/>近似比 1+ε(任意精度)<br/>运行时间依赖 1/ε"]
    end

    subgraph Flow["子集和 FPTAS 流程"]
        direction TB
        S["输入: 集合 S, 目标 t, 精度 ε"]
        DP["伪多项式 DP<br/>O(nt) 精确算法"]
        TR["修剪过程 TRIM(L, δ)<br/>控制列表大小为 O(ln t / ln(1+δ))"]
        ITER["逐元素迭代<br/>合并 + 修剪 + 截断"]
        OUT["输出: Lₙ 中最大元素<br/>保证 ≥ (1-ε) · OPT"]
        S --> DP
        DP --> TR
        TR --> ITER
        ITER --> OUT
    end

    R ---|"技术递进"| LP
    LP ---|"精度提升"| PT
    PT ---|"核心应用"| Flow

    style R fill:#e1f5fe,stroke:#0288d1
    style LP fill:#f3e5f5,stroke:#7b1fa2
    style PT fill:#e8f5e9,stroke:#2e7d32
    style S fill:#fff3e0,stroke:#ef6c00
    style OUT fill:#e8f5e9,stroke:#2e7d32

核心思想

35.4 随机化和线性规划

35.4.1 MAX-3-CNF 可满足性的随机近似

问题定义

给定一个 3-CNF 布尔公式 ,其中包含 个布尔变量 个子句 。每个子句 恰好由 3 个文字(literal)通过 OR 连接而成,每个文字要么是某个变量 ,要么是其否定 。目标是找到一个真值赋值(truth assignment),使得被满足的子句数量最大化。

与判定版本的关系

回顾 34.3 经典NP完全问题 中的内容,3-SAT 的判定版本(是否存在满足所有子句的赋值)是 NP 完全的。MAX-3-CNF 可满足性是其优化版本:即使无法满足所有子句,我们也要尽可能多地满足子句。由于判定版本是 NP 困难的,优化版本自然也是 NP 困难的。

随机算法

考虑以下极其简单的随机化算法:

算法 RANDOM-3-CNF-SAT() 对每个变量 ),独立地以概率 赋值为 TRUE,以概率 赋值为 FALSE。

这个算法的运行时间是 ——只需要生成 个随机比特。关键问题在于:它的期望表现如何?

期望分析(逐步推导)

为了分析这个随机算法,我们使用 5.4 概率分析与指示器随机变量的进一步应用 的方法。

第一步:定义指示器随机变量

对每个子句 ),定义指示器随机变量:

第二步:分析单个子句被满足的概率

考虑任意一个子句 ,其中 是三个文字。子句 不被满足,当且仅当三个文字全部为假。

由于每个变量的赋值是独立均匀随机的(TRUE 和 FALSE 各以 概率出现),而每个文字要么是某个变量本身,要么是其否定,因此每个文字为假的概率也是 。三个文字相互独立(因为它们涉及不同的变量——在 3-CNF 中,同一子句内的文字通常涉及不同变量),所以:

因此,子句 被满足的概率为:

第三步:计算单个子句的期望

由于 是指示器随机变量:

第四步:计算总满足子句数的期望

定义总满足子句数为:

5.4 概率分析与指示器随机变量的进一步应用 中期望的线性性(linearity of expectation),无论 之间是否独立,都有:

第五步:建立近似比

设 OPT 为最优赋值满足的子句数。显然 OPT (最多满足所有 个子句),因此:

这说明随机赋值的期望满足子句数至少是最优解的 。由于 MAX-3-CNF 可满足性是最大化问题,近似比定义为 (或更一般地,我们要求 ,其中 ),因此期望近似比为:

推论:存在性保证

由期望的定义, 意味着至少存在一个赋值满足至少 个子句(否则期望不可能达到 )。由此可以得出一个有趣的推论:每个最多包含 7 个子句的 3-CNF 公式都是可满足的。因为如果所有赋值最多只能满足 6 个子句(即 ),那么 ,与 矛盾。

去随机化:条件期望方法

上面的算法是随机的,每次运行可能产生不同结果。我们可以通过条件期望方法(method of conditional expectations)将其转化为确定性算法,同时保证结果至少和期望一样好。

核心思想是:逐个确定每个变量的赋值,每次选择使条件期望不降低的值。

算法 DERANDOMIZE-3-CNF-SAT()

  1. (无条件期望)
    • 计算条件期望
    • 选择使条件期望较大的赋值,固定 的值
    • 更新期望值
  2. 返回确定的赋值

正确性论证

设已确定前 个变量的赋值后,剩余 个变量未确定。此时条件期望为:

由全期望公式(law of total expectation):

因此,两个条件期望中至少有一个大于等于当前期望。我们选择较大的那个,就能保证期望不降。经过 步后,所有变量都已确定,条件期望就等于实际满足的子句数,而这个值始终

计算复杂度:每步需要计算条件期望,可以在 时间内完成(遍历所有子句,统计在当前部分赋值下已确定满足的子句数,加上未确定子句的期望贡献)。总共 步,总时间为


35.4.2 加权顶点覆盖的 LP 松弛

问题回顾

35.1 近似算法基础与顶点覆盖 中,我们用贪心算法给出了(无权)顶点覆盖的 2-近似。现在考虑加权版本:给定无向图 ,每个顶点 有一个正权重 ,目标是找到一个顶点覆盖 (即每条边至少有一个端点在 中),使得总权重 最小化。

整数规划公式化

加权顶点覆盖可以自然地公式化为一个整数线性规划(Integer Linear Program, ILP)问题。引入决策变量 (对每个 ):

整数规划如下:

约束的直观含义:对于每条边 ,约束 要求至少有一个端点被选中(),这正是顶点覆盖的定义。

设这个整数规划的最优解值为 ,则 就是加权顶点覆盖问题的最优值。

LP 松弛

整数规划(ILP)通常是 NP 困难的。LP 松弛的核心思想是:将整数约束放松为连续约束,从而得到一个可以在多项式时间内求解的线性规划(LP)。

放松为 ,得到松弛后的 LP:

LP 松弛的关键性质:由于 ILP 的可行解集合是 LP 可行解集合的子集(每个 0-1 解也是满足 的解),而 ILP 和 LP 的目标函数相同,因此:

其中 是 LP 的最优解值。这意味着 LP 的最优解给出了原问题最优解的一个下界。这个下界是整个方法的基础。

取整算法

29.1 线性规划的表述与算法 中的方法(如单纯形法或内点法)在多项式时间内求解 LP,得到最优解 。然后执行取整:

算法 LP-VERTEX-COVER()

  1. 求解上述 LP,得到最优解
  2. 构造覆盖:
  3. 返回

正确性证明 确实是一个顶点覆盖。

对任意边 ,由 LP 的覆盖约束:

如果 ,则 ,矛盾。因此至少有一个端点满足 ,即至少有一个端点在 中。

2-近似证明(逐步推导)

现在证明

第一步:分析取整后的权重

对每个被选入覆盖的顶点 ,由于 ,我们有:

这里的关键步骤是:因为 ,所以 ,两边同乘 得到

第二步:求和得到覆盖的总权重

第三步:扩展到所有顶点

由于 ,添加 的项只会增加求和值:

第四步:利用 LP 最优性

正是 LP 的目标函数在最优解 处的值,即

第五步:利用松弛的下界性质

由于

综合所有步骤

因此,,即这个算法是加权顶点覆盖的 2-近似算法

LP 松弛方法的一般框架

LP 松弛与取整是一种通用的近似算法设计范式,其一般流程为:

  1. 公式化:将优化问题写成整数规划(ILP)
  2. 松弛:将整数约束放松为连续约束,得到 LP
  3. 求解:在多项式时间内求解 LP(得到分数最优解)
  4. 取整:将分数解转换为整数可行解
  5. 分析:证明取整后的解与 LP 最优解(进而与 ILP 最优解)之间的近似比

这种方法的强大之处在于:LP 的最优解自动提供了原问题最优解的一个下界(最小化问题)或上界(最大化问题),使得近似比的分析变得系统化。


35.5 子集和问题的 PTAS

35.5.1 问题定义

子集和问题(Subset Sum):给定一个包含 个正整数的有限集 和一个目标正整数 ,找到一个子集 ,使得:

并且最大化

与NP完全性的关系:子集和的判定版本(是否存在子集之和恰好等于 )是 NP 完全的(见 34.3 经典NP完全问题)。优化版本自然也是 NP 困难的。

与背包问题的关系:子集和是 0-1 背包问题的特例——每个物品的权重等于其价值,背包容量为

35.5.2 精确算法(伪多项式时间)

子集和问题有一个基于 14.3 动态规划设计要素 中动态规划思想的精确算法,运行时间为

算法思想:维护一个列表 ,包含使用 中前 个元素 所能构成的所有可能的子集和。

算法 EXACT-SUBSET-SUM()

  1. for to do
    • 中删除所有 的元素
  2. return 中的最大元素

其中 表示将 中每个元素加上 得到的新列表,MERGE-LISTS 合并两个有序列表并去除重复元素。

正确性 包含了使用前 个元素能构成的所有 的子集和。由数学归纳法易证。

时间复杂度 最多为 (因为所有元素都是 的非负整数),每次 MERGE-LISTS 耗时 ,总共 次迭代,总时间为

伪多项式性:当 关于输入规模(即 )是指数大时,这个算法不是多项式时间的。例如,如果 ,则运行时间为 ,远非多项式。

35.5.3 修剪过程(Trimming Procedure)

精确算法的瓶颈在于列表 可能太大。修剪(trimming)的核心思想是:在列表中去除”过于接近”的元素,只保留彼此之间有足够间距的代表元素,从而控制列表大小。

修剪算法

TRIM() — 给定有序列表 )和修剪参数

  1. (总是保留最小元素)
  2. for to do
    • if then
      • 追加到
  3. return

修剪的直观理解:想象你在数轴上选点,要求相邻两个选中点之间的距离至少是前一个点的 倍。如果两个数 满足 ,那么 的相对差距不超过 ,保留 就足以”代表”这个区间内的所有值。

修剪后列表大小的上界

引理:设 中所有元素 ,则修剪后的列表 满足:

证明

,其中 。由修剪规则,对

递推可得:

由于 中最小元素为 0,但 至少为 0;若 ,则 ,我们从 开始分析),且

两边取自然对数:

因此:

由于 是整数:

利用近似 (当 很小时):

35.5.4 PTAS 算法

将修剪过程嵌入到精确算法中,得到近似方案:

APPROX-SUBSET-SUM()

  1. for to do
    • 中删除所有 的元素
  2. return 中的最大元素

与精确算法的区别:仅在每次迭代后增加了一步修剪,修剪参数为

35.5.5 正确性分析

目标:证明算法返回值 满足 ,其中 是最优解。

上界 是显然的:算法只考虑 中元素的子集和,且删除了所有 的元素,因此返回值不可能超过最优解。

下界的证明是核心难点。我们需要证明修剪过程不会丢失太多精度。

关键引理:设 为使用前 个元素能构成的所有 的子集和的集合(即精确算法中 对应的集合), 为近似算法中第 次迭代后的列表。则对 中的每个元素 ,存在 中的元素 满足:

证明(对 进行数学归纳法)

基础情况(,显然 。成立。

归纳步骤:假设引理对 成立,证明对 也成立。

考虑 中的任意元素 要么属于 (不使用 ),要么等于 ,其中 (使用 )。

情况1

由归纳假设,存在 满足

在构造 时,首先执行 MERGE-LISTS(, ), 被包含在合并结果中。然后执行 TRIM(, )。

修剪可能删除 ,但修剪的性质保证了:如果 被删除,那么存在一个保留的元素 (因为修剪只删除与前一个保留元素”太近”的元素,保留的元素是更大的那个)。更准确地说,修剪后 中存在元素 满足:

对应的被保留的前驱元素。但更精确的分析如下:

设修剪后的列表为 。由修剪的定义, 中最后一个 的元素 满足 (因为如果 ,则 之间不会被删除更多元素)。

因此:

结合归纳假设

利用不等式 (对 ):

同时 。故 。成立。

情况2,其中

由归纳假设,存在 满足

。由于 MERGE-LISTS 的操作, 被包含在合并结果中。

可得

可得:

这里需要更精细的分析。注意到 ,所以 。代入上式:

由于 ,第二项为正,因此

经过修剪后(与情况1类似的分析), 中存在 满足:

。成立。

归纳完成

最终近似比的推导

设最优解为 ,则 。由关键引理, 中存在 满足:

算法返回 中的最大元素,这个最大值至少为 ,因此返回值

现在估计 。利用不等式 (对 ):

因此返回值

但我们可以得到更紧的界。利用不等式 (对所有实数 )以及 (对 ):

因此返回值 ,即算法是 -近似的。

35.5.6 运行时间分析

每次迭代的列表大小:修剪参数为 ,列表中元素 ,因此:

MERGE-LISTS 的耗时

TRIM 的耗时

总运行时间 次迭代,每次

FPTAS 的判定:运行时间是 的多项式(),也是 的多项式()。但注意 项—— 是输入数值的一部分, 是输入规模的多项式(因为 个比特表示)。因此,运行时间关于输入规模和 都是多项式的。

结论:子集和问题有一个完全多项式时间近似方案(FPTAS)

35.5.7 PTAS 与 FPTAS 的对比

定义对比

性质PTASFPTAS
全称多项式时间近似方案完全多项式时间近似方案
对任意 提供 -近似提供 -近似
运行时间
的限制可以是任意函数(如指数函数)必须是多项式
实际意义 越小,时间可能急剧增长 变小,时间增长平缓

关系:FPTAS PTAS。每个 FPTAS 都是一个 PTAS,但反之不然。

拥有 PTAS 但没有 FPTAS 的问题:一些 NP 困难问题有 PTAS 但被证明不存在 FPTAS(除非 P = NP),例如:

  • 带权完成时间和的调度问题(某些变体)
  • 多维背包问题

拥有 FPTAS 的问题

  • 子集和问题(本节内容)
  • 0-1 背包问题
  • 单机加权完成时间和调度

没有 PTAS 的问题:如果 P NP,以下问题不存在 PTAS:

  • 一般的旅行商问题(TSP)
  • 集合覆盖问题(除非 P = NP)
  • 最大团问题

生活化类比

  • PTAS 就像用普通相机拍照——你可以通过增加曝光时间来获得更清晰的照片,但曝光时间可能从 1 秒增长到 1 小时甚至更长。精度越高,代价可能指数增长。
  • FPTAS 就像用数码相机调分辨率——从 100 万像素调到 1000 万像素,处理时间只增加几倍,而不会爆炸式增长。精度提升的代价是”可控的”。

随机化近似算法与去随机化

随机化方法是近似算法设计中的重要工具。通过先设计一个期望表现良好的随机算法,再利用条件期望或概率方法(如 pairwise independence、discrepancy theory)进行去随机化,可以得到确定性的近似保证。Chalmers 大学的高级算法课程详细讲解了 MAX-SAT 的 7/8 近似算法及其去随机化过程。

参考资源Advanced Algorithms - Probability and Randomized Algorithms (Chalmers University)

LP 松弛与取整方法

线性规划松弛是近似算法中最系统化的设计范式之一。其核心思想是:将 NP 困难的整数规划放松为多项式时间可解的线性规划,利用 LP 最优解作为原问题最优解的界,然后通过取整将分数解转换为整数解。Wisconsin 大学 CS787 课程提供了 LP 松弛与取整的系统讲解。

参考资源CS787: Advanced Algorithms - LP Relaxation and Rounding (UW-Madison)

PTAS 与 FPTAS 的理论背景

多项式时间近似方案(PTAS)和完全多项式时间近似方案(FPTAS)代表了近似算法可以达到的最高精度。Princeton 大学的算法课程讲义清晰地定义了 PTAS、FPTAS 以及它们之间的层次关系,并讨论了哪些 NP 困难问题拥有 PTAS 或 FPTAS。

参考资源Approximation Algorithms - Princeton CS423

FPTAS 在背包问题与调度中的应用

FPTAS 不仅适用于子集和问题,在背包问题、单机调度问题等多个领域都有重要应用。2023 年的研究工作将背包问题的 FPTAS 运行时间推进到接近 ,展示了这一领域的持续进展。ACM 数字图书馆收录了大量关于 FPTAS 在调度和装箱问题中应用的文献。

参考资源A Nearly Quadratic-Time FPTAS for Knapsack (arXiv)


期望近似比与高概率近似比的区别

随机化近似算法分析的是期望近似比,即 。这并不意味着每次运行都能达到这个保证——单次运行的结果可能远差于期望。如果需要高概率保证(如以 的概率达到 -近似),通常需要重复运行并取最优结果,利用 Chernoff 界或 Markov 不等式进行放大分析。在学术写作和考试中,必须明确区分”期望近似比”和”高概率近似比”。

LP 松弛的取整方案不是万能的

并非所有 LP 松弛都能通过简单的阈值取整(如 则取 1)获得好的近似比。取整方案的设计高度依赖问题结构。例如,对于集合覆盖问题的 LP 松弛,需要使用随机化取整(每个 以概率 选中)结合 Chernoff 界分析,才能获得 -近似比。直接取整可能产生不可行解或极差的近似比。设计取整方案时,必须首先验证可行性(取整后的解是否满足所有约束),然后再分析近似比。

PTAS 不意味着问题容易

拥有 PTAS 并不意味着问题在实践中有高效算法。PTAS 的运行时间中隐藏在 里的常数或指数可能非常大,使得对较小的 (如 )算法在实际上不可行。此外,PTAS 的存在性是一个理论性质——它告诉我们”原则上可以任意逼近最优解”,但并不保证实际效率。FPTAS 提供了更强的实用性保证,但即使 FPTAS 的多项式次数也可能很高(如 ),在大规模实例上仍可能面临挑战。


习题精选

题号题目描述难度考察重点
35.4-1证明将随机赋值算法应用于 MAX-2-CNF 可满足性时,期望近似比为 4/3★★☆随机化分析、指示器随机变量
35.4-2给出加权顶点覆盖 LP 松弛的一个实例,使得取整后 (近似比紧)★★☆LP 松弛紧性分析
35.5-1证明 TRIM 过程的正确性:修剪后的列表大小上界★★☆修剪过程分析
35.5-2, , ,手动执行 APPROX-SUBSET-SUM★★★算法手动模拟
35.5-3证明如果 P NP,则 TSP 不存在 PTAS★★★☆PTAS 的局限性、Gap 技术
35.5-4分析 APPROX-SUBSET-SUM 中将 改为 后的近似比★★★误差累积分析

视频学习指南

资源讲者/来源主题时长推荐指数
MIT 6.046J Lecture 12Prof. Erik DemaineApproximation Algorithms: Randomized & LP~80min★★★★★
CMU 15-451 Lecture 23Prof. Anupam GuptaLP Relaxations and Rounding~75min★★★★★
Stanford CS261 Lecture 8Prof. Tim RoughgardenRandomized Rounding~60min★★★★☆
Princeton COS 521 Lecture 5Prof. Moses CharikarSubset Sum and FPTAS~70min★★★★☆
UC Berkeley CS 170 Lecture 34Prof. Satish RaoApproximation Algorithms Overview~50min★★★☆☆

教材原文

“We can derive a randomized 8/7-approximation algorithm for MAX-3-CNF satisfiability. The algorithm is simple: assign each variable the value TRUE with probability 1/2 and the value FALSE with probability 1/2, independently. By linearity of expectation, the expected number of satisfied clauses is 7m/8, and therefore the expected approximation ratio is 8/7.”

— CLRS, Chapter 35, Section 35.4

教材原文

“A polynomial-time approximation scheme (PTAS) is an algorithm that takes as input not only an instance of an optimization problem but also a value ε > 0, and that produces a solution that is within a factor of 1 + ε of being optimal. For a maximization problem, a PTAS is a (1 - ε)-approximation algorithm.”

— CLRS, Chapter 35, Section 35.5

教材原文

“A fully polynomial-time approximation scheme (FPTAS) is a PTAS whose running time is polynomial in both the size of the instance and 1/ε. The approximation scheme for the subset-sum problem is in fact an FPTAS.”

— CLRS, Chapter 35, Section 35.5

教材原文

“The key idea is that we can trim the lists by removing elements that are close to each other in value. Since we are looking for an approximate answer, we do not need to maintain all possible sums.”

— CLRS, Chapter 35, Section 35.5


参见Wiki

第35章-近似算法