最近由於科研需要,筆者接觸了 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 的一些偏工程的技巧,總結為本系列的第二篇博客