认识 NetLogo:学习资料、图形用户界面、兼容性
最近由于科研需要,笔者接触了 NetLogo,一种用于多智能体建模的编程语言。NetLogo 的定位是一门领域特定语言(domain-specific programming language),而不是一门通用编程语言(general purpose programming language),这是笔者作为初学者不幸的源泉。在此之前笔者的主要编程语言是 Python,笔者主要从 Python 使用者这个立场来叙述对 NetLogo 由抓狂到亲切的踩坑过程。笔者参考了以下资料
- 官方文档
- NetLogo 4.04 的中文文档
- American University 提纲挈领的介绍
- NetLogo 在 github 上的 wiki,NetLogo 扩展的 wiki,NetLogo 自带 Model 的 wiki
总体而言,NetLogo 文档较为齐全,但是社区比较小,遇到问题不容易查找。在中文社区中,以集智俱乐部出品的视频、图文资料最为突出。此外,定量群学(微信号 sociologynju)是一个由定量社会学研究者运营的活跃的公众号,提供了入门介绍,并结合社会学研究提供了 NetLogo 的使用案例,也有很大的参考价值。
认识 NetLogo
NetLogo 语法古怪,属于 Lisp 家族,基于 Java 和 Scala 实现,运行在 Java 虚拟机上。实际上,点开 NetLogo 的安装目录你会发现,它的入口是个平平无奇 jar 包,即 netlogo.jar
或 netlogo-version.jar
。NetLogo 的源代码通常被称为一个 Model,放在一个 .nlogo
文件里面,通过文本编辑器打开就会发现它还包含了图形界面的参数(留作彩蛋 😄)。迄今为止,NetLogo 只有官方提供的 GUI,长这个样子
界面上方的 Inferace
,Info
和 Code
三个选项卡分别对应 .nlogo
Model 的 3 个组成部分,即交互界面(包含控件和可视化)、说明文档和反映后台逻辑的代码。这是一个将界面、实现逻辑和文档分离的设计,看起来很棒!
界面最下方的白框相当于控制台(console),可以输入简单的交互式命令。其上方的 Command Center 则负责打印控制台或 Model 运行的日志。
不足的是,NetLogo GUI 没有提供调试工具,只能通过打印中间结果来调试;文本编辑器(Code 选项卡)仅有基本的语法高亮和自动缩进功能,可以通过 Check
检查语法错误,但没有自动补全、定义跳转等功能,如下图所示
其中 Procedures
是一个下拉菜单,可以显示代码中定义的全部的 procedure(例程),相当于函数。
版本兼容性问题
依赖的 Java 版本
笔者在 Linux 系统下安装使用 NetLogo,仅以 Linux 系统为例总结 NetLogo 与 Java 间的版本依赖。在官方下载页可以选择不同版本,版本详情页会介绍对 Java 的依赖。以 NetLogo 5.x.x 和 6.x.x 为例
NetLogo 版本 | Java 版本 | 是否内置 Java 运行环境 |
---|---|---|
5.3.1-6.2.2 | Java 8 | 是 |
5.0.5-5.2.1 | Java 6 | 否 |
如果 NetLogo 发行版本自带 Java 运行环境,那就无需额外安装,如果没有,则需要安装。值得一提的是,有些 Model 依赖特定的 Java 扩展(jar 包),为了正常运行 Model,需要根据 jar 包依赖的 Java 版本进行安装。
.nlogo
文件的版本
不同大版本 NetLogo 编写的 .nlogo
文件是不兼容的。实际上,通过文本编辑器打开 .nlogo
文件会发现,问件中标明了 NetLogo 版本。下面为版本 5.1.0
和 6.2.1
的截图
当我们试图用 NetLogo 打开不同大版本的 .nlogo
文件时,GUI 就会弹框提示。经测试笔者猜测 NetLogo 是向下兼容的,即低版本 NetLogo 无法打开高版本 .nlogo
文件,但高版本 NetLogo 通过转换可以打开低版本的 .nlogo
文件,如下图所示
综合对 Java 的版本依赖问题,笔者建议,
根据
.nlogo
文件的版本选择 NetLogo 版本。
以上总结了初学者安装和使用 NetLogo 可能遇到的问题。NetLogo 的语法和使用案例在官方文档和社区中均有充分的介绍,本系列博客就不再重复。由于笔者项目项目需要,还额外尝试了使用 NetLogo 的一些偏工程的技巧,总结为本系列的第二篇博客