NetLogo的脚本是用Python还是JavaScript?
NetLogo非常适合做基于代理的建模……但它的编程语言就不太好了。我总是觉得自己在绞尽脑汁,想弄明白怎么用NetLogo的Logo语言来实现一些本该简单的功能(比如写一个简单的条件语句)。Logo根本就不是一个适合程序员的语言(对那些对此感到愤怒的人表示歉意)。
我看到Abe Gong的Tengolo项目,声称可以解决这个问题(http://compsocsci.blogspot.com/2012/02/announcing-tengolo-python-alternative.html),但这个项目似乎已经被搁置了。另外,在Stack Overflow上还有一个问题(基于代理的模拟:性能问题:Python与NetLogo和Repast),似乎也表明Python的速度会比较慢。
看起来用Jython把代码编译成NetLogo可以用的模块是可行的,但我想知道有没有人知道有什么方法可以让我用像Python这样更合理的语言来做NetLogo的模拟。大家有什么想法吗?
5 个回答
如果你想在Python中对NetLogo模型进行优化或敏感性分析,可以考虑使用NL4Py。NL4Py是一个Python库,它可以让你通过Python来控制NetLogo模型。这个库可以在PyPI.org上找到,你只需要简单地运行pip install nl4py
就可以开始使用了。
gridworld.py 这个模块提供了一些类似于 NetLogo 的功能。
我非常喜欢 Python,但我想说一句 NetLogo 的好话:一旦你习惯了它的功能,NetLogo 对于大多数小规模的模拟来说是非常合适的,尤其是添加了任务功能之后。(正如 Nicolas 所建议的,从函数式编程的角度来看会更有帮助。)对于某些项目来说,NetLogo 缺少继承功能确实有点不方便(品种并不能很好地替代继承)。尽管如此,我正在进行的一个项目就是用 NetLogo 的,而且在尝试用 Python 教授基于代理的编程后,我选择在课堂上使用 NetLogo。
还有一件事:展望未来,Tortoise 看起来非常令人兴奋。
NetLogo 作为一种编程语言确实有一些缺点。其中一个小缺点是没有 case
语句,而在处理非常复杂的模拟时,缺乏更高层次的模块化则是一个更大的问题。
不过,通常应该简单的编码任务,实际上也确实是简单的,只是方式可能和你习惯的不太一样。这完全是思维方式的问题:Logo 语言源于 Lisp 家族,解决问题的最佳方法几乎总是从 函数式编程 的角度出发。如果你试图保持一种命令式(或者说“像 Python 那样”)的思维方式,你可能会发现自己需要不断地“扭曲大脑”。
我建议你在遇到看似简单的问题时,可以在这里提问。很有可能会有人愿意告诉你“NetLogo 的做法”。
说到这里,NetLogo 与其他 JVM 语言(包括 Jython)之间的接口主要有两种方式:
扩展 API 允许你提供新的原语,可以在 NetLogo 中使用。你可以在 Jython 中构建大部分模型,通过扩展原语暴露你的代码,并将必须在 NetLogo 中编写的部分保持到最少。
控制 API 允许你从外部程序控制 NetLogo。在这种情况下,你可以在 Jython 中编写模型,并将 NetLogo 作为外部模拟引擎或库使用。
不过,如果你的目标只是构建模拟,我不确定通过这些曲折的方式能获得多少好处。你不妨考虑换一个平台,比如 MASON 或 Repast,或者,嗯…… 学会喜欢 NetLogo。
从2018年4月开始,有一个新工具叫PyNetLogo,它可以让你更方便地使用NetLogo和Python。这个工具现在可以在PyPi上找到,你只需要用pip
命令就能简单安装。
相关论文在JASSS上发表:PyNetLogo: Linking NetLogo with Python(2018年3月)
代码可以在Github上找到。
想了解更多信息,可以查看文档。
这些年来,有很多类似NetLogo的项目,但一旦创作者意识到要创建和维护像NetLogo这样一个项目需要付出巨大的努力时,这些项目往往就会失败并消亡。(NetLogo及其前身StarLogo的开发可以追溯到1980年代末。)
2015年更新: Mesa 看起来是Python领域中一个很有前景的代理基础模型(ABM)项目。
如果你喜欢NetLogo的功能和代理语义,但不喜欢它的编程语言,我认为最有前景的方向是由NetLogo开发者(包括我自己,虽然到2015年我不再深度参与)推出的 NetLogo Web 项目。这个项目不仅与旧版NetLogo语言兼容,还允许使用JavaScript或任何可以编译成JavaScript的语言来构建模型。
虽然NLW还没有完全具备常规NetLogo的所有功能,但它正在朝这个方向努力。所以根据你的需求,它可能是一个有前途的方向,而不是你今天可以直接使用的解决方案。
你也可以看看 AgentScript —— 也是基于JavaScript的,偏向于CoffeeScript(2015年更新:我认为他们正在转向ES6?)。
2020年更新: 最近出现了一个基于JavaScript和Python的新项目(由StackOverflow创始人Joel Spolsky推出!)叫做HASH: https://hash.ai