亚马逊的云基础设施校验系统Zelkova,五年时间里把每天求解的SMT查询次数,从大约一千次干到了超过十亿次。SMT是SAT的加强版,而SAT正是教科书里那个"几乎不可能被高效求解"的NP-hard经典案例。如果NP-hard真像很多课堂上讲的那样,是计算机科学这门学科的判决书,这事本不该发生。

它确实发生了。但这不代表"NP-hard被高估"这句话可以直接拿来当结论。真相比"理论没用"和"工程已经解决一切"这两种说法都更具体,也更值得看一眼。

千次到十亿次,中间发生了什么

一位博主最近写文章反驳"NP-hard=实践中无法求解"的流行误读,举了依赖解析、类型检查、调度、旅行商问题(TSP)、布尔可满足性(SAT)五个经典案例,主张最坏情况在现实中很少撞上,Gurobi、SCIP、Google OR-Tools这类求解器能在合理时间内给出可证明最优解。

论据里最扎眼的一条,就是Amazon Zelkova:从五年前每天约1,000次SMT调用,扩张到现在超10亿次/天,请求通常在数百毫秒到数十秒内完成。这个数字是真的,也确实惊人。

Zelkova五年扩张 1,000 五年前 · 次/天 10亿+ 现在 · 次/天

但把这个数字直接当成"NP-hard已被攻克"的证据,跳过了中间那五年到底做了什么。

十亿次查询靠的是四个笨办法

Amazon自己在公开材料里讲得很清楚:可行性来自四件事——把问题约束化建模,让规则由服务自动生成而不是随手拼凑;用求解器组合(同时跑Z3、CVC4、cvc5等多个引擎,谁先出结果用谁的);靠大量离线基准回归提前筛掉容易炸的模式;再加上云端的大规模并行。

四个工程杠杆 约束建模 规则自动生成 求解器组合 多引擎赛跑 基准回归 提前筛坑 云端并行 规模摊平延迟

这四件事的共同点是:不去挑战NP-hard的理论上限,而是把输入的分布锁死在一个可控范围里。Amazon能解的,是"由服务自动生成的规则化SMT问题"这个特定子集,不是SMT本身。

  • 结论.工程界解决NP-hard,靠的从来不是算法突破一个数量级,而是先把问题的输入分布驯服到可控范围。

"可证明最优"和"知道的最优"不是一回事

原文说求解器能找到"可证明最优解",这句话本身没错,但漏了关键的一半。Gurobi的官方说明把结果分成两种:已证明的最优解,和资源限制下已知的最优解——后者只是目前没找到更好的,不代表理论上不存在。SCIP的基准测试框架干脆用两套标签区分:=opt=(验证过的最优)和=best=(已知的最优)。

这个区分不是学术洁癖。生产系统里报告"找到最优解"的比例,很大一部分其实是第二种——时间到了,求解器交了一份目前最好的作业,不是数学上盖章的答案。原文把二者混着说,读起来很爽,但经不起细问。

尾部风险,才是原文轻描淡写的地方

SAT求解器确实厉害到"现在被认为是容易的部分",但SAT有个"相变"现象:子句和变量的比例接近某个临界点时,问题会突然变难,工业基准和随机基准的难度分布完全不是一回事。TSP的精确求解成绩,很大程度依赖欧几里得几何结构,换一个没有几何规律的实例集,成绩未必好看。

更实际的问题是运行时间的分布形态。多数实例确实很快,但少数实例的耗时可能是中位数的数千甚至数万倍——这叫重尾分布(heavy-tailed),不是加个超时机制就能一句话打发的。

重尾分布:多数很快,少数极慢 多数实例 接近中位数 部分实例 数十倍中位数 少数实例 数千~数万倍

再加上一层:求解器厂商会针对知名基准家族反复调优分支规则和预处理策略。原文引用的"1991到2015年算法效率提升450亿倍"这个说法,本身也没有排除这种针对基准调优的偏差——进步是真的,但进步的幅度里有多少是"更懂考题",很难分清。

  • 风险.重尾分布意味着绝大多数场景下系统看起来很快、很稳,但一旦撞上尾部实例,代价可能是平时的几千倍,安全关键或对抗性输入场景尤其危险。

条件可解,不是已解决

调度问题原文只强调"能找到可证明最优解",但生产环境真正在意的还有稳定性、可解释性、对扰动的鲁棒性——这些原文完全没提。

理论上理论和实践没有区别,但实践上有区别。——Benjamin Brewster

这句话经常被当作"理论无用论"的挡箭牌,但它反过来也提醒了另一件事:实践能绕开理论的最坏情况,前提是有人先替你把输入的分布规整好。Amazon能一天跑十亿次SMT,是因为工程团队先把问题裁剪成了求解器擅长的形状;这不是NP-hard理论错了,而是理论从来只描述最坏情况,工程负责让最坏情况尽量不出现——出现了,就是代价。

对写包管理器、CI调度、约束求解的人来说,这条边界值得记住:能不能大规模上线,看的不是"这是不是NP-hard",而是能不能把输入分布锁进一个已知安全的范围。锁不进去的场景——密码学、形式化验证、任何有人主动构造坏输入的地方——那句"加个超时"式的乐观,可能就是最不该抄的作业。