9

NetLogo 非常适合基于代理的建模...除了语言。我总是发现自己在扭曲我的大脑,试图弄清楚如何在 NetLogo 的 Logo 实现中做一些应该很容易编码的事情(例如实现一个简单的 case 语句)。Logo 不是程序员的语言(向那些被这个断言激怒的人道歉)。

我看到了 Abe Gong 的 Tengolo 项目,该项目声称可以做到这一点(http://compsocsci.blogspot.com/2012/02/announcing-tengolo-python-alternative.html),但该项目似乎已被放弃。堆栈溢出中的另一个问题(基于代理的模拟:性能问题:Python vs NetLogo & Repast)似乎表明 Python 会更慢。

似乎很有可能使用 Jython 编译成 NetLogo 可以使用的模块,但我想知道是否有人知道可以让我用 Python 等明智的语言进行 NetLogo 模拟的东西。想法?

4

5 回答 5

7

截至2018 年 4 月,区块中出现了一个新的孩子PyNetLogo,它甚至可以在 PyPi中通过pip.

论文@JASSS:PyNetLogo:用 Python 连接 NetLogo(2018 年 3 月)

代码@Github

文档

于 2018-04-12T23:17:14.197 回答
6

多年来,已经有很多 NetLogo 克隆类型的项目,但是一旦创建者意识到在几年甚至几十年的时间里创建和维持像 NetLogo 这样的东西所涉及的大量工作,它们往往会失败并死亡。(关于 NetLogo 及其 StarLogo 系列前身的工作可以追溯到 1980 年代后期。)

2015 年更新: Mesa看起来像是 ABM-for-Python 领域的有前途的进入者。

对于那些喜欢 NetLogo 的功能集和代理语义但不喜欢该语言的人,我认为最有希望的方向是NetLogo 的开发人员的NetLogo Web项目(包括我自己,虽然截至 2015 年,我不再大量参与)。除了向后兼容旧的 NetLogo 语言之外,NLW 还允许使用 JavaScript 或任何编译为 JavaScript 的语言构建模型。

NLW 尚未实现与常规 NetLogo 的全部功能对等,但它正在顺利进行中。因此,根据您的需求,它可能只是一个有前途的方向,而不是您今天可以使用的解决方案。

你也可以看看AgentScript——也是基于 JavaScript 的,带有 CoffeeScript 偏见(2015 年更新:我认为他们正在转向 ES6?)。

2020 年更新:最近一个基于 JavaScript 和 Python 的参赛者(来自 StackOverflow 创始人 Joel Spolsky!)是 HASH:https ://hash.ai

于 2014-08-28T12:28:51.283 回答
5

NetLogo 作为一种语言确实有一些缺陷。缺少case声明肯定是次要的。对于非常复杂的模拟来说,缺乏功能级别以上的模块化是一个更大的问题。

但是应该很容易编码的东西通常容易编码,尽管你可能不习惯这种方式。这完全取决于心态:Logo 语言起源于 Lisp 家族,解决其中问题的最佳方法几乎总是从函数式编程的角度来看。如果你试图保持一种命令式(甚至是“pythonic”)的心态,你可能不得不不断地“扭曲你的大脑”。

当您发现自己在为看似简单的事情苦苦挣扎时,我建议您在此处发布问题。很有可能有人愿意向您展示“NetLogo 方式”的做法。

话虽如此,NetLogo 与其他 JVM 语言(包括 Jython)交互的主要方式有两种:

  • Extensions API允许您提供可在 NetLogo 中使用的新原语。可以想象,您可以在 Jython 中构建大部分模型,通过扩展原语公开您的代码,并将您必须在 NetLogo 中编码的内容保持在最低限度。

  • 控制 API允许您从外部程序控制 NetLogo。在这种情况下,您将在 Jython 中编写模型并使用 NetLogo 作为外部仿真引擎/库。

但是,如果您的目标只是建立模拟,我不确定通过这些迂回的方式您会获得很多。您不妨切换到不同的平台,例如MASONRepast,或者只是,您知道...学会爱 NetLogo

于 2014-08-27T21:46:08.573 回答
4

gridworld.py模块提供了一些类似NetLogo 的功能。

我绝对喜欢 Python,但我要为 NetLogo 说一句话:一旦你习惯了它的功能集,它对于大多数小规模的模拟来说已经绰绰有余了,尤其是在添加了任务之后。(正如 Nicolas 所建议的,从函数式编程的角度来看会有所帮助。)对于某些项目,NetLogo 中没有继承确实很不方便(品种不是充分的替代品)。尽管如此,我正在进行的项目之一是 NetLogo,在尝试使用 Python 教授基于代理的编程之后,我改用 NetLogo 进行课堂教学。

还有一件事:展望未来,乌龟看起来很令人兴奋。

于 2014-08-27T22:29:21.257 回答
3

如果您希望通过 Python 对 NetLogo 模型进行优化或敏感性分析,您可能需要考虑使用NL4Py。NL4Py 是一个 Python 包,可让您从 Python 控制 NetLogo 模型。该包在 PyPI.org 上发布,您可以从一个简单的pip install nl4py.

文章预印本

存储库和文档

使用 NL4Py 和 DEAP 进行模型校准的示例

使用 NL4Py 和 SALib 进行敏感性分析的示例

于 2018-09-11T15:35:43.883 回答