人生算法——解决人生难题的三种思路
正如那句谚语「在手里拿着铁锤的人看来,世界就像一颗钉子」,现代教育划分学科的做法让受过高等教育的人相信,世界正是用他们学科解释的那样运作着:在只学统计学的人看来,世界是各种概率的集合;在只学生物学的人看来,世界是各种生态系统的集合;而在只学工程学的人看来,世界也不过是各种零部件组装起来的罢了。
这样将任何事物都归为某一学科,符合大脑「认知吝啬鬼」的特点,可以极大地降低大脑的认知负荷,但认知科学早有研究,这样看待事物会出现很严重的「认知偏差」。换句话说,真实的世界在你眼中变得扭曲了。
所以,跨越学科的边界,看看别的学科如何思考问题,有助于修正认知偏差,更全面地看待事物。「他山之石可以攻玉」,从别处借鉴过来的思想,也许正好可以解决你当下的问题和困惑。
基于这样的出发点,这篇文章想和你探讨一下计算机科学中的核心——算法,谈谈从算法的视角来看,如何解决人生的种种难题。
人生算法
看到「算法」这个词,你是不是一下子紧张了起来,以为本篇文章要罗列一大堆代码或者数学公式呢?你大可放心,本篇不会涉及具体的代码或者数学公式。虽然计算机科学和数学的从业者必须要学会如何用代码和数学公式来表示算法——那是精确描述算法的语言,但对于普通读者来说,理解算法的思想,换个角度看待这个世界,就是一个很好的开端。如果你看完之后,对算法产生了兴趣,想要进一步了解,这时再去接触那些独特的语言也不迟。
算法其实无处不在。比如说如何安排一次出行的行程?你如何安排一天的时间分配?你如何选择职业的发展方向,实现「弯道超车」?……这些,其实都是算法。
在计算机科学领域,算法是用来描述一种有限、确定、有效的并适合用计算机程序来实现的解决问题的方法。泛化一些来说,算法其实指的是在一定情况下可以实际解决问题的方法。比如说,你以交通和住宿的费用来确定旅行的行程,那么价格的排序就是旅行的算法。什么时候有特价机票,哪个地方住宿便宜,这些因素决定了你如何旅行。又比如,你用任务的重要和紧急程度来安排一天的时间,那么对于任务重要和紧急程度的排序,就是当天处理事务的算法。而对于以「弯道超车」为职业发展目标的人而言,你从事不同职业在一定时间内发展速率的排序,就是它的算法。
「最小价格」「最重要」「最紧急」「最快速度」……你会发现,无论是哪种算法(当然,排序算法仅仅是算法中的一小部分),其本质都是在限定范围内寻求「最」。
也许你听过数学家高斯的那个故事。当别的同学还在逐一计算从 1 加到 100 的时候,高斯另辟蹊径,以乘法代替加法,最先算出 5050。此时,乘法是一种实现目标时间最短的算法。从现实世界来看,Google 搜索引擎打败其他商业搜索引擎,正是因为 Google 的 PageRank 算法可以给用户提供最精准的搜索结果。
所以,用算法来思考人生,本质上就是寻找在有限的时间内哪种方法可以最快且行之有效地解决当下问题。单位时间内解决的问题越多,你的人生也便拥有更大的可能性。所以人生算法只有一个目标——寻求「最」。而这一点,经过数十年的发展,在计算机领域里面有一些公认的经典算法,他们可以很有效地解决一些问题。
这里,就和你介绍三个关于「最」的算法。
最能解决确定问题的算法——分治法
MIT 的 认知科学家 Josh 证明,人类最佳的抽象知识结构是树形结构。麦肯锡的金字塔原理也是按照树形结构来拆解问题,解决问题。而在计算机领域也有类似的结构,它被称作分治法(divide and conquer)。
分治,顾名思义,分而治之。即将无法着手解决的大问题首先拆分成一系列规模较小的相同或相似的问题,然后逐个解决小问题。通过解决完每个小问题来解决整体的大问题,这就是分而治之。分治法产生的子问题与原始问题相同,只是规模减小,反复使用分治方法,可以使得子问题的规模不断减小,直到能够被直接求解为止。
什么样的问题可以采用这种思路来求解呢?比如 NBA 季后赛的赛程就符合这样的思路。
如图,征战 2016-2017 NBA 季后赛的球队总共有 16 支,如何在 16 支球队里面选出最优的那一个?如何直接让 16 支球队两两比赛,然后计算最优,那这个问题的复杂程度会大大增加。所以为了降低复杂程度,减小难度,赛制将这些球队划分为东部和西部两个赛区,而在赛区里面,又进一步拆分,最终确定了比赛的队伍。
这样将大问题「16 支球队里面哪支最好」拆解为较小的问题「西部球队里面哪支最好?」,然后反复应用分治,再拆解为「勇士和开拓者哪支球队更好?」,就是分治法。
你可以发现,用分治法解决问题有三个步骤:
1、将问题逐步拆解,直到最后拆解为若干个可以解决的小问题,每个小问题和大问题类似;(「从 16 支球队里面选最优」->「从 8 支球队里面选最优」->「从 2 支球队里面选最优」)
2、逐一解决这些小问题;(每两支球队进行一场比赛)
3、将这些小问题的解答合并,最终获得原始大问题的解答。(「16 进 8」->「8 进 4」->「半决赛」->「决赛」)
应用分治法,一般出于两个目的:一是通过分解问题,使无法着手解决的大问题变成容易解决的小问题;二是通过减小问题的规模,降低解决问题的复杂度(或计算量)。
而且,应用分治法也需要有前提,即问题是明确的,你知道问题应该如何解决,或者问题如何被拆解到可以解决的程度。比如,类似「如何在行业内成为 TOP 级别的人才」就属于这样的问题。首先,达成目标所需要技能和能力你大致是清楚的,如何掌握和拥有该种技能和能力的路径也是清晰的,这时你需要做的,就是用分治的算法,去逐一解决每个小问题,最终合并起来,解决整个的大问题。
探寻最短解决路径的算法——动态规划
对于确定性的,知道如何解决,但因为规模庞大或者特别复杂而难以解决的问题,适合使用分治法。但人生有时的难点在于,解决问题的方法并非是确定的。
比如你想要解决的问题是——如何实现财务自由。对于这样的问题,目标是清晰的,即「被动收入 ≥ 主动收入」,但实现的路径却是多种多样。比如你既可以选择通过理财投资,复利增长的方法实现,也可以通过创造出可以盈利的产品来实现,又或者,你选择投资学习,期待学习带来主业上的进步,继而带来薪资上的增长。
当然,你可以采用分治的方法去逐个尝试,比如先创造不同的产品,然后再尝试不同的理财和投资,最终通过种种方法的组合,最终达成目标。然而,这样的做法不仅会花费大量的时间,而且在任何一个领域都是浅尝辄止,难以深入。最终的结果,可能是流于表面,反而难以达到目标。那么该怎么做呢?你可以借鉴算法里面动态规划的思想来看待这件事。
动态规划(dynamic programming)是解决多阶段决策问题常用的最优化理论,该理论由美国数学家 Bellman 等人在 1957 年提出,用于研究多阶段决策过程的优化问题。
这个方法简单来说,就是在当前状态下,想要进入下一阶段,什么样的选择是最优的,而且随着状态的变化,路径也会随之发生改变。比如当你处在没有积蓄的状态时,通过业绩的增长来获得收入的增长是一个不错的选择;而当你有了一定的积蓄,职业发展也随之稳定的时候,如何使用积蓄和业余时间决定了怎样进入下一个阶段。
和分治法一样,动态规划解决复杂问题的思路也是对问题进行分解,通过解决了一个个子问题,进而解决整个问题。但和分治法不一样的是,动态规划不是按照「小问题和大问题相似」这样的思路去拆分的,而是按照阶段划分的。
比如,在实现财务自由这件事情里,你可以这样划分阶段:第一阶段,解决温饱问题;第二阶段有一些储蓄,考虑储蓄如何使用的问题;第三阶段,如何进一步扩大储蓄或者资产……这样,就将一整个问题拆分成了一个个阶段。
动态规划方法的原理就是把多阶段问题转化为一系列的单阶段问题,然后利用各个阶段之间的递推关系,逐个确定每个阶段的最优化决策,最终堆叠出多阶段决策的最优化决策结果。
动态规划中,前一个阶段的结果影响着现阶段的决定。比如你在一个行业已经深耕了 10 年,获得很好的成就,那么当你向着下一个阶段进发的时候,就不得不考虑原来的积累,需要将上一个阶段的结果作为这一个阶段的起点来考量。
这就是动态规划视角下的人生,当前的决策受到之前决策的影响,下个阶段的决策也会因为这次决策而发生改变。运用动态规划的思路,就是在这条决策链里面实时调整,从当下出发,求得每个阶段最优的那个解。
最能解决目标不清晰的算法——贪婪选择
动态规划划分了阶段,在每个阶段根据可选项进行最优化的选择。然而它是基于一个三有前提——有目标,有阶段,有路径。
比如,追求财务自由的过程中,你知道自己的目标(被动收入≥主动收入),也知道自己所处的阶段(各种收入的多寡),还知道实现的路径(创造作品或者理财投资)。你要做的是根据整体的目标,选择每个阶段最优的行动。
然而现实生活中还有很多问题,并非这么理想。比如某个阶段的选择过多,又比如整体的目标不甚清晰。当下人工智能的发展,符合这一现状。
当下人工智能发展火热,人人都知道人工智能会越来越强大,但人人都不知道它什么时候可以到下一个阶段,又或者进入下一个阶段的路径实在太多,不知从何着手。
这个时候,不妨采用算法中贪婪选择的思路来看待这个问题。
贪婪法(greedy algorithm)是寻找最优解问题的常用方法。这种方法模式一般将求解过程分成若干个步骤,在每个步骤都应用贪心原则,选取当前状态下最好的或最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好或最优的解。贪婪法的每次决策都以当前情况为基础并根据某个最优原则进行选择,不从整体上考虑其他各种可能的情况。
同样是寻求当下最优的解决方案,贪婪选择和动态优化的区别在于,动态优化着眼于所有阶段,而贪婪仅仅关注当下最优。
这就好比是去吃自助餐晚宴,采用动态规划的人会这样思考:在不影响晚上睡眠、消化、或者体重大幅增重的情况下,我如何吃到总价值最大的美食?而贪婪呢,就是我们通常意义上的「扶墙进、扶墙出」,不管后续,在当下情况下能吃下多少就吃下多少。
采用贪婪选择毫无疑问是一种短视行为,但作为计算机常用算法,它自然有着独到之处。即不用去计算每一种可能性,然后再得出一个最优解,而是节省大量计算资源,专注于当下,也就是俗称的「摸着石头过河」。
在这种情况下,每一次行动或者选择,都是在河水中寻找下一块石头,下一块石头,就是我们的最优选择。这个时候,我们不管整体的过河路径,也不考虑整体的过河时间,只要找到下一块石头,那么我们就知道我们在前进。
回到前面的人工智能,面对这样的新生事物,我们只能总结过往,向未来探索。我们不知道它的下一个阶段是什么,也不知道有什么具体的路径可以达到那个阶段。我们做的,只能是贪婪选择,寻找一块又一块的石头,以期待最终过河。
当然,大多数情况下,由于选择策略的「短视」,整体的路线看起来是一个曲折的过程,而最终的目标,可能也和我们真正想要的目标想去甚远,但是在没有更好的情况下,贪婪选择可以得到近似最优解——毕竟,还是过河了不是吗?
小结
人生算法,解决着三种人生难题:1)问题明确,如何解决?2)有大概方向,如何前进?3)目标不明确,当下如何做?
对应这三种状态,算法给出了三种解决方案:分治、动态规划、贪婪选择。希望你可以从中获得启发。
然而,无论是被验证多少次的算法,也仅仅是算法,是一种思考的方法。而真正的人生,还是要我们自己一步步走下去,不断根据当前的情况进行动态优化,贪婪地寻找当下最好的方案,最终分而治之,解决人生的大问题。■