NetLogo是一种用于模拟自然和社会现象的多智能体编程语言和建模环境。它适用于对随时间演变的复杂系统进行建模。建模者可以向数百甚至数千个同时独立运行的“Agents”发出指令。这使得探索个人的微观行为、研究个体微观互动中涌现出的宏观模式成为可能。

NetLogo是一种简单的仿真模拟工具,通过“Agents”进行交互,探索他们在各种条件下的不同行为模式。NetLogo也是一个创作环境,业面设计以及环境设置非常简单,可以让不是专业程序员的学生和研究人员也能够创建自己的模型。

为了教育和科学研究,NetLogo 被设计和构建出来。关于多智能体建模在K-12环境中的使用,已经有相当多的研究(Wilensky,1995)(Resnick,1996)(Wilensky & Resnick,1999)(Wilensky,2003)(Ionnidou et.al,2003) (Wilensky & Reisman,in press)。在本文中,我们将重点放在NetLogo上。

历史上看,NetLogo 是包括 StarLogo 在内的多智能体建模语言系列的下一代建模工具(Resnick & Wilensky,1993)(Resnick,1994]。NetLogo 是一个用 Java 编写的独立应用程序,因此它可以在所有主要计算平台上运行。经过五年的发展,NetLogo已经是一款稳定、快速的成熟产品。并且NetLogo是一款免费软件——任何人都可以免费下载,且能够不受限制地构建模型。同时,NetLogo附带大量文档说明以及相关教程,并附带了大量示例模型以供研究者学习。

作为一种语言,NetLogo 是支持智能体和并发系统的 Lisp 家族的一员。称为“Turtle”的移动智能体在“Patches”网格上移动,这些Patches也是可以进行编程的智能体。所有的智能体可以相互交互并同时执行多项任务。

在以下部分中,我们将提供有关这些主题的更多详细信息。我们首先对应用程序进行了阐述,然后又概述了相关的历史,以及最近的发展和研究应用。然后,我们更详细地介绍了语言本身,并解释了我们是如何实现或应用它的。最后,我们总结了正在进行的工作以及未来的计划。

一般而言,开始使用NetLogo的用户通常从探索NetLogo的模型库开始。这个模型库中有超过140个提前构建好的模型可以探索和扩展。这些模型涉及自然科学和社会科学的诸多内容和领域,包括生物学和医学、物理学和化学、数学和计算机科学以及经济学和社会心理学。

NetLogo已经被用来构建各种各样的模型。我们用户社区的成员已经把Turtles变成了粒子、狼、买家、卖家、蜜蜂、部落居民、鸟类、蠕虫、选民、乘客、金属、细菌、汽车、机器人、中子、磁铁、行星、牧羊人、恋人、蚂蚁、肌肉、网络者等不同类型的智能体。Patches被设计成了树木、墙壁、地形、水道、房屋、植物细胞、癌细胞、农田、天空、桌子、毛皮、沙子。Turtles和Patches也可以用来可视化和研究抽象的数学,或者用来艺术制作,玩游戏等。讨论的主题包括元胞自动机、遗传算法、正向和负向反馈、进化和遗传漂移、人口动态、寻路和优化、网络、市场、混沌、自组织、人工社会和人工生命。这些模型都展现了我们关于复杂系统和涌现的核心主题的研究。

图1所展示的是打开模型库并运行里面的模型后的NetLogo用户界面。模型控件在左边。右边是图形窗口,我们所看到的就是模型的“World”。在所示的模型中,Turtles代表扩散粒子,它们在空间中随意游走。当模型开始时,中间有一个绿色的Patches。当一个粒子遇到绿色Patches时,它会“被粘住”并停留在该patches上,颜色也会变成绿色。随着时间的推移,一个美丽的分支集合就会出现。

在这个屏幕截图中,我们只看到了NetLogo的“界面”选项卡。事实上,NetLogo也包含了关于该模型的相关文档说明以及完整的模型代码。接口选项卡也是一个界面构建器。使用模型和编辑模型之间没有严格的区别,构建者或者使用者可以随时移动、修改或创建界面元素。无需重新启动模拟,就可以检查和更改智能体,并更改模型的代码。

图1: 聚合模型的NetLogo界面

图2显示了程序选项卡和模型的大部分代码。其中,NetLogo的语言元素会自动进行颜色编码,以增强代码结构的可见性。

图2:聚合模型的主要代码

