可编程计算机的优点在于它能反复执行同一段程序。当我们编写程序时,会编写大量的子程序,反复执行一系列指令直到满足某一条件。这些子程序可以将屏幕上的一组亮点组成字母A,也可以计算出一个模拟神经元的疲劳程度。我们可以将这些子程序连接在一起组成一个最终产品,它可能是一个面向屏幕的字处理器或者是对神经网络的模拟。
原则上,我们也可以使用纸和笔来执行这类程序中的指令,毕竟,程序只不过是按指令行事。但是这个过程非常耗时,要花费的时间超出了人们所能忍受的限度。几个世纪前的某些人花了几年,甚至几十年的时间来计算π的小数部分,π的复杂性在于它无法简单地由整数的比率来表示。虽然这个工作确实揭示了π的很多有趣属性,但从通常意义上看,这并不是创造性的工作,这个过程只是在反复执行一些简单的例行步骤而已。
现在,使用笔记本电脑执行相同的程序,只需花几分钟就会得到相同的结果。袖珍计算器常常通过子程序来即刻计算出π这种数字的8位或10位,而不是用存储寄存器来精确保留数据。实际上,计算器也可以通过程序对那些记录在扩展表,例如R. S.伯灵顿(R. S. Burington)于1946年制作的表中的数据进行实时计算,工程师们曾经需要随身携带这些数据和计算尺,现在它们和计算尺一起,都已经被便携式计算器取代了。
计算机的高速度给计算带来了质的变化。我们可以对一些要求多次重复的过程进行研究,如计算π,它往往也还只是一些大工程中的一小部分。通常我们能够建立的模型是由很多子程序连接而成的。这些程序具有模块化的特征,很适合建立基于主体的模型。首先,我们将定义主体个体的规则转化为子程序,即指令序列,有些类似于塞缪尔的国际跳棋程序为定义特征编写的子程序。其次,我们用一些附加的指令(Holland, 1995)将这些子程序连接起来,以提供各个主体之间的相互联系。如果计算机有很多处理器,如并行计算机,人们甚至可以把处理器分配给主体,当主体相互作用时,信息就在处理器之间传递。无论计算机的硬件是怎样构成的,其巨大的计算能力都可以支持对具有大量主体的模型进行探索。
对于这一类探索工作,计算机模型为理论和实验提供了一种有益的过渡形式。在通常意义上,计算机模型不能算实验,因为这些模型并没有直接操纵被模拟的真实世界。尽管如此,当执行这些模型时,在运行中(例如,在带回路的神经网络中出现的同步和反射)仍会揭示一些典型的模式和对称性。这些涌现的特征能为真实的状态提出实验的设计方案。尽管这些计算机模型并不是物理实验,但它们也是非常精确的。这些模型的定义和它所产生的结果之间的联系是很明确的。两次运行同样的模型,如果模型的设置完全相同,那么将会得到相同的结果。
计算机模型的精确性,使得它有些类似于基于方程或公理的数学模型。但是当它运行时,只对特定的设置产生特定的结果;相反,数学模型产生的结果对某些给定的范围都适用。如果我们使用不同的初始设置,多次执行计算机模型,就能够辨别出在结果中重复出现的模式和规律。例如,我们能看出塞缪尔的国际跳棋程序总是给某一类特征赋予很高的权重,或者我们会发现,带回路的神经网络会不断产生小的反射集合。这些规律可以为我们构造数学模型提供线索,在这种数学模型中,我们也可以通过其结构推导出这些规律。也就是说,这些规律组成的定理可以由定义模型的那些公理(规则)推导出来。
计算机模型的结构中包含很多严格规定的模块(子程序),这一点对我们非常有利。我们可以通过分析程序模块来搜索所观察的规律的来源,可以通过改变被选择的子程序的结构和参数设置来证实对因果关系的一些猜测和假定。如果不同的变量在被观察的规律中产生同样的结果,那么就可以将这些变量合并,使之成为一个更加通用的数学模型。通常被选择的子程序可以转换成一些函数,这些函数也能表示所观测到的变量之间的联系。依靠洞察力和运气,我们往往可以根据这些函数提供的启示构建数学理论。
计算机模型大大拓宽了我们运用直觉的机会,它们充当的角色类似早期的思想实验和封底计算(back-of-the-envelop)(11),但是计算机的高速运算极大地拓展了这个作用。计算机模型能够模拟主体的细节、主体间的相互联系和大量的主体,这些都无法通过纸和笔的运算得到。但是这样做也有风险,风险在于它包含了大量的细节,仅仅是因为计算机有能力进行相应的计算,而涉及太多的细节可能导致建造模型最终失败。第10章将再次讨论这个风险。当然,谨慎处理将会减少风险,而且这些风险不会影响我们所获得的机会。
另外,计算机模型还有一个有利之处。计算机程序的刻板性要求严密的设计。再多聪明的言语和一厢情愿的想法都不会让计算机模型偏离其要表述的规则的后续结论。尽管计算机模型并不能提供数学模型的普遍结论,但它确实能强化类似的规范。