Photo by Nic Rosenau on Unsplash
从小确幸到行大运
演化就是逐渐积攒的小确幸,最后变成了行大运。演化始终都只是一组前后相继的机械步骤,不用借助任何外在的智能,用盲目的偶然来推进,以自然选择来校验。存在一种数据结构,它能通过编码控制角色的属性,又能被复制和重构,这就是基因。
演化论是达尔文在1859年的《物种起源》中提出的。他说所有的生物在繁殖时,都会产生微小的随机的遗传变异,带有这些变异的个体会发展出不同的能力差异。在自然选择中,某些能力差异会增加了个体的生存繁殖能力,从而导致这些个体的后代更多,反则反之。这样,那些有利于个体的遗传变异得到保留,而那些没有变异或者有不利变异的个体的后代数量则减少甚至消失。
变异会增加生物在各个层次的多样性,这些层面包括种群、个体性状甚至身体的分子构成。
这些变异逐渐累积,如果达到了生物个体间生殖隔离的程度,则导致新物种的产生。
达尔文的学说用一个统一的过程解释了几乎一切物种的产生。这个过程简洁有力,使得它像是一段程序。是的,它就是一个算法。如果我们了解软件编程的话,我们可以认为达尔文的学说是简单的公式:
对具有表现功能的数据结构进行有随机性误差的复制。通过筛选,一些复制品能更好地适应环境。
如果让我用一句话解释演化论,我会说:
演化就是逐渐积攒的小确幸,最后变成了行大运。
想象我们在玩电脑游戏,比如我喜欢的《文明》系列游戏。我自诩能玩最高的天神级的难度,但其实水平挺烂的,往往几回合下来就要亡国了。怎么办?用大家都知道的办法,存档和读档呗。在几乎每一次获得了些许进展的时候,比如踩到了一个好的村庄,干掉了一个难缠的野蛮人据点,或者攻克了一座敌方城池之后,我马上按下F5按键,快捷存档,然后继续。如果后面进展不顺,我按下F8读档,重新来过。经过这样的SL大法,我也可以偶然通关天神难度了,如此简单。
演化算法也类似的,生物个体在每一次繁殖时,都相当于将其祖祖辈辈积攒的好运气存了档,存在自己的基因中,然后以此为起点,开始新的一局。
当电脑往磁盘上写入存档时,偶然会发生微小错误,比如某个字符写错了,这称之为突变。可以认为,在新的一次读档后,我们有可能发现角色的属性有点点不一样了。为了方便讨论,我们将突变定义为是最小的变化,它只指一个字符的数据差别。
这些突变也许给角色某些微小的增强,比如移动更快视野更广,也许会损失角色属性,比如降低了生命值,有时候甚至坏档直接读不出来了。
我越是玩到后来,读档的次数越多,这越是表明我依靠了前面很多次存档不断积攒的运气。当某天我终于通关了最高难度时,这些积攒的小运气已经帮助我完成了一次看似不可能完成的任务。
大自然母亲也是这样。不同的是,她玩的是无限游戏,不用通关,但是这积攒运气的过程一样的。
这么多的存档,都曾经被读档后继续运行,直到再次存档。有的直到现在都还在继续,这就是我们现在地球上活着的所有生物个体。
如果我们从现在的这份存档出发,回溯到上一份存档,再回溯到它的上一份存档,如此反复,我们就会找到我们的各个祖先。从他们那儿到我们这里的这条线索,就是遗传。
然而,还是有大部分存档被抛弃,从此那条线索就中断了。为什么这些存档被废弃?因为进展不顺利,要么角色属性不强,要么运气不好,遇到了怪物打不过,或者踩到了坑,总之来不及存档角色就挂了,这类存档成了死档。在达尔文学说中,这个过程称之为 自然选择。
自然选择是大自然塑造生命的关键力量。变异是遗传字符的随机组合,是无方向的盲目偶然性。但是通过自然选择,这些随机组合中大部分被废弃了,留下了那些具有适应性的,或者仅仅是运气好的变异。这个过程使得生物能够适应环境。
我们在大自然中看到了许多工程奇迹,比如雄鹰的眼睛、人类的大脑、蝙蝠的耳朵等等。很难相信,一个算法会达到如此成就。但是,生命从40亿年前开始经过了亿万个世代,如果你用几十亿次存档读档来玩一个游戏,又有什么不可能呢?
演化算法的威力在于,它是迭代的、累积的、分布的,这简直是软件工程中敏捷开发的最佳实践。它将艰巨任务拆解分散在广阔时空中,由无数个进程同时运行,千头万绪,齐头并进。
尽管如此,演化算法始终都只是一组前后相继的机械步骤,不用借助任何外在的智能,用盲目的偶然来推进,以自然选择来校验。这是科学,是彻底的唯物主义。
这里头的关键在于,存在一种数据结构,它能通过编码控制角色的属性,又能被复制和重构,这就是我们大家都熟知的基因了。
自然选择作用在随机性的基因突变上促使生物的进化,简单又合理。但是,仅仅凭自然选择这个单方向的作用力,就真的能够造就生物界如此纷繁复杂的多样性和复杂性吗?
大家的怀疑没错,这个问题需要一个更形象的模型来阐述。在继续前进之前,我们先补课,了解一下基因的概念。