NetLogo可以与其他应用程序交换数据。NetLogo的语言包含了可以让用户读取或写入任何类型的文本文件的命令,还包含了用于以标准格式导出和导入数据的工具。完整的世界状态可以保存和恢复为一种可以用其他软件轻松打开和分析的格式。可以导出图形数据以使用其他工具进行渲染和分析。图形窗口或模型整个界面的内容可以保存为图像。可以使用标准实用程序将图像转换为电影。完成的模型可以作为 Java 小程序发布在网络上。

NetLogo包括一个名为“BehaviorSpace”的工具,“BehaviorSpace”现在仍在不断的发展,它允许“参数扫描”,即在一系列参数设置中系统地测试模型的行为。

NetLogo 2.0 中最明显的变化是图形。现在,海龟可以是任意大小和任意形状,可以放在任何地方。Turtles和Patches也可以用文字标注。Turtles的形状是基于矢量的,以确保其外观在任何尺度下都是平滑。这些变化导致了模型的显著视觉增强。比如,我们可以使用海龟(Turtles)来表示网络中的节点和边,如图 3 所示。

图3:节点和边,都用Turtles表示。

NetLogo起源于 StarLisp (Lasser & Omohundro,1986) 和 Logo(Papert,1980)(它本身是 Lisp 家族的成员)的混合体。从Logo继承了“Turtles”。在传统Logo中,程序员控制单个Turtle;然而一个 NetLogo 模型可以控制数千个Turtles。NetLogo 也遵循 Logo 的易用理念,为新用户提供了一个“低门槛”的进入。从 StarLisp,一个 1980 年代的并行 Lisp,到NetLogo,它继承了多个智能体和并发性。

NetLogo目前的设计是基于我们早期环境StarLogoT的经验(Wilensky,1997)。我们重新设计了语言和用户界面。NetLogo包括几乎所有StarLogoT的功能以及许多新功能。NetLogo的许多新功能都是针对研究用户的。

自1999年以来,NetLogo一直在开发中。2.0.1版(2003年5月)成熟、稳定、可靠。我们的用户群扩大了,传入错误报告的速度也已经下降。模型现在运行速度比早期版本已经快了很多 – NetLogo的用户认为它对于大多数用途来说足够快。

