Fork me on GitHub

认识 NetLogo:学习资料、图形用户界面、兼容性

最近由于科研需要,笔者接触了 NetLogo,一种用于多智能体建模的编程语言。NetLogo 的定位是一门领域特定语言(domain-specific programming language),而不是一门通用编程语言(general purpose programming language),这是笔者作为初学者不幸的源泉。在此之前笔者的主要编程语言是 Python,笔者主要从 Python 使用者这个立场来叙述对 NetLogo 由抓狂到亲切的踩坑过程。笔者参考了以下资料

总体而言,NetLogo 文档较为齐全,但是社区比较小,遇到问题不容易查找。在中文社区中,以集智俱乐部出品的视频、图文资料最为突出。此外,定量群学(微信号 sociologynju)是一个由定量社会学研究者运营的活跃的公众号,提供了入门介绍,并结合社会学研究提供了 NetLogo 的使用案例,也有很大的参考价值。

NetLogo 语法古怪,属于 Lisp 家族,基于 Java 和 Scala 实现,运行在 Java 虚拟机上。实际上,点开 NetLogo 的安装目录你会发现,它的入口是个平平无奇 jar 包,即 netlogo.jarnetlogo-version.jar。NetLogo 的源代码通常被称为一个 Model,放在一个 .nlogo 文件里面,通过文本编辑器打开就会发现它还包含了图形界面的参数(留作彩蛋 😄)。迄今为止,NetLogo 只有官方提供的 GUI,长这个样子

netlogo-gui

界面上方的 InferaceInfoCode 三个选项卡分别对应 .nlogo Model 的 3 个组成部分,即交互界面(包含控件和可视化)、说明文档和反映后台逻辑的代码。这是一个将界面、实现逻辑和文档分离的设计,看起来很棒!

界面最下方的白框相当于控制台(console),可以输入简单的交互式命令。其上方的 Command Center 则负责打印控制台或 Model 运行的日志。

不足的是,NetLogo GUI 没有提供调试工具,只能通过打印中间结果来调试;文本编辑器(Code 选项卡)仅有基本的语法高亮和自动缩进功能,可以通过 Check 检查语法错误,但没有自动补全、定义跳转等功能,如下图所示

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.06.2.1 的截图

5.1.0

6.2.1

当我们试图用 NetLogo 打开不同大版本的 .nlogo 文件时,GUI 就会弹框提示。经测试笔者猜测 NetLogo 是向下兼容的,即低版本 NetLogo 无法打开高版本 .nlogo 文件,但高版本 NetLogo 通过转换可以打开低版本的 .nlogo 文件,如下图所示

low2high

fail_low2high

high2low

综合对 Java 的版本依赖问题,笔者建议,

根据 .nlogo 文件的版本选择 NetLogo 版本。

以上总结了初学者安装和使用 NetLogo 可能遇到的问题。NetLogo 的语法和使用案例在官方文档和社区中均有充分的介绍,本系列博客就不再重复。由于笔者项目项目需要,还额外尝试了使用 NetLogo 的一些偏工程的技巧,总结为本系列的第二篇博客

NetLogo 进阶:导入 nls 文件、Headless 模式、传递 Java 虚拟机参数
posted @ 2022-04-12 11:33  Rotopia  阅读(1143)  评论(0编辑  收藏  举报