# 实用者、改进者、竞争者和终结者

![](https://piccdn3.umiwi.com/img/201905/15/201905152336214067596323.jpg)

这一讲我们用一点计算机思维来思考一个策略问题。

最近我听到一个说法，说理工科的知识，在生活中几乎都用不上。我理解他的意思是说我们平时也就买个菜算个账用一点小学数学，最多再算算理财和保险；而像什么微积分啊量子力学啊这些东西根本用不上。一个证据是文科生不懂那些，日子过得也不错。

我反对这个说法。理工科的知识带给我们的不仅仅是具体的方法应用，更是一种思维模式，能帮助我们清醒思考生活中遇到的问题。而且有些理工科知识就是可以用于日常生活的，比如我们专栏以前讲过的一本书《指导生活的算法：人类决策中的计算机科学》，就对生活有明确的指导意义。如果一个人学了一大堆科学知识，日子却过得很糊涂，做出很多错误的决策，那只能说明这个人并不是真的懂科学。

不过我们也得承认，日常生活中的事儿，大多确实用不上特别高级的知识。而以我之见，这是因为要解决同样一个问题，不同应用级别要求的实现水平不一样 —— 只有高要求，才需要高级工具。

这一讲咱们说一个计算机科学的著名难题，来看看应该怎么应对难题。

## 1.难题

当一个计算机科学家说“难题”的时候，他说的可是真正的难题。

老百姓说的难题，通常都不是真的难题。比如你让一个小学生做一道高中数学题，他会说这是一道难题 —— 但这个难度是相对而言的，换个数学家来，高中数学题根本不叫事儿。老百姓爱说“难者不会会者不难”，其实具有这个性质的事儿都不是真的难题。

真正的难题，得是绝对意义上的难。哪怕有一道题，现在活着的所有人都不会做，你也很难说将来会不会有人找到一个巧妙地解法，他一说那个解法大家都会觉得很简单，所以那还不能算“绝对意义上的难”。

而计算机科学家，找到了一种绝对意义上的难题。术语叫“NP困难（NP-hard）”。如果再强行翻译一下，大约叫“非确定性多项式困难”……不过你不必在意这个术语，你只需知道，凡是“NP困难”的问题，都是绝对的难题就行了。

为了理解这一点，咱们先看看什么是简单的问题。

比如现在给你一份学生名单，让你找一找，其中有没有一个叫“王小二”的学生，这就是一个简单问题。简单体现在计算时间短。你只需要把名单上的名字过一遍就行。对计算机来说，这是最简单的搜索。我们容易理解，如果名单上有 N 个名字，那么搜索时间将会和 N 成正比。

好，再看第二个问题。还是 N 个学生，现在让你按照考试分数给他们排个名次。如果你手动，先挑最高分，再挑第二高的分这么排，你就太慢了。如果你对计算机算法有一定了解，你大概知道有一些特别聪明的排序算法。其中最快的排序算法所需要的运行时间，大约和 N·log(N) 成正比。排序比搜索要慢一些，但是这个时间也还可以，我们仍然可以说这是一个简单问题。

那什么叫“困难问题”呢？请看第三题。

在一张地图上有 N 个城市，想象你是一个推销员，你能不能找到一条最短的路线，不重不漏地经过所有这些城市去做推销，然后回到起点。比如像下面这条路线 ——

![](https://piccdn3.umiwi.com/img/201905/15/201905152229067887956775.png)

这个问题听起来很直观，好像挺简单，这不就是快递员每天都面对的问题吗？但是，这是一个非常难的问题。上面图中就是一条看起来不错的路线，但是你怎么知道它是不是所有可能路线中*最短的*一条呢？

这个问题叫做“旅行推销员问题（Traveling Salesman Problem）”。这是一个最著名的组合优化问题。这是一个“NP困难”问题。

解决这个问题没有什么特别聪明的计算机算法 —— 你几乎就是只能把这些城市的所有排列组合都计算一遍，看看其中哪个最短。你所需要的计算时间，不是跟 N 成正比，也不是跟 N 的平方成正比，也不是跟 N 的几次方成正比 —— 而是跟 (N-1)的阶乘（(N-1)!）成正比。

如果是 10 个城市，你得尝试超过 36 万种路线。如果是 15 个城市，你得尝试超过 871 亿种路线！[1]

这才叫难题。难题的意思，就是换谁来也没用，根本就没有巧妙解法，只能老老实实地这么算，而计算它所要消耗的时间是你无法忍受的。

1970 年代，计算机科学家发展了一套“计算复杂性”理论，“NP困难”这个概念就是那时候提出来的。1972 年，加州大学伯克利分校的理查德·卡普（Richard Karp）证明旅行推销员问题是个NP困难问题。这也就是说，不但现在没有好的解法，而且我们在理论上证明，这个问题它就几乎不可能存在什么好的解法……

……我为什么要说“几乎”呢？因为这里面涉及到一个数学猜想，叫“P=NP”，也就是说也许还有存在简单算法的一线希望，不过多数计算机科学家不相信那个猜想……这件事无关本文主题。

总而言之，“NP困难”是真正的困难。连计算机都认为它是个难题。那我们应该怎样面对这样的难题呢？这取决于你是个实用者，改进者，还是竞争者。

## 2.启发式算法

说到这里，也许你对旅行推销员问题有个不吐不快的想法。为啥非得追求“最短的”路线呢？我们日常生活中如果要连续去几个地方，有谁会精心计算各种排列组合呢？我们都是找一条看起来差不多的路线就可以了！

没错。这就是“实用者”的态度。计算机科学家非常理解这个立场。事实上，面对NP困难问题，最方便的做法，就是找个差不多的解。

这就引出了“启发式算法”（heuristics），也就是使用看起来比较聪明的套路，寻求一个差不多的解。

对旅行推销员问题来说，有个简单的启发式算法叫“最近邻居法”：从任何一个城市开始，每次访问的下一个城市都是距离当前城市最近、同时又是尚未被访问过的城市。

比如下面这个局面 [2] —— 

![](https://piccdn3.umiwi.com/img/201905/15/201905152230164975469787.png)

红色路线是我从 A 点出发，用最近邻居算法找到的一条路线；绿色是理论上的最短路线 —— 我们看到，我选的路线只比理论最短路线长了那么一点点。谁会在乎这点差异呢？

这个最近邻居算法的计算速度非常非常快，而且一般的经验，它得到的结果，平均而言，大概也就比真正的最短路线长了 25%。对实用主义者来说这是完全可以接受的。

类似这样的例子非常多，可以说是计算复杂性理论界的一个常识：对于NP困难问题，通常都可以用启发式算法得到差不多、过得去的答案。你将来在江湖上行走，如果有人跟你说“NP-hard”，你的第一反应就应该是“heuristics”。启发式算法是如此的省时省力，而且它们得到的答案常常令人惊奇地接近最佳答案。

戴维·威尔逊在我们前面讲过的《生命视角》这本书里也提到了旅行推销员问题，他认为演化就是一种启发式算法。生命演化不一定能确保找到最优解，但是一定能给你一个不错的解。

对实用者来说这真是一个愉快的认知。如果你非得寻求理论上的最优解，你就成了一个“终结者”，你是想要终极答案，你是在终结这个问题。何必费那么大的劲呢？差不多就行了，真实生活哪里需要终结呢。

但是有些人并不满足于最近邻居算法。

## 3.改进者和竞争者

我们说了，旅行推销员问题其实是快递员每天都面对的问题。而一个真正的快递公司 —— 美国 UPS，就对这个问题非常感兴趣。他们不满足于最近邻居算法，他们想要更好的启发式。

这是因为 UPS 在这个问题上不是一般过日子的老百姓。他们有 55000 个快递司机，他们每天要前往1600万个投递地址。哪怕是能让每个快递员每天少走一英里，UPS每年就能省下三千万美元。

UPS 是个改进者。几年前我看到一个报道 [3]，UPS 开发了自己的路线规划系统，叫ORION。ORION 并不能终结旅行推销员问题，它也是一个启发式，但它能给出更好的答案。如果你面对的是一个几千万美元的问题，改进的功夫就是值得的。

而计算机科学家还在另一个角度改进算法。我们知道最近邻居算法能得到大概比理论最短路径长 25% 左右的路径，但是这并不是绝对的，只是一般的经验而已。有时候最近邻居算法给的答案不但不是最短的，还可能是最长的。那有没有一个算法，能确保给一个“肯定不坏”的答案呢？

1976 年，伦敦帝国学院的 Nicos Christofides 教授提出一个算法，能保证，它给出的路线比理论最短路线，最多长 50%。他的方法非常数学化，我也不会讲你也不用问，但是我想说的是这件事儿有多厉害 —— 

此后几十年一直有人想打破这个记录都没有成功。直到 2011 年，斯坦福大学和麦吉尔大学的一个联合团队，才打破了这个 50%的记录 [4]，轰动一时。那他们创造的新纪录是多少呢？是百分之 -- 

49.99999999999999999999999999999999999999999999999996【小数点后面有 49 个 9】

那你可能会说，搞这样的改进值得吗？值得。因为他们不仅仅是改进者。

他们是竞争者。

## 4.日常问题和精英解法

我家邻居有个小女孩刚上高中。她的父母有一次跟我们聊天，不经意地告诉我们，说女儿在学校里踢足球 —— 不是一般地踢足球，是踢“竞争性”的足球。

我一听就肃然起敬。这不是业余爱好，不是陶冶情操，不是什么锻炼品格，这是冲着正式比赛和国家队去的。竞争，能让人舍得发挥最大的潜能。

为什么我们在日常生活中用不上特别高级的技能呢？因为我们通常都是实用者。实用者的态度是够用就行，而“够用”很容易。

这辆车的造型可能没有那辆车那么酷，但是安全、越野、油耗各方面性能其实都不差，而价格便宜了一半，那就买这辆呗。实用者追求以最小的投入获得比较高的产出。

人们经常说什么“精益求精”、什么“追求卓越”，其实实用者不需要那些。比如你要写个报告，为此要做很多调研，请问你应该调研到什么程度？答案是够用就行。在这个时代搜集信息是没有止境的，你必须学会适可而止。调研是个边际效应递减的事儿 —— 如果调研带来的好处已经比不上调研本身的成本，那你就应该停止调研。没有这个实用态度，你就寸步难行。

可你不能什么时候都“只选对的不选贵的”。有时候对的就得是贵的。像UPS改进路线算法，那个边际效应很难减下来，你就得舍得大投入，你就值得用高级的手段。

而对竞争者来说，“边际效应”几乎就是个没有意义的概念。面对胜者通吃的局面，赢了就赢得一切，输了就啥也没有，那你就得真得全力以赴。也许赛车性能提高 5%，价格要提高五倍 —— 那你也得花这个钱。竞争者不能计较性价比。

如果一个人过惯了普通的日子，可能看什么问题都是实用者心理。比如有人说高考为啥要考那么难的数学呢？我们根本用不上啊！殊不知高考是个竞争项目，那么难的数学就是为了把问这种问题的人淘汰掉的……

再比如说，以前中国的很多工厂，生产车间都是脏乱差，一点都不规范。你要说应该规范化，工厂老板可能会说规范很贵啊！对付对付差不多就行了。这种实用者会对自己的小精明沾沾自喜。

比如有个段子说怎么判断生产线上肥皂盒里装没装肥皂呢？高级手段又是微电子又是X射线，而乡镇企业的一个小工想了个办法：用电吹风吹！空盒子自动会被吹走。

过日子也许真的可以这么干。但是要想在国际竞争中占据一席之地，这种对付的办法可是不行的 [5]。你需要更强的安全性和可靠性，你会对生产环境有极端的要求。

陶醉于实用主义小精明的人，对高级知识的力量一无所知。

面对难题，弱者的思维方向是从实用者开始，在现实中被逼改进。而强者的思维方式是从终结者开始，实在解决不了，退而求其次才寻求改进。

![](https://piccdn3.umiwi.com/img/201905/15/201905152232493820769422.jpg)

