生命游戏
第一章 · 早期的生命

一条规则、几个格子,怎么长出一台无限运转的机器。

全章 36 个图样,每一个都可以直接在页面里运行、单步、缩放。

1.1一条规则

生命游戏没有玩家。你只需要在一张无限大的方格纸上涂几个格子,剩下的事情全部由一条规则决定。每个格子有八个邻居(上下左右加四个斜角),下一代的样子由每个格子当前有几个活着的邻居算出来:

一个死格子,如果恰好有 3 个活邻居,下一代就活过来;一个活格子,如果有 2 个或 3 个活邻居,下一代继续活着,否则死掉。

这条规则通常写成 B3/S23B 是 born(出生),S 是 survive(存活),后面的数字就是所需的活邻居个数。整条规则只有这么多,没有别的补充条款。

关键在于所有格子同时更新。你算下一代的时候,读的全部是当前这一代的状态,不存在“先算左边再算右边”的先后之分。下面这个例子最能说明问题:一条四格长的横线,两端因为邻居太少而死去,中间两格活下来,同时上下各有位置凑够了 3 个邻居而诞生新细胞——几步之后就稳定成一个叫“蜂巢”的小方块。

下面每个窗口都可以直接操作,默认是暂停的:点速度按钮开始跑,单步一次走一代,重置回到初始状态。场地放大 / 缩小改变的是格子的行列数,也就是这块地本身有多大——画面里画出来的就是全部,边界之外没有隐藏空间,跑出去的东西会撞在边框上。所以看长时间演化(比如玛土撒拉、枪)之前,记得先把场地放大几次。

图 1.2 · 四个细胞排成一行 — 一条长度为 4 的直线,几步之后安定成一个蜂巢。

1.2从一团乱麻开始

如果只是随手涂一大片格子,会发生什么?直觉可能会说“乱下去”或者“全死光”,但实际结果是第三种:先剧烈翻腾,然后迅速冷却。活细胞总数会在几十代内暴涨又暴跌,几百代之后,画面基本静止下来,只剩一堆小零件散落各处,偶尔有几个小东西还在原地闪烁。

更值得注意的是,随便换一团乱麻,最后剩下的零件种类几乎是同一批。这不是巧合。这些零件之所以能剩下来,正是因为它们在这条规则下是稳定的;不稳定的组合早就在混乱期烧掉了。所以生命游戏里的“常见图样”不是谁设计的,而是被规则筛出来的。

图 1.4 · 随机涂鸦(一) — 随手画的一团乱麻,最后几乎总是碎成一堆小零件。
图 1.5 · 随机涂鸦(二) — 换一团乱麻,结局的构成惊人地相似。

1.3三类居民:不动的、原地跳的、会走的

把混乱冷却后剩下的东西分个类,会发现它们干净地落进三个筐里。

静物是每一代都和上一代完全相同的图样。方块、蜂巢、面包、池塘都属于这类,它们是灰烬里最常见的成分。你可以把静物理解成“周期为 1 的振荡器”。

振荡器过若干代之后变回自己。变回来所需的代数叫它的周期。最常见的是周期 2 的闪灯和蟾蜍;脉冲星虽然块头大得多,却因为容易从混乱中自然形成而排在最常见振荡器的第四位。

飞船是最有意思的一类:它过若干代之后变回自己的形状,但位置挪动了。轻量级飞船每 4 代向前挪 2 格,所以它的速度记作 c/2。这里的 c 是生命游戏里的“光速”,也就是信息每代最多传播一格——因为一个格子只能影响到它的八个邻居,任何东西都不可能跑得比这更快。

图 1.6 · 九种最常见的居民 — 从左到右:方块、盆、船、舰、蜂巢、面包、池塘、闪灯、滑翔机。
图 1.7 · 脉冲星 — 周期 3 的振荡器,个头虽大却极常见。 LifeWiki ↗
图 1.8 · 四个振荡器 — 从左到右:蟾蜍、灯塔、时钟、十五格棒。
图 1.9 · 轻量级飞船 — 周期 4、速度 c/2 的正交飞船。 LifeWiki ↗
图 1.10 · 轻、中、重三型飞船 — 同一族的三兄弟,速度完全一样。

1.4小图样的命运

