标题：多主体建模
多主体建模的一般流程
在理解计算机建模的基本逻辑之后，就很容易勾划出在社会科学中应用计算机建模研究的一般流程（参见「1］）。第一步：问题的提出。研究所希望解答什么样的一个未知问题，比如我们对公元二900一1300年在墨西哥形成的Puebloan沉降模式的原因感到好奇（参见［2」）。这样就可以定义模型要仿真的实相（梅萨维德（MesaVerde）地区的沉降动力学）。通常需要对实相要进行一些观察，从而为模型提供一些初始参数。对于 Kohler的研究来说，这些观察工作由 Van West在 1994年的细致考古研究所完成（参见［3］）。下一步可以提出一些假设，并依据这个假设来设计出概念模型。然后就是模型的实现，也称为模型的架构，选择合适的计算机语言或开发工具，把概念模型转化为计算机程序。
到这一步为止，所有必需的研究步骤都是相当显明的，然而剩下的工作就不那么显而易见，但非常关键。还必须保证这个模型实现的正确性，确保它依照预先的设想运行，这一步被称为正确性校验，在软件开发中相当于调试。对于复杂的模型，这一步通常会很困难，特别是人们很难确定是否已经消除了所有的错误（程序臭虫，BUG）。此外，由于社会科学建模研究多用随机数的方式模拟那些随机的效应或没有测量的变量（参见 ［4］），用多次运行来产生不同的结果，这更增加程序调试的难度——没有一个确定的结果输出，很难通过运行
模型的架构与实现
这一步最常犯的错误是过多考虑不必要的细节。若过多关注细节，研究者就不得不为此收集大量的数据，这样会大大增加对数据可靠性控制和处理的难度，从而给模型的正确性校验和有效性验证带来巨大的困难。换句话说，这也意味着很难从研究中得出有效的结论。正如与真实世界最相吻合的是真实世界本身一样，但这种逼真对科学认识来说毫无意义。
一旦一个模型被设计出来，那么就可以着手去架构它。这一步可能需要自己动手编写一些程序，或利用一些方便开发建模软件开发工具库或“模型机床”（已开发的方便模型架构的软件），甚至仅仅是在别人做好的测试框架中填充些自己的数据。使用一些第三方提供的开发工具通常比自己动手从零开始设计要容易得多，因为许多在开发工具中已经被考虑的问题都需要自己重新考虑。比如，数据统计和图表显示的功能，自己开发是一件很费时间的工作，而在大多数工具包中都已经提供了这些接口以方便变量的输出显示。至少这其中的一些可能错误在很多人的共同使用中被发现和更正（尽管我们无论什么时候都不应假定这里不再存在任何错误）。使用工具包不好的方面在于，每一种工具包都有自己内在的框架假设，这限制了它的功能特性，从而也限制了程序设计的自由度和它适用的范围。这里有不同的软件，每一种有各自适合的应用条件，但没有哪一种可以包容或完全取代其他工具的，本书的第四章将对不同的软件工具及其特性进行比较详细的介绍。
效用检验
当正确性验证通过后，剩下来的工作就是效用检验。
效用检验即模型的有效性检验，这一步所关心的问题是，在研究者关注的输入输出行为关系表现上，这个模型是否与实相吻合。如果一个模型能够反映出实相的行为，那么就可被认为是可靠的、有效的。效用检验可通过比较计算机的输出和实际调查研究的统计结果来进行。
在形成一个可运行的仿真后，下一步就是检验模型是否真的按照我们的期望在运行（参见「11］）。对复杂的模型来说，刚开始能运行的模型，输出的更可能是一个错误的结果。因此需要准备很多测试案例，进行各种各样的边界测试。模型中随机数的应用增加了排错和正确性验证的难度。比如，在一个人工社会的仿真研究中，如果有一个参数控制社会的规模（比如人口数），那么可以从最小规模的社会人手开始检验；如果还有一个参数控制的是社会的复杂度（比如年龄差异、种族类别等），可以先从最小的复杂度开始调试。在一个多参数的仿真中，用逐级构建的方式调试是一个不错的选择。所谓逐级构建，就是分步骤地增加假设条件和模型的复杂度，在有多个变量都是随机数的情况下，可通过先固定别的参数，单独调试一种参数随机变化的情况，然后再从两个组合开始直到完整模型所需要的假设条件全部正确运行，在后面的具体实例介绍中我们将根据实例具体说明。
然而有以下几点需要特别注意。
（1）模型和真实现象在统计分布上都是有随机噪声的（如部分依靠随机参数），不可能期望完全相关。模拟与实验数据之间的偏差是否大得令人怀疑部分取决于输出测量值的期望统计分布。不幸的是，对于仿真来说，很难确定和估计这个偏差。
（2）许多仿真都是路径依赖的，输出依赖于初始条件的精确选择，每次仿真的历史对输出都有影响。换句话说，输出对这个模型的某些假设输入参数非常敏感。
（3）即便仿真的运行结果与实际数据很匹配，还存在另外一种可能，就是实际现象中的另外一些特征仿真并不能重现。比如，曾经有一个世界人口模型，尽管对世界人口未来50年的预测看上去是可信的，但在试图用这个模型重现过去20年人口变化时却失败了，尽管用的是同样的模型，设置的是同样的参数。
（4）必须考虑另外一种可能，即模型正确，而搜集的真实数据却可能不可靠，或者研究者的假设和估计有误。如一个为理解法国两万年前社会复杂度上升的计算模型，该模型采用的数据都来自干考古学的线索，这些经过很多次解释的数据本身是否有效是很值得怀疑的。
（5）版本控制的重要性。不同参数或假设的细微调整可能会带来运行结果上的极大不同，但并非只有最符合建模者期望的才是有价值的，一些表面上背离常识的运行结果也许蕴藏着更深层次的发现，且每一次参数的调整与假设的修正都应该给出理由，并给出调整或修正前后仿真运行变化的合理解释。这样每一次对模型进行细微的调整或者只改变一些参数的多次重复运行的中间状态或最终结果都被称为仿真的一个版本，在研究中应该完整地记录下来。一些专门的建模平台和软件已经很好地为研究者考虑了这点，可以很方便地保存不同的仿真版本（例如，在Starlogo中就有另外保存时自动增加版本序号的功能，参见附录B）。
当模型设计得过于抽象时会导致另外一种困难，即很难把模型中得出的结论与某个具体的实相数据进行比较和对照。如 Sob，lling在1971年做的一个解释人种居住自动隔离过程的模型（参见［121），由于模型非常抽象简单，很难直接用现实的数据去验证它的效用。这个问题在人工社会研究中同样存在，实相或者与模型相差甚远，或者压根就不存在，对于这样的模型来说，就很难说正确性验证和效用验证之间有什么区别。
一旦有了一个效用模型，至少在一些特殊的初始条件和参数输入下模型可以运行了。研究者们接下来很可能希望考虑的问题就是敏感性分析。
敏感性分析
敏感性分析就是分析模型的行为对假设的敏感程度。比如在一个税收和福利系统的模型中，政府的福利财政总支出对社会福利率的细微调整是否敏感？很可能存在这样一种情况：当福利率降低时，一些对贫穷人口的扶助支撑项目必须得启动，于是这个政策对政府的支出缩减的影响将会因此比预计中少许多。另外，敏感性分析的使用通常还与考察模型程序的健壮性（Robustness，鲁棒性）有关。如果模型的行为对某两个参数的微小变化十分敏感，我们必须怀疑模型是否只能适合某些特例情况，而仿真结果的吻合仅仅是一种偶然的巧合，或者这些参数的特别限制是否符合实际情形。
敏感性分析的基本原则就是细小调整初始参数、重复运行模型、观察输出的变化。这个参数调整的过程应该有系统地组织和安排，考虑不同参数可能变化的排列组合，有时虽然只有几个参数，但参数之间变化组合的数目也会非常大（例如，3个参数，每个参数有5种变化，那么需要重复的仿真安排就达5X5X5—125次），这意味着需要重复运行的次数非常大，这也导致对所有运行结果进行分析的工作量加大。在实践中，模型建立者一般有自己的直觉，从而能够选择部分最重要的参数组合去检验仿真。
接下来介绍进行敏感性分析的一种具体的方法，即用随机数作为参数输入模型，可以限定随机数作为一个输入向量空间，通过在输入向量空间内多次运行模型，得到相应的输出指标的分布，然后分析输入向量空间与输出指标分布之间的关系，从而判断一个小的输入参数的调整是否会带来较大的输出变化。从效果上来说，在一个输入参数的样本空间内重复运行模型相当于改变模型运行的条件，得到模型在不同条件下的行为全景图像。
获得随机样本空间只是随机数应用的一种方式，在建模中，还可在下列几种情形下应用随机数。
（1）引入建模中来自外部环境而没有考虑的过程因素（外部因素），比如，在家庭收入模型中工作市场的影响等。这里随机数代替了一些没有测量的参数（也可能根本就无法测量），等价于建模者对不能精确获得的信息的估计。
（2）作为主体某些特性的随机分配，比如，个人的偏好、情感、地理分布等。
（3）在一些元胞自动机或多主体建模中作为一种仿真的伎俩。比如，同样条件下主体动作规则执行的秩序的输出不同，这样随机安排动作秩序，可避免得到依赖于特定动作规则秩序的结果。
无论因为什么样的原因采用随机数，重复运行模型、观察不同条件下的输出都是必须的。仿真的结果可能用一个输出的分布函数，或用多次运行的结果平均值的方式来表示。一旦引入了随机因素，就必须应用在实验研究中所用到的统计方法进行分析处理（可参考社会科学统计课程的相关教材或统计软件手册）。通过对变化幅度的分析来评价定性的改变（比如是否已经形成一个群体），用回归分析评价定量的数值变量。
因为多数模型都运用了随机数因素，因此，孤立的一次仿真运行结果并不可靠，必须确定模型在任何一种预定的随机范围内都是稳定的。此外，严格意义上计算机提供的仅仅是伪随机数，而不是真实的随机数，但如果使用一个好的随机数生成器，这二者之间并没有明显的区别，由于大多数仿真都采用了大量的随机数并且依赖这些随机数的分布，因此检查采用的计算机系统是否有一个比较好的随机数生成器是很有必要的。总之，对于计算机建模研究来说，做敏感度分析是非常重要的，这有助于考察模型是否对一些假设的初始条件和参数敏感。
模型的迭代与重构
在为社会经济系统建立多主体模型时，除遵循前面介绍的一般流程外，还应当注意上述流程中的选代性。实际研究中，很难做到完成一次流程就达到了研究的目标，许多时候我们都需要在原始模型的基础上反复重构，不断修正，才能设计出一个好的模型。因此，在设计模型的各阶段中，我们可以遵循以下原则。
（1）尽可能简化真实世界的问题，只保留那些对解答问题必不可少的内容。
（2）设计主体时，重点放在主体行为与交互作用的规则上，其次考虑可能需要的各种随机因素。
（3）应用随机数时，应尝试着换用不同的随机数产生方式或随机数种子，多次运行模型，并从各个运行中收集数据进行统计。
（4）模型结果出来后，要尝试去理解主体的行为简单的规则是如何导致观测到的系统总体的行为现象，特别是模型运行结果反常时，这一点更为重要。
（5）调节系统的参数，确定影响系统行为的关键因素以及不同参数的变化对系统整体行为影响的程度与方式。
（6）如果可能的话，进一步简化模型，或必要时添加新的考虑因素。
（7）如果在研究过程中发现严重的假设错误，则需要对模型全部重构。
成果发布
任何研究的最后一步就是公开发布研究的结论，对于应用计算机建模方法的研究来说，撰写公开发布的材料有些特殊的困难和要求。因为，发布的目的是与大家分享发现，最理想的效果是读者能够从发布中抓住其中与社会科学研究相关的要点，而不被模型的技术细节所牵累；同时，有兴趣的读者或同行又能根据发布的文档，对模型进行重复验证，这样既可以更精确地理解模型工作的细节，也可以在此基础上进行拓展研究。这两个目标之间存在着非此即彼的矛盾。因为要让读者能够重复仿真，必须描述模型的细节，而传统的刊物一般都不能提供足够的篇幅空间。解决这个问题的办法是，另外在互联网上公布模型的程序代码和相关的使用指导和说明书，或者干脆通过电子期刊发布，因为电子期刊并不限制纸张和空间，不仅可以包括传统的论文格式，还可以包括代码、样本运行的其他材料，结果输出的大量统计图片，甚至动画和别的多媒体资料等。
国外有些电子期刊鼓励研究者发布论文时，把有关的计算机模型作为附件一起发布。中国人民大学经济科学实验室为了积极推动计算机仿真在社会科学中的应用，建立了一个开放式协作研究平台，方便研究者们集中发布模型的程序代码，以期望解决这个问题，同时能最大限度地鼓励这一类研究者们形成一个共同的研究规范，以及一个有利的协同研究的场所。