打字猴:1.70106679e+09
1701066790
1701066791
1701066792
1701066793 ▲图10.2 左:灯泡阵列的初始状态,没有画灯泡之间的连线。右:变化一次之后的状态,规则是“采用邻域占多数的状态”
1701066794
1701066795 灯泡每一步如何“决定”是开还是关呢?它们都遵循一些规则,根据邻域内灯泡的状态——也就是相邻的8个灯泡和它自己的状态——来决定下一步的状态(是开还是关)。
1701066796
1701066797 例如,规则可以是这样:“如果邻域内的灯泡(包括自己)点亮的超过一半,就点亮(如果本来就是亮的,则不变),否则就熄灭(如果本来就是灭的,则不变)。”也就是说,邻域中9个灯泡,如果有5个或5个以上是亮的,中间的灯泡下一步就是亮的。我们来看看灯泡阵列下一步会怎么变。
1701066798
1701066799 图10.1的文字中说了,为了让每个灯泡都有8个邻居,阵列的四边是回绕相连的。可以想象成上边和下边合到一起,左边和右边合到一起,形成一个面包圈形状。这样每个灯泡就都有8个邻居。
1701066800
1701066801 现在再来看上面给出的规则。图10.2是初始设置和变化一次后的状态。
1701066802
1701066803 也可以使用更复杂的规则,例如,“如果邻域中点亮的灯泡不少于2个,不多于7个,就点亮,否则就熄灭”,这样阵列的变化就会不一样。或者这样,“如果刚好1个灯泡是灭的,或者4个是亮的,就点亮,否则就熄灭”。可能的规则很多。
1701066804
1701066805 到底有多少种可能的规则呢?说“很多”还太保守了。答案是“2的512次幂”(2  512  )  [147]  ,这个数字很大,比宇宙中的原子数量还大许多倍。(注释中有答案的推导过程。)
1701066806
1701066807 这个灯泡阵列其实就是一个元胞自动机。元胞自动机是由元胞组成的网格,每个元胞都根据邻域的状态来选择开或关。(广义上,元胞的状态可以随便定多少种,但是这里我们只讨论开/关状态。)所有的元胞遵循同样的规则,也称为元胞的更新规则,规则根据各元胞邻域的当前状态决定元胞的下一步状态。
1701066808
1701066809 为什么说这么简单的系统会是复杂系统的理想化模型呢?同自然界的复杂系统一样,元胞自动机也是由大量简单个体(元胞)组成,不存在中央控制,每个个体都只与少量其他个体交互。而且元胞自动机也能表现出非常复杂的行为,它们的行为很难甚至不可能通过其更新规则来预测。
1701066810
1701066811 同其他许多精彩的思想一样,元胞自动机也是由冯·诺依曼发明的,他在20世纪40年代受他的一位同事——数学家乌拉姆——的启发提出了这个思想。(为了与冯·诺依曼体系结构相区别,元胞自动机经常被称为非冯·诺依曼体系结构,这是计算机科学的一大笑话。)第8章说过,冯·诺依曼想要将自我复制机器的逻辑形式化,而他用来研究这个问题的工具就是元胞自动机。简单地说,他设计了一种元胞自动机规则,能完美复制任意元胞自动机的初始形态,他的规则中元胞不止两种状态,而是29种。
1701066812
1701066813 冯·诺依曼还证明他的元胞自动机等价于通用图灵机(参见第4章)。元胞的更新规则扮演了图灵机读写头的规则的角色,而元胞阵列的状态则相当于图灵机的带子——也就是说,它可以编码通用图灵机运行的程序和数据。元胞一步一步地更新相当于通用图灵机一步一步地迭代。能力等价于通用图灵机的系统(也就是说,通用图灵机能做的,它也能做)被称为通用计算机,或者说能进行通用计算。
1701066814
1701066815 复杂 [:1701064780]
1701066816 生命游戏
1701066817
1701066818 冯·诺依曼的元胞自动机规则相当复杂。1970年,数学家康威(John Conway)发现了一种简单得多的两状态通用图灵机,也能进行通用计算。他称之为“生命游戏”。  [148]  我不知道为什么叫作“游戏”,只知道“生命”来自于康威对其规则的解释。将状态为开的元胞看作活的,状态为关的元胞看作死的。康威用四种生命过程来定义规则:出生,死元胞的相邻元胞中如果刚好有3个是活的,下一步就变成活的;存活,活元胞的相邻元胞有2—3个是活的,下一步就能继续存活;过于稀疏,活元胞的相邻活元胞如果少于2个就会死去;过度拥挤,活元胞的相邻活元胞如果多于3个就会死去。
1701066819
1701066820 康威当时是想寻找一个能产生类似生命的元胞自动机。出人意料的是,生命游戏的行为丰富而有趣,以至于现在出现了一个爱好者团体,他们的主要兴趣就是发现能产生有趣行为的初始设置。
1701066821
1701066822 图10.3就是其中一个有趣的行为,被称为滑翔机。这里我们不再用灯泡,就用黑格子表示开(活),用白格子表示关(死)。图10.3中可以看到有一个滑翔机向东南方向移动。当然,元胞并没有动,它们都是固定的。移动的是由活状态元胞形成的一个不消散的形状。因为元胞自动机的边界是回绕相连的,所以滑翔机能一直移动。
1701066823
1701066824
1701066825
1701066826
1701066827 ▲图10.3 生命游戏中滑翔机的一个循环变化。滑翔机形状每4步向东南方向移动一格
1701066828
1701066829 爱好者们还发现了其他复杂的形状,例如太空船,它类似于滑翔机,而且更有趣;滑翔机发射器,它会不断射出新的滑翔机。康威证明,通过用变化的开/关状态模拟读写头在带子上的读写,就能让生命游戏模拟图灵机。
1701066830
1701066831 康威还给出了生命游戏模拟通用计算机的证明框架  [149]  (后来由其他人细化)。  [150]  将程序和输入数据编码为开关状态初始设置,生命游戏运行后产生的图样表示程序的输出。
1701066832
1701066833 康威在证明中组合使用滑翔机发射器、滑翔机等结构来实现与、或、非等逻辑运算。人们早已发现,能用各种可能来组合这些逻辑操作的机器就能进行通用计算。康威的证明表明,原则上,逻辑运算的所有可能组合都能在生命游戏中实现。
1701066834
1701066835 像生命游戏这么简单的元胞自动机在原则上能运行标准计算机运行的程序,这真是让人吃惊。不过,实际上,稍微复杂一点的计算就需要大量逻辑运算,并以各种方式相互作用,因此要设计出能实现复杂计算的初始设置基本不太可能。即使设计得出来,计算也会慢得让人无法忍受,更不要说用这种并行的非冯·诺依曼结构的元胞自动机来模拟传统冯·诺依曼结构计算机需要耗费的大量资源。
1701066836
1701066837 因此没有人用生命游戏(或其他“通用”元胞自动机)来进行真实计算或是模拟自然系统。我们只是想利用元胞自动机的并行特征以及它产生复杂图形的能力。下面先来看看元胞自动机能够产生的图形种类。
1701066838
1701066839 复杂 [:1701064781]
[ 上一页 ]  [ :1.70106679e+09 ]  [ 下一页 ]