第20章:启发式的形式合同——"差不多对"的精确数学定义
可采纳性不是一个工程妥协。它是一个数学承诺。
第19章的结论令人沮丧:许多推理问题在计算上是根本困难的。不是算法不够好,而是问题本身的几何形状决定了没有捷径。
但人类和机器一直在解决这些"困难"问题。不精确地,不总是最优地,但通常足够好,足够快。
这里隐藏着一个问题:"足够好"是什么意思? 如果答案是任意的,那么任何算法只要不崩溃,都可以叫做"启发式"。但如果"足够好"有精确的数学含义,那么启发式就不是工程上的将就,而是一种有合同的承诺——承诺什么,以什么为代价,在什么条件下兑现。
这章要做的事,就是把这个合同写清楚。
20.1 两种近似的失败
先看两个近似方案,都直觉上合理,都在某些情况下出错。
方案一:贪心算法。每一步选择当前看起来最好的局部选择,不回头。旅行商问题里,每次走到最近的未访问城市;图着色问题里,每次给当前顶点分配编号最小的、和邻居不冲突的颜色。
贪心算法通常很快(多项式时间),但结果可能很差——有时候距离最优解差一个指数倍。贪心没有承诺,它只是"看起来不错"。
方案二:随机搜索。随机采样解空间,报告找到的最好结果。足够随机,够多次,也许能找到好解。
随机搜索也没有承诺——"也许"不是合同。在最坏情况下,解空间里好的解极其稀疏,随机搜索可能永远找不到。
兔狲教授评
大量实际系统在用的就是"也许"——随机重启、多次采样、取最好的结果。这些方法在实践里有时有效,但你不知道在什么情况下会失效,也不知道失效的概率是多少。没有合同,就没有失败条件,你甚至连算法是否在工作都无法判断。"有时候有效"不是保证,是运气。
这两种方案的共同问题:没有对"差多远"给出可证明的界。启发式合同需要的,正是这个界。
20.2 可采纳性:永远不高估
搜索问题里最经典的启发式框架,是 A* 算法。它的核心是一个启发函数
A* 算法维护一个优先队列,每次展开估计总代价
这个算法找到最优解的条件,精确地落在
定义(可采纳性):启发函数
其中
可采纳性的含义:
定理(A 完备性)*:若启发函数
这是启发式合同的第一种形式:给我一个永远不高估的估计,我保证给你最优解。代价是你要花时间构造这个估计,以及算法可能需要探索更大的搜索空间。
可采纳性是如何被违反的
一个常见的错误是用真实代价的粗略上界作为启发函数——这当然会高估,从而破坏可采纳性。比如在地图搜索里,如果用直线距离作为
20.3 一致性:三角不等式的约束
可采纳性保证了最终结果的质量,但 A* 的效率还依赖
定义(一致性):启发函数
其中
这是一个三角不等式:从
一致性蕴含可采纳性(可以验证),但反过来不成立。一致性是更强的条件。
在一致性下,A 展开的每个节点,
这两个性质——可采纳性和一致性——构成了启发式合同的精确数学内容。有了它们,"启发式"就不是随便猜,而是一个在可证明界内工作的估计机制。
20.4 近似比:最坏情况的保证
A* 的框架在最优性有意义的问题里运作良好。但许多 NP 完全问题,最优解本身就难以找到,即使允许近似。这时需要另一种合同:近似比。
定义(近似算法):对于一个最小化问题,若算法
近似比是启发式合同的最坏情况版本:无论输入是什么,输出的质量保证在最优解的
一些著名的结果:
- 顶点覆盖问题:存在 2-近似算法(找一个极大匹配,取两端点)。
- 旅行商问题(度量版本):存在 1.5-近似算法(Christofides 算法,1976年)。这个结果保持了近半个世纪,直到 2020 年才被略微改进。
- 旅行商问题(一般版本,不满足三角不等式):若 P ≠ NP,则对任意常数
,不存在多项式时间的 -近似算法。
最后这个结果是关键:对某些问题,近似同样是 NP 难的。允许误差并不总是让问题变简单。近似比本身也有一个信息论下界,这个下界来自问题的内在结构,不依赖任何具体算法。
近似比的不可突破性
旅行商问题一般版本的近似不可能性证明,用的是归约:如果存在一个多项式时间的
20.5 PAC 学习:"差不多对"的概率版本
近似比是关于解的质量,PAC 学习框架把同样的精神应用到了学习问题上。
定义(PAC 学习):一个概念类
用中文说清楚:以高概率(至少
兔狲教授评
很多人看到"以高概率近似正确"会觉得这是在降低标准。恰好相反——
PAC 框架的核心结论:样本量
VC 维:假设空间的复杂度
PAC 框架里,所需样本量还依赖另一个量:假设空间
20.6 三种合同的统一
把这一章的内容并排看:
| 合同类型 | 承诺 | 条件 | 代价 |
|---|---|---|---|
| 可采纳性 + A* | 找到最优解 | 可能探索更大空间 | |
| 近似比 | 解不超过最优的 | 最坏情况保证 | 放弃最优 |
| PAC 学习 | 以高概率近似正确 | 足够多样本 | 允许失败概率 |
三种合同,三种不同的"差不多对"——对应三种不同的代价结构和保证类型。它们的共同点是:都把"差不多"从直觉词变成了数学量。合同可以违反,但违反是可检测的。这和第14章的形式系统精神完全一致:精确定义允许精确批评。
启发式不是因为精确推理太难而不得不将就的残次品。它是在计算约束下,对推理质量的理性承诺——知道自己承诺了什么,知道承诺的边界在哪里。
悬而未决
近似的边界能被突破吗? 对某些问题,近似比有一个不可逾越的下界(假设 P ≠ NP)。但近似算法的理论还有大量未解问题:旅行商问题的最优近似比是多少?唯一博弈猜想(Unique Games Conjecture)是否成立——它决定了大量问题的近似下界。这个方向的问题,往往比 P ≠ NP 本身更容易陈述,同样深刻。
PAC 学习的计算版本:PAC 框架保证了样本复杂度,但没有保证计算复杂度。有些概念类在样本意义上是可学习的,但学习算法本身可能需要指数时间。区分"信息论可学习"和"计算可学习",是学习理论的核心张力——前者问需要多少数据,后者问需要多少时间。
启发式能被自动发现吗? A* 需要人工设计
思考题
★ 热身
A* 算法在地图寻路中常用直线距离作为启发函数
(零启发,退化为 Dijkstra 算法) 从 到目标的直线距离(欧几里得距离) 从 到目标的直线距离 从 到目标的实际最短路径长度(假设你已经知道) 从 到目标沿曼哈顿距离(仅允许上下左右移动时)
★★ 推导
可采纳性的代价:设计一个简单的搜索问题(画一个5个节点的图,标上边权),使得:可采纳的启发函数
需要展开更多节点才找到最优解,而不可采纳的 用更少节点找到了同一个解。写出两个 的具体值,并追踪 A* 在两种情况下的展开顺序。这说明可采纳性保证的是什么,不保证的是什么? PAC 与贝叶斯的关系:第17章的贝叶斯推断和本章的 PAC 学习,都处理"从有限数据泛化"。PAC 的保证对最坏分布成立,贝叶斯的保证依赖先验。哪种保证对假设更少?在一个"先验完全错误"的场景下,哪种框架会先崩溃?
★★★ 挑战
旅行商问题(TST)的一般版本(不满足三角不等式时)被证明:若 P ≠ NP,则对任意常数
这个"不可近似性"的证明用的是归约:如果存在
这个练习的目标不是写出完整证明,而是理解:为什么允许误差并不总是让问题变简单——在某些情况下,近似和精确一样难。