既然大图样的结局都差不多,那不如反过来问:最小的图样能干出多大的事?把几个格子连成一块,穷举所有摆法,逐个跑一遍,这是研究生命游戏最朴素也最有效的办法。

格子数一多,摆法数量涨得飞快:四联骨牌只有几种,六联骨牌有 35 种,七联骨牌有 108 种。它们绝大多数几十代内就安定了,但过程往往比结局好看——T 型四联骨牌会摊开成四个蜂巢围成的“蜂巢农场”,π 型七联骨牌的翻腾过程也远比它七个格子的身板复杂。

图 1.11 · T 型四联骨牌 — 四格图样,会演化出对称的蜂巢农场。
图 1.12 · 前蜂巢农场 — 再走几步就摊开成四个蜂巢围一圈。
图 1.13 · 阶梯六联骨牌 — 六格图样,最终留下一组路障。 LifeWiki ↗
图 1.14 · π 型七联骨牌 — 七格图样,演化过程比它的个头精彩得多。 LifeWiki ↗

1.5蜂后:把崩溃兜住

蜂后是个半成品。它会一边挪动一边在身侧产下一个蜂巢,可惜产完之后自己就崩了。单看它,这只是个活了几十代的小图样。

但这里出现了整本书最重要的一个思路:如果一个图样总是以同样的方式崩溃,那就在它崩溃的地方摆一个东西,把崩溃接住。方块正好能吃掉撞上来的蜂巢,自己毫发无损。于是在蜂后两端各放一个方块,蜂后跑到头被弹回来,来回穿梭,就得到了一个周期 30 的振荡器——蜂后穿梭机。

这就是“工程”的起点:零件本身可能是脆弱的、临时的,但把几个零件摆在恰当的相对位置上,就能得到一个永远跑下去的机器。后面所有复杂构造,用的都是这一招的放大版。

图 1.15 · 蜂后 — 会向两侧各产下一个蜂巢,然后自己崩溃。 LifeWiki ↗
图 1.16 · 方块吃蜂巢 — 方块把撞过来的蜂巢吃掉,自己毫发无损。
图 1.17 · 蜂后穿梭机 — 两个方块把蜂后的崩溃兜住,得到周期 30 的振荡器。 LifeWiki ↗

1.6第一把枪,和一个五十美元的赌注

1970 年,康威悬赏 50 美元,征集一个能让活细胞数无限增长的图样。当时没人知道这是否可能:所有已知图样要么安定下来,要么就那么大点。

Bill Gosper 的团队赢走了这笔钱。答案就藏在蜂后穿梭机里:让两台穿梭机对着放,它们每个周期都会在中间碰撞一次,而碰撞的残骸恰好凑成一个滑翔机飞出去。两台机器本身周期 30、大小不变,但滑翔机源源不断地流向远方,活细胞总数就永远涨下去了。

这台机器叫 Gosper 滑翔机枪。它同时是第一个无限增长图样,也是第一把枪。“枪”这个词在生命游戏里有确切含义:本体周期性地回到原样,同时不断吐出飞船。有了枪,就有了可以持续发送的信号,而有了信号,才谈得上造计算机。

图 1.18 · Gosper 滑翔机枪 — 第一个被发现的枪,周期 30,无限吐出滑翔机。 LifeWiki ↗

1.7双蜂:另一条产枪的路

B 型七联骨牌是灰烬里的常客,单独放着能活 148 代。把两个 B 型七联骨牌贴近了摆,它们会互相扰动、彼此“搀扶”,谁也没能立刻死透——这个组合叫双蜂。

接下来是同一套路:在它反复折腾的位置摆上方块,把残渣吃掉,于是得到双蜂穿梭机。它的价值在于周期结构和蜂后穿梭机不同,因此能拼出周期 30 那条路线做不出的枪,比如周期 46 的这一把。后来大量高周期的枪,地基都是它。

图 1.19 · B 型七联骨牌 — 寿命 148 代的常见不稳定图样。 LifeWiki ↗
图 1.20 · 双蜂 — 两个 B 型七联骨牌互相搀扶,谁也没能立刻死掉。
图 1.21 · 两个方块吃掉双蜂的残渣 — 把双蜂留下的垃圾清理干净。
图 1.22 · 双蜂穿梭机 — 1971 年发现,后来大量高周期枪的地基。 LifeWiki ↗
图 1.23 · 周期 46 的枪 — 第二个被发现的基本枪。 LifeWiki ↗

