Kauffman & Levin,1987 — 把「崎岖度」变成一个可以拧的旋钮
有的问题,你一点一点改,最后总能改到最好;有的问题,改到某处就再也动不了了,而你明知道还有更好的方案在别处。这两类问题的差别在哪儿?
把配置空间画成地形之后,问题就变成了:地形的崎岖程度——有几个山头、山头之间隔多远——由什么决定?Stuart Kauffman 和 Simon Levin 要的不是某个具体系统的真实地形(那通常测不出来),而是一台可以调节崎岖度的发生器:一个旋钮从"只有一座山"一直拧到"完全随机的碎石地",中间连续可调。有了它,才能问"崎岖度变化时,搜索行为怎么变"这种问题。
要点全在第 2、3 条。K 是相互依赖的程度:K = 0 时每个部件自己说了算;K = N−1 时每个部件的好坏都被所有其他部件牵着。而"随机抽一个数"这个设定是故意的——它表示"我们对这些依赖关系一无所知",于是唯一进入模型的信息就只剩下 K 本身。
还有一个后果值得说清:翻转一个部件,不只改变它自己的贡献,还会改掉所有依赖它的那 K 个左右的部件的贡献。K 越大,一次改动搅乱的东西越多——这就是崎岖度的来源。
从一个随机配置出发,反复搬到更好的邻居去(这叫适应性行走,adaptive walk),直到没有更好的邻居为止。三件事会稳定地出现:
① K = 0 时地形只有一座山。每个部件的最佳状态与别人无关,你可以逐个定下来,所以从任何起点出发都能走到同一个顶点。这个顶点的适应度是每个部件"两选一取大"的平均,也就是约 0.67。走到顶大约要 N/2 步。
② K = N−1 时地形彻底随机。任意两个相邻配置的适应度毫无关系。此时局部最优的个数是 2N⁄(N+1)——N = 20 时约五万个。更要命的是行走会很快结束:每往上走一步,比当前更好的邻居数大约减半,所以从随机起点出发,只需要 log₂N 量级的步数就再也走不动了。N = 100 的系统,大约走七步就卡住。
③ 而且卡住的位置并不高。K 越大,适应性行走能到达的峰越接近随机配置的平均值 0.5。Kauffman 把这个现象叫复杂性灾难(complexity catastrophe):部件之间相互牵制到一定程度之后,"演化/优化"这件事就几乎不再带来任何优势。
另有一条常被忽略的结果:K 介于两端之间时,最有意思的事情才发生——地形既有多个峰,峰之间又还保留着相关性(相关长度随 K 上升而变短)。中等 K 是唯一一段"既有多样的好方案、又还能靠搜索找到它们"的区间,这也是"混沌边缘"这类说法在 NK 语言里最接近可定义的地方。
NK 模型的用法从来不是"代进真实数据算出答案",而是作为一台产生定性预期的机器:如果某个系统的部件相互依赖变强,你应该看到什么?
它给出的预期相当具体:局部最优会变多(不同的团队/物种/公司会稳定地停在不同的方案上,且都不是最优);渐进搜索的收益会迅速衰减(同样的努力,改进幅度越来越小);起点会变得比努力更重要(路径依赖);模仿会变得困难——Jan Rivkin 在 2000 年用 NK 论证过这一点:高 K 的战略哪怕被完全看见也难以被抄走,因为抄错一两个部件就会掉进谷里,而部件的数量让穷举变得不可行。
同一台机器还解释了为什么模块化是一种如此普遍的演化产物:把系统切成模块,就是在人为地把 K 压低,代价是放弃跨模块的协同(峰会矮一点),换来的是"小步改进重新有效"。这正是第 3 期近可分解性那条论证的定量版本。