打字猴:1.701066774e+09
1701066774 复杂 [:1701064779]
1701066775 元胞自动机
1701066776
1701066777 在第4章曾讲过,图灵机将“明确程序”——也就是计算——的概念进行了形式化。计算就是图灵机根据机器的规则集将带子上的初始输入转换成停机时带子上的输出。这个抽象的机器就是后来所有数字计算机的设计原型。由于冯·诺依曼对计算机设计作出的贡献,现在的计算机架构被称为“冯·诺依曼体系结构”。
1701066778
1701066779 冯·诺依曼体系结构包括存储数据和程序指令的随机存取存储器(RAM)、从存储器存取指令和数据并执行指令处理数据的中央处理单元(CPU)。你可能知道,虽然程序员们编程时使用的是高级语言,存储在计算机中的指令和数据却是0/1组成的串。执行指令就是将这种0/1码译成基本的逻辑操作让CPU执行。只需要几种基本的逻辑操作就能实现所有计算,现代CPU每秒能执行数亿次这样的逻辑操作。
1701066780
1701066781 元胞自动机是理想化的复杂系统,结构完全不同于计算机。想象一块板子上排列着许多灯泡(图10.1),每个灯泡与四周以及斜对角的灯泡连在一起。在图中只画了其中一个灯泡的连接线,不过姑且想象所有灯泡都有连接线。
1701066782
1701066783
1701066784
1701066785
1701066786 ▲图10.1 排列的灯泡,每个都与四周以及对角的灯泡相连,图中画了一个灯泡的连线作为示范。灯泡的状态可以是亮和灭。假设边沿是回绕连在一起,也就是认为最左边的与最右边的灯泡相邻,最下面的与最上面的灯泡相邻,等等
1701066787
1701066788 图10.2中(左边的盒子),有些灯泡已经点亮(为了简洁,我没有画灯泡的连线)。先设定好灯泡的开关状态,然后各个灯泡开始不断定时“更新状态”——选择开或关,所有灯泡都同步变化。你可以将这个灯泡阵看作萤火虫发光的模型,每只萤火虫都根据周围萤火虫的闪灭来调整自己是亮还是灭;也可以看作神经元的激发模型,各个神经元受周围神经元的状态激发或抑制;或者就当作抽象艺术也行,如果你愿意的话。
1701066789
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
[ 上一页 ]  [ :1.701066774e+09 ]  [ 下一页 ]