我们把我们这个人工系统的每一次运行视为一个实验。每个实验都从最原始的组件,通常为一个最基本的逻辑门开始行动,让计算机随机地以非循环的方式将几个组件连接在一起,以便生成新的电路。在运行过程中,所用的组件既可以是原始的逻辑门,也可以是用原始的逻辑门构建出来,并已经封装好的其他电路,即将它们视为具有指定的输入和输出引脚的芯片。在表7-1中,我们指定了一组“需求”或者说目标,它们是通过组合可以实现的有用的逻辑函数。这些“需求”类似于现实世界中驱动技术进化的真实需求。在理想的情况下,我们希望这些需求是由那些“居住”在这个人工世界中的行为主体产生的。在这个人工世界里,加法器和比较器等被证明是有用的。但是在这里,我们先不考虑这种复杂情况,而是直接列出了一组有用的逻辑函数。当适当的电路出现后,这些逻辑函数就可以实现了。
表7-1 需求表
注:这是对通用的逻辑函数的一些需求(2≤n≤15,1≤k≤8,2≤m≤7)。
在我们这个人工系统中,既存在对逻辑函数的需求,同时也提供了用来实现它们的手段。采用这样一个人工系统的优点在于,可以容易地对需求和技术进行比对。对特定逻辑函数的每个需求,都可以用特定的真值表来表示:对于每个可能的输入值集合,给出与之相对应的预期输出值的集合。而且,每个创造出来的电路,即每种技术都提供了一个功能,它也可以用真值表来表示:对于提供给输入引脚的每一组二进制值,在输出引脚上产生特定的二进制值。这样一来,我们很容易就可以将实验中的技术与我们的需求表匹配起来。我们完全可以把一种技术的行为、它的真值表视为这种技术的“表型”,而其基因型则是实现这种功能的架构或内部电路。多种不同的基因型可以产生相同的表型。
因此,我们的计算机模型包括了:一组原始的电路、一组利用原始电路和其他组件构建而成的技术或组件,以及一组有待满足的需求。通常来说,我们只使用一个原始电路,即一个与非门,其表型为¬(x^y)。从根本上看,我们的实验是非常简单的。在每个进化步骤中,都会有新的电路从现有电路中创建出来,方法是根据一个用来指定选择概率的选择函数,从所有先前存在的技术中选出2至12个电路来,随机组合布线。同时,通过以不同顺序选择不同内部布线作为输出引脚,创建出新电路的不同表型。在每一步,都存在一组最能满足所有需求或目标的现有技术。在它们的真值表中,不正确元素的数量最少。因此,以这组现有技术为基准,对于每个候选电路,都可以有针对性地进行测试,以便搞清楚它是否对它们有所改进。改进大体上可以分为两类:第一类是这个候选电路与需求的真值表的匹配更好,第二类是它实现了同样的功能,但是比现有的电路成本更低。电路的成本取决于它的部件的数量和各个部件的成本。在上述两种有所改进的情况下,这个电路不仅会把它直接改进的那个电路替代掉,而且也会替换掉所有以那个电路为组件的电路。然后,这个电路将被封装起来,成为一个新的组件,在进一步的组合中,它可以作为一个构件。依此类推,一系列封装好的技术就被构建出来了。如果找到一个完全满足某种需求的真值表的新技术,那么我们就说这种需要得到了“满足”。当然,新创建的电路不能替代自己的某个组件。有用的组件会被赋予一个名字,如“tech-256”或“全加器-121”,并且可以在更高层次的技术中使用。能够完全、准确地满足某种需求的组件,则赋予一个便于记忆的、可以描述该种需求的名称,如三位加法器。用来实现这些一般算法的详细步骤,以及更多的细节,将在下一节中给出。
不过,关于这个人工系统与现实世界之间的对应关系,我们还要多说两句。现实世界中的新技术确实是现有技术的组合,但是现在几乎没有任何新技术是通过随机地将原有组件组合起来而发明出来的。但是,我们不难把我们这个进化过程的每一步,都想象为一系列用来深入探究一个新想法的、严格的实验室测试。或者更确切地说,我们可以认为,我们的过程对应于现代组合化学或合成生物学中所运用的那种过程:先以随机组合的方式产生新的功能,然后再对它们的有用性进行检验。在这个过程中,会出现一个不断增大的有用元素库,这些元素可以用于进一步组合。
更一般地说,我们还可以将这个过程视为一种算法。这种算法不是用来解决特定问题的,而是用来构建一个可以用于进一步组合的、由有用功能构成的“库”。这个算法很好地模拟了现实世界的技术进化过程,即首先构建能够满足简单需求的技术,再以这些技术为构件,一步步地将更加复杂的技术构建出来。