标题：swarm
简介
Swarm 是使用 Objective C语言开发的，在早期的版本中编写Swarm的应用程序也使Objective C，从Swarm 2.0版开始提供了对Java语言的支持,将来可能支持JavaScript、C++、Python、Perl等语言。Swarm的最新版本 Swarm 2.1.1可以在不同版本的Unix、Linux、Windows95、Windows98、WindowsNT、Windows2000环境下运行。
社会经济系统的仿真，是建立在复杂适应系统（Complex Adaptive System 简称CAS）理论研究基础上的。通过“相对简单的微观个体活动可以突现出宏观层面的复杂行为”，给社会科学的研究与实践乘上当代新技术的航班打开了通路。
作用
从1994年开始，桑塔费研究所（SFI）开展了一个研究项目，以开发一个工具集用来帮助科学家们分析复杂适应系统，这个模拟工具集就叫做Swarm。1995年，SFI发布了Swarm的beta版。
用户可以使用Swarm提供的类库构建模拟系统，使系统中的主体和元素通过离散事件进行交互。由于Swarm没有对模型和模型要素之间的交互作任何约束，Swarm应当可以模拟任何物理系统或社会系统。事实上，在各个广泛的研究领域都有人在用Swarm编写程序，这些领域包括生物学、经济学、物理学、化学和生态学等。
Swarm项目的目的就是通过科学家和软件工程师的合作制造一个高效率的、可信的、可重用的软件实验仪器。它能给予科学家们一个标准的软件工具集，就象提供了一个设备精良的软件实验室，帮助人们集中精力于研究工作而非制造工具。
Swarm实际上是一组用Objective-C语言写成的类库，这是一种面向对象的C语言。一部分图形界面，如图表、按钮和窗口是用TCL/TK描述的。Swarm最初只能在Unix操作系统和X Windows界面下运行，1998年四月，伴随着 1.1版的发布，Swarm推出了可以在Windows 95/98/NT上运行的版本。1999年，Swarm又提供了对Java的支持，从而使Swarm越来越有利于非计算机专业的人士使用。
对象
大多数Swarm的模拟程序包括四类对象。ModelSwarm、ObserverSwarm、模拟主体和环境。其中的ModelSwarm和ObserverSwarm是swarm类的子类。swarm类是Swarm模拟的基本构造块，一个swarm是一系列对象以及这些对象的行为时间表的组合。模拟主体通常从SwarmObject中继承方法以提供对探测器和内存管理的支持。不同的模拟系统具有不同的环境，例如生态系统通常是一个二维的平面环境，如Swarm中提供的Grid2D。
ModelSwarm
通常情况下，Swarm应用包括两个swarm对象，位于核心的是ModelSwarm，一个封装了被模拟的模型的swarm对象。ModelSwarm中的每一个对象对应模型世界中的每一个主体。当用户定义了全部对象并为它们建立起关系后，建模的最后一步就是把这些主体放到这个ModelSwarm对象中。
除了作为对象的集合，ModelSwarm还包括模型中行为的时间表。用户需要为这些主体编写一个时间表，通过产生一系列具有特定顺序的行为来体现模型中的时间。时间表可以通过产生activity 库中的schecule类的实例对象来建立，在其中填入排好序的对象/消息对。建好时间表，Swarm模型就可以运行了。
ModelSwarm还包括一系列输入和输出。输入的是模型参数：如对象的个数，初始值等。输出的是要观测的变量的值及模型的运行结果。
ObserverSwarm
对于计算机模拟来说，只有一个可以运行的模型是没有什么用处的，我们还需要数据收集工具来观察模型并记录发生了什么。在Swarm中，观察是通过ObserverSwarm对象来实现的。ObserverSwarm是一个特殊的对象，可以通过探测器接口观察其它个体。例如，一个探测器可以观察商品的平均价格，并建立一个时序图来跟踪其动态变化。另一个探测器可以跟踪居民的平均收入，并将数据储存到一个文件中以备日后分析使用。
ObserverSwarm也是一个swarm ，因此它也包括一组个体和一个行为时间表。ObserverSwarm的个体是用来观测的探测器及输出界面，如图表，二维格点等。其行为时间表则描述各探测器采样的间隔和顺序。通过将一个模型的ModelSwarm 和ObserverSwarm合并在一起，一个完整的实验模型就建立起来了。通过使用ModelSwarm和ObserverSwarm ，可将模型的界面和模型的实现分离，模型自身仍然是纯的，就像一个玻璃罩下的世界。不同的ObserverSwarm可用来实现不同的数据收集和实现控制协议，但是模型本身没有发生变化。
模拟主体
模型中模拟的主体与现实中的经济参与这是一一对应的。例如，在经济模型中需要定义消费者、公司甚至政府、银行等。模拟主体通常作为一组对象在模拟系统中存在，我们要根据现实的情况给它们定义方法和属性。在一个复杂适应系统中，模拟主体应当具有学习和进化的能力。这就需要在主体中定义一个独立的具有认知能力的部件（可以是一个子对象也可以是一个方法）来处理来自环境的刺激并做出反应。学习或进化的过程可以采用神经网络或遗传算法等方法来模拟。
环境
在模型中，模拟主体通常生活在一个环境中。许多模拟平台将这一环境限定为某一个特定类型，如最常用的是二维网格。Swarm的一个特点在于不必设计一个特定类型的环境。在Swarm中，环境本身自身也是一个主体，用面向对象的术语来说就是一个对象。例如，在经济系统中，市场就是一个环境。消费者和商家通过市场来询价和报价，他们的交易也在市场中得到撮合。市场这个主体在模型中可能有一些不同于其他主体的特殊的方法和属性，如市场的参与者或市场的状态等。但是在Swarm这个模拟系统中它的处理与其他主体没什么区别。
在这里，我们简要地介绍了应用Swarm模拟的逻辑结构，希望读者可以对Swarm从整体上有一个了解。欲了解使用Swarm各部分的详细情况，请参阅Swarm库文档和例子程序。这些工具的完整文档可以在Swarm的官方主页上找到。
类库
对于大多数用户来说，Swarm中提供的大部分类可以直接使用。为了建立起一个模拟环境，用户需要构造一些对象，用来表示现实生活中的主体。在大多数情况下，这些对象都可以基于Swarm中存在的类，这样就免去了用户大量事务性的工作。以下是对Swarm中提供的几个主要的类库的简介。
Swarmobject 库包括两个重要的类，swarmobject 和swarm。Swarmobject 是所有模拟主体的根类，它定义了内存管理的接口并提供对探测器的支持。Swarm类是模型的总控，ModelSwarm和ObserverSwarm都从这一基类处继承有用的代码。
Activity库提供了对时间表的支持。时间表是模型运行的时序列表，用户可以将周期性执行的动作按顺序放入这个数据结构中，并指明运行间隔和触发条件，模型就可以按照这个约定运行而不需人为的干预。
simtools库中包括支持探测器的类，这样就可以在模型的运行过程中观察或修改变量。Simtools还提供数据分析和显示支持的工具，能够产生统计数据汇总，画时序图等等。
Collections中提供了一系列对象的列表，如List、Array、Set等。Swarm支持向一个列表中的所有对象传递消息，还可以将列表中的对象按某个属性排序。
Defobj中提供了对消息、错误处理、调试和内存分配的支持，增强了 Objective-C的功能。它还支持对象界面和实现分离，从而使Swarm编写的程序的层次性更加清晰。
Random库提供给用户一套随机数生成器。在计算机模拟中，随机数生成器的质量是绝对重要的。如果生成的随机数有偏差或具有相关性，很容易产生错误结果。Swarm的随机数库支持正态分布、均匀分布、指数分布等多种随机分布。
Space是一个简单的空间库，包括一系列用于二维离散模型的类。这些空间类型在生态系统模拟中经常用到。Space 中的类大多数是从Grid2D，一个可以在指定格点上存储对象和整型值的二维数组继承得来。