1.8开关引擎与方舟:另一种无限增长

枪靠不断发射飞船来实现无限增长。还有一条完全不同的路子:让一个东西一边爬行一边沿途铺垃圾

开关引擎正是这样的东西——它在 96 代里斜着挪 8 格,可惜单独一台会自己崩掉。但只要把两台摆在合适的相对位置,或者给它加个尾巴,就能让它稳定地一路爬下去,身后留下一串方块,或者不断甩出滑翔机。这类结构叫喷泥机,而由两台开关引擎互相稳定构成的经典组合,被称作方舟。

值得一提的是,开关引擎是第一个被发现的无限增长图样的核心,而且它小到可以从随机混乱中自然冒出来——这意味着即便没人设计,无限增长在一锅乱麻里也是可能自发出现的。

图 1.24 · 开关引擎 — 96 代里斜着挪 8 格的不稳定图样。 LifeWiki ↗
图 1.25 · 产块开关引擎 — 一路走一路铺方块,人口无限增长。
图 1.26 · 产滑翔机开关引擎 — 一边爬行一边不断放出滑翔机。
图 1.27 · 方舟 — 两台开关引擎互相配合形成的稳定增长结构。

1.9玛土撒拉:微小的种子,漫长的一生

还有一类图样,既不无限增长,也不很快安定,而是用极少的细胞撑出极长的寿命。它们被称作玛土撒拉,名字来自圣经里那位活了九百多岁的老人。

最出名的是 R 型五联骨牌:五个细胞,折腾 1103 代才终于安定,期间还甩出去六个滑翔机,最后留下 116 个细胞。仅仅五个格子就能引出这么长的过程,这是生命游戏最直观的“简单规则产生复杂行为”的证据。

如果放宽到十几个细胞,寿命还能爆炸式增长:有的图样能撑五万代,有的甚至跑掉七十多万代。注意这类图样很占地方:它们会摊开得很大,还会甩出滑翔机,所以观察之前先把场地放大几次,否则东西一撞到边框就没了。

图 1.28 · R 型五联骨牌 — 五个细胞,1103 代才安定下来。 LifeWiki ↗
图 1.29 · 寿命 52514 代的玛土撒拉 — 在 16×16 的小盒子里憋出五万代。 LifeWiki ↗
图 1.30 · 寿命 736692 代的图样 — 十六个细胞,跑掉七十多万代。

1.10反过来问:这一代是从哪来的

前面所有问题都是“给定现在,未来是什么”。既然规则是确定的,未来只有一个。但反过来问就完全不同了:给定现在,上一代可能是什么?

答案首先是不唯一。同一个方块可以由许多种不同的上一代演化而来,所以生命游戏是不可逆的——你没法从当前画面倒推出唯一的历史。

更有意思的是第二个答案:有些图样根本没有上一代。它们只能作为初始状态被人手动摆出来,永远不可能由演化产生。这类图样叫伊甸园。它们的存在不是猜测,而是被严格证明的,而且后来真的被具体构造了出来。基本思路是把平面切成一个个小瓦片,证明某些瓦片组合无论上一代长什么样都凑不出来。

沿这条线还能问得更细:能不能构造出有父母、但父母没有父母的图样?可以。这类问题看着像智力游戏,实际上把生命游戏从“看动画”变成了可以下定理的数学对象。

图 1.32 · 方块的各种父辈 — 同一个方块可以由许多不同的上一代产生。
图 1.34 · 由 6×6 瓦片拼成的图样 — 证明伊甸园存在的构造思路。
图 1.35 · 一座伊甸园 — 没有任何图样能演化成它。
图 1.37 · 一行厚的边框 — 构造细高伊甸园时的辅助结构。
图 1.40 · 演化成一行厚图样的例子 — 上一代可以很胖,下一代却只有一行。
图 1.41 · 高度只有 5 的伊甸园 — 把伊甸园压扁到 5 行。
图 1.42 · 没有祖父母的图样 — 它有父母,但父母没有父母。
图 1.43 · 上面那个图样的父母 — 这一代存在,再往前就断了。 LifeWiki ↗