我们有很多证据表明,研究和教育界对 NetLogo软件的接受程度越来越高。该软件已被下载数万次。目前,每天大约有50次下载。我们有超过 5,000 名用户在使用NetLogo。NetLogo 讨论组(http://groups.yahoo.com/group/netlogo-users/) 拥有超过 1,500 名成员,平均每月发布 100 多个帖子。讨论组的流量从 2002 年到 2003 年增加了五倍。一些组织已经为研究人员和教师举办了相关的NetLogo研讨会。从今年开始,我们将在西北大学举办自己的年度研讨会。许多大学课程现在全部或部分使用 NetLogo 进行教学。其中一些课程和讲习班收集了丰富的在线相关资料。NetLogo 网站有一个社区网站,用户可以在社区上传自己构建的模型与用户社区共享。截止到目前为止,NetLogo社区网站已经上传了80 多个模型。

作为一种编程语言,NetLogo在Logo语言的基础上增加了智能体和并发机制。虽然Logo并不局限于图形应用程序,但它最出名的还是它的“Turtles图形”,在这种图形中,一个虚拟生物或“Turtle”会在屏幕上移动,移动轨迹在图形后面留下痕迹。NetLogo兼并了这个概念,支持成百上千只Turtles四处活动和互动。Turtles活动的世界是一个由“Patches”组成的网格,这些Patches也可以用于编程。总的来说,Turtles和Patches都能够被编辑为“智能体”。所有智能体都可以相互作用并同时执行多个任务。NetLogo还包括第三种智能体类型“观察者”。只有一个观察者。在大多数模型中,观察者通过向Turtles和Patches发出指令使其开始行动。同时,我们可以可以“breed”(定义)不同的Turtles,“breeds”不同的Turtles都具有不同的变量和行为规则。

一些模型只是将Patches作为网络格子而非智能体。例如,在元胞自动机中,没有Turtles,只有Patches。在其他一些模型中。Turtles在格子上移动(从某个Patch中心移动到另一个Patch中心)。但这些Patches不仅仅是格点——它们是连续二维空间的方形部分。Turtles坐标是浮点值,因此Turtles可以放置在Patches中的任何位置。例如,在上面显示的聚合模型中,聚集体由格点组成,但粒子在平面上自由移动。

NetLogo中的谈论空间和空间关系的语言元素有很多:朝向、距离、邻居、前后、左右、大小、航向、前一个Patch、扩散等。其中一些来自 Logo 语言,而大部分是新的语言。

一个重要的NetLogo语言特性是“智能体集合”,即所有智能体的集合,这在它的前身–Logo语言中是找不到的。例如,所有Turtles的集合和所有Patches的集合都是智能体集合。用户可以动态地创建自定义智能体集合,例如所有红色的Turtles集合,或者某一列Patches (具有给定X坐标的Patches集合)。智能体集合是NetLogo表现力的主要来源。

我们NetLogo的核心设计目标之一是结果是科学的、可重复的,因此模型的确定性运行很重要。NetLogo 是一个“模拟并行”环境。在真正的并行计算中,必须非常小心地构造程序以避免不确定性。我们认为这对于新手程序员来说负担太大了,所以 NetLogo 中的并发操作是确定性的。这意味着如果你以同样的方式构建随机数生成器,那么无论你在什么计算机上运行,NetLogo 模型总是以相同的顺序遵循相同的步骤并产生完全相同的结果, Java 的底层独立于平台的数学库的设计有助于确保一致性。

除了支持多智能体建模的特殊结构外,NetLogo 还包括标准的编程结构,例如过程、循环、条件、递归、字符串、列表等。支持整数运算和双精度浮点运算。Run 和 Runresult 命令可以执行fly上构建的代码。然而,许多类似 Lisp 的语言中存在的一些高级特性暂时缺失,例如符号、用户可定义的控制结构和真正的功能值。

有关NetLogo语言的更多信息,请参阅 NetLogo用户手册 (Wilensky, 1999),特别是编程指南和原语词典部分。

NetLogo是用 Java 1.4 版编写的。选择 Java 是因为核心语言和 GUI 库都是跨平台的,而且现代 Java 虚拟机具有相对较高的性能。NetLogo 1.3 支持回到 Java 1.1 的早期 Java 版本,但对于 NetLogo 2.0,我们则需要 Java 1.4。遗憾的是,切换到 Java 1.4 意味着放弃对 Windows 95 和 MacOS 8 和 9 用户的支持,因为这些操作系统没有可用的 Java 1.4 实现。然而,我们将继续修正 NetLogo 1.3错误,所以这些用户不会被冷落。

NetLogo 是一个混合编译器/解释器。为了提高性能,我们不直接解释用户的代码。相反,我们的编译器将其注释并重构为一种可以更有效解释的形式。曾经,NetLogo 是一个封闭的平台。用户无法更改或扩展它,也无法从外部代码控制它。我们正在改变这一问题,使 NetLogo 变得可扩展。它一直是一种全面的编程语言,因此用户可以在 NetLogo 中编写程序,然后像内置命令一样使用它们。但是现在在 NetLogo 2.0.1 中,我们有一个用于扩展的应用程序程序员接口 (API),这样用户就可以通过直接在Java中实现来为语言添加新元素。例如,您可以让用户使用 Java 的 MIDI 功能制作声音和音乐,或与远程计算机进行通信,以及许多其他事情。

关于应用的这一节必然很简短。我们正在发表一篇单独的论文(Tisue & Wilensky,in press),更深入地讨论设计和实现问题。

我们已经谈到了未来NetLogo版本的一些目标,例如提高速度和更大的可扩展性。以下是我们已经在努力并取得重大进展的增强功能:

1.三维NetLogo,包括语言扩展和三维图形。

2.支持不同的网格和世界拓扑。

3.代码和形状编辑器的可用性改进。

4.更简单、更灵活的随机智能体调度。

我们还致力于与聚合建模引擎的集成,改进对网络模型的支持,以及与网络分析和可视化工具的集成。

我们的研究小组正在努力进一步探索NetLogo在研究和教育方面的潜力。未来研究中用NetLogo作为研究工具的三个正在进行的主要项目:

1.综合模拟和建模环境(ISME),与德克萨斯大学合作的一个为期三年的项目,该项目使用网络标识在课堂和研究环境中实施“参与式模拟”(Wilensky & Stroup,1999)。

2.城市的程序建模,一个新的为期三年的项目,智能体“成长”虚拟城市景观,用于建筑、城市规划和娱乐。

3.模拟学校改革,这是一个新项目,旨在建立教育政策决策潜在影响的模型,以帮助学校领导和决策者。

这些项目将推动NetLogo优化,使其能够实现支持大型、富有雄心的多层次模型的能力大幅扩展。