恰当地为可变结构受限生成过程选取一个转换函数集F,很容易就可以将它设计成一台通用计算机:先指定一组机制来模仿存储寄存器,除了每个机制有一个特定的标识以外,它们是完全相同的。每个机制的状态用来表示被存储的数值。为了确定这些存储数值中哪些可以被当作指令处理,通用计算机使用了一个特殊的寄存器NEXT。该寄存器指出了存储寄存器的地址,后者中存放着将被解码为下一条指令的数值。该数值被备份到另一个被称为INSTR的特殊寄存器中,这个寄存器将数值解码为正确的指令并执行该指令。还有一个带有特殊电路的寄存器ARITH,它用来执行由INSTR中逐个解码的那些数值所确定的算术运算。我们可以为每一个特定的寄存器建立特定的转换函数,并为相应的机制指定标识,分别用INSTR、NEXT和ARITH来识别它们。 为使读者对上述设计的工作原理有一定的理解,我们先来看一条存储指令的执行过程。在一台典型的通用计算机中,当存储寄存器中的数值被解释为一条指令时,解释的过程分为两部分。一部分是通过解码确定指令的类型,在这里是“存储”,另一部分通过解码确定作为指令自变量的存储寄存器的“地址”。一条典型的“存储”指令把ARITH中的数值复制到指令的地址部分确定的存储器中,并覆盖掉存储寄存器中原来的数值。 在可变结构受限生成过程中,机制INSTR的状态指明了当前的指令类型及其地址(见图9-4)。机制ARITH的某个输入条件仅接受INSTR的状态作为输入。设置ARITH的转换函数,使其利用INSTR状态中表示地址的部分,来设置ARITH下一个状态的标识。特别是,如果INSTR给出了一条“存储”指令,则INSTR状态中的“地址”部分就作为ARITH状态的标识。根据可变结构受限生成过程的规则,表示ARITH状态的这个描述串将被插入到当前状态表中。此外,它还将替换表中具有相同标识的描述串。在我们设计的可变结构受限生成过程中,与存储寄存器对应的每个机制都有一个唯一的标识,这样ARITH的状态(输出)能够替换唯一的一个存储寄存器的描述串(数值)。执行的结果就如指令要求的那样,将ARITH中的“数值”存放到由“存储”指令通过地址指定的存储寄存器机制中去。受限生成过程的模拟示例
用受限生成过程模型模拟通用计算机
图9-4 模仿计算机的受限生成过程模型
可以按照类似的过程模拟一台典型的通用计算机中的每一步操作,包括更新每个单位时间步长中NEXT和INSTR的内容,以便从存储寄存器中得到程序的下一条指令。这并不难,但比较费时。我们甚至还可以更进一步,设计一个使用多个ARITH机制来同时执行多条指令的可变结构受限生成过程模型。这将使可变结构受限生成过程具有更多的“并行性”,但它仍然具备通用的性能。
用受限生成过程模型模拟元胞自动机
元胞自动机之间的相互连接如数组一般,非常规范,所以用标识寻址能很方便地表示出来。
我们从一个单独的转换函数开始,如康威自动机中的规则。一组连接中的每个机制均使用这个转换函数,但每个机制都具有与众不同的标识以指示它在组里的位置。不妨假设相互连接的数组是二维的,那么我们可以使用(x, y)坐标系,从原点沿水平的x轴和垂直的y轴给出组中某点的距离,从而确定组中任意点的位置。为了规定可变结构受限生成过程模型中的这些相互连接,我们简单地对每个机制的(x, y)坐标编码,使之作为标识串的一部分。比如,当考虑一个16×16的连接数组时,可以用4个二进制位对每个坐标编码,则共需要8个二进制位(见图9-5)。
图9-5 模拟元胞自动机的受限生成过程模型
一旦完成了标识的分配,就要设置输入条件,使每一个输入接受相邻机制的标识。例如,标识为(x, y)的机制,具有一个输入来接受位置为(x+l, y)的相邻机制的标识,另一个输入接受(x+1,y-1),以此类推至周边8个相邻的机制。在这种安排下,一个机制读取周围8个相邻机制的状态,并利用转换函数计算出自己的新状态。由于该转换函数履行了元胞自动机的规则,并且所有机制同时做出动作,因此可变结构受限生成过程模型真实地模拟了元胞自动机的行为。
我们当然可以出于其他目的,在标识中加入其他二进制位。比如,为了允许若干机制处于同一坐标点,我们可以添加除(x, y)以外的其他二进制位以区分它们。
台球和热气体模型
我们通过标识指定了机制的坐标,也可以改变标识来“移动”机制(见图9-6)。
图9-6 改变标识以实现移动
例如,若机制处于坐标(x, y)位置,我们可以将其标识的坐标改为(x+1, y),以使它在x轴的方向上向右移动一步。这一技巧可以很方便地用来为自由移动的粒子或主体构建可变结构受限生成过程模型。考虑一个模型,如《隐秩序》一书中提出的“回声”模型,在模型中被模拟的有机体或主体从一个地点迁移至另一个地点,当它们处于同一地点时发生相互作用。这样,机制的输入条件将被设置为仅接受具有相同(x, y)坐标值的若干机制的输出。这时如果将机制的标识和输入条件指定为相邻的(x+1, y)坐标值,就可以实现主体的迁移。
教科书中的热气体模型是另一个使用可变结构受限生成过程框架的实例。为简便起见,如果将气体限定在二维空间,就可以将气体分子视为是在几乎无摩擦的台球桌上运动的一组台球。最简单的方法是将台球桌作为一个单独的场地,台球之间的相互碰撞随机发生。在实际操作时,我们是对台球桌上的台球进行随机配对,并将每次配对视为一次碰撞。
要想在可变结构受限生成过程中模仿这种情形,我们可以为每个台球分配一个机制,随后为每个机制指定一个唯一的标识,所有标识有一个共同的前缀,该前缀以地点(台球桌)命名。例如,机制j的位置为(x, y),则其标识为(x, y)(j)。我们再设计一个机制,将它称作COLLIDE(碰撞),它具有实现碰撞规则的转换函数。进一步指定COLLIDE的输入条件,使它接受任何一个以前缀(x, y)开头的标识。按照“相同地点前缀相同”的“同标识约定”,COLLIDE可为它的每个输入选择标识前缀为(x, y)的机制(台球)。这样一来,在位置(x, y)处的机制将像热气体模型需要的那样被随机配对(见图9-7),同时它们之间的相互作用将由机制COLLIDE加以限定。
图9-7 模仿台球的受限生成过程模型
让我们深入研究这个模型,进一步阐述简单的可变结构受限生成过程是如何产生复杂行为的。分子i与分子j的碰撞,使得COLLIDE的两个标识分别为(x, y)(i)和(x, y)(j)的输入。我们的目的在于使用机制COLLIDE产生分子(x, y)(i)和(x, y)(j)改变后的状态,新的状态反映了它们碰撞的结果。如果仅有一个分子(x, y)(i)被选中,可以只将标识(x, y)(i)指定为“碰撞”的输出。由于标识的唯一性,“碰撞”的输出将当前状态表中原来的条目替换为(x, y)(i)改变后的状态。但是,现在有两个分子,为正确实现这一点,必须为每次碰撞指定一对彼此相互影响的COLLIDE机制。这样一来,标识为(x, y)(i)和(x, y)(j)的一对机制输出提供了COLLIDE所产生的状态更新。 当我们为每个台球的状态指定一个数值时,不妨视之为能量,这样一来,这个例子会变得更加有趣。分别将分子i和分子j的数值指定为u和v,我们为这对COLLIDE机制中的一个建立转换函数。 1.对这两个输入状态中的数值u和v求和,以得到数值u+v,即碰撞的总能量。 2.选择介于0和u+v之间的数值u',即0≤u'≤u+v。 3.将数值u'作为标识(x, y)(i)输出状态的一部分。 根据当前状态表的替换规定,新的状态将替换表中标识为(x, y)(i)的旧条目。COLLIDE便有效地将总能量u+v的某一个部分u'指定为分子i碰撞后所具有的新能量。 接着我们可以规定,这对COLLIDE机制中的另一个将数值v'=u+v-u'赋值给分子j(这里不对一些技术细节进行描述)。也就是说,分子j获得了总能量的剩余部分。因为u'+v'=u'+(u+v-u')=u+v,分子i与分子j在碰撞前后的总能量不变,于是我们实现了弹性碰撞时所要求的能量守恒。 一个有趣的问题是,随着时间的推移,这种随机的能量交换是如何影响分子(台球)之间的能量分配的?比如,让所有分子都具有相同的初始能量u(初值),很明显这种随机的能量交换将改变初始时这些分子能量的一致性。但究竟是怎样的一种改变呢? 我们很快便可以证明,当发生几十次碰撞后,能量将按照从麦克斯韦时代以来我们便熟悉的一种方式进行分配,即麦克斯韦-玻耳兹曼分布(见图9-8)。能量将大约按u(初值)分配,这导致高能量分子的数目呈指数式减少。例如,如果有100个能量为2u(初值)的分子,则能量为4u(初值)的分子将大约为1002u(初值)/4u(初值)=1001/2=10,即100的平方根。 图9-8 麦克斯韦-玻耳兹曼分布的产生 如此精细的分布竟从如此简单的相互作用规则中涌现出来,这有些让人惊奇。更有趣的是,有关能量的麦克斯韦-玻耳兹曼分布可能有催化的作用。考虑一个总能量为4u的相互作用。如果我们分两步完成,每步需要能量2u,这时参与作用的分子数大约是只用一步、需要4u能量完成时分子数的平方。换言之,尽管总能量不变,当相互作用分两步完成时,反应率将呈平方式提高。我们可以将催化剂视为分两步完成相互作用的媒介。 生物化学催化剂——酶,是生命有机体进行化学反应的必要条件。因此,在像“回声”(Holland,
1995)这类展现发展和进化的模型中,这个简单的起点揭示了模型中复杂的能量关系存在的可能性。