2014-08-27 146 views
5

NetLogo非常适合基于代理的建模...除了语言。我总是发现自己扭曲了我的大脑,试图弄清楚如何在NetLogo的Logo实现中做些简单的代码(比如实现一个简单的case语句)。 Logo不仅仅是程序员的语言(对于那些被这种断言激怒的人的道歉)。NetLogo的Python脚本?

我看到了Abe Gong的Tengolo项目,意在做这件事(http://compsocsci.blogspot.com/2012/02/announcing-tengolo-python-alternative.html),但该项目似乎已被放弃。堆栈溢出中的另一个问题(agent-based simulation: performance issue: Python vs NetLogo & Repast)似乎表明Python会变慢。

似乎很有可能使用Jython编译成NetLogo可以使用的模块,但我想知道是否有人知道某件事情会让我以Python这种合理的语言来做NetLogo模拟。思考?

+0

相关:https://simulatingcomplexity.wordpress.com/2014/05/26/how-the-python-eat-the-turtle/ – 2014-08-28 15:12:07

+0

我最近在没有Netlogo的Repeat语句的python中感到不安。 – ychaouche 2014-09-05 21:43:37

回答

4

一年多来NetLogo克隆类型项目已经出现,但是一旦创作者意识到创建和维持NetLogo这样的工作在一段时间内是如何大量工作的几十年。 (上的NetLogo和它的前辈在StarLogo线工作可以追溯到20世纪80年代末。)

2015年更新:Mesa看起来像在ABM换Python的空间有前途的参赛者。

对于那些谁喜欢的NetLogo的功能设置和代理语义,但不喜欢的语言,我认为最有前途的方向是NetLogo Web项目,通过的NetLogo的开发者(包括我自己,但截至2015年,我不再沉重参与)。除了与旧的NetLogo语言向后兼容外,NLW还允许用JavaScript或任何编译成JavaScript语言来构建模型。

NLW还没有实现与普通NetLogo的完全功能对等,但它很好。因此,根据您的需求,这可能只是一个有希望的方向,而不是您今天可以使用的解决方案。

您也可以看看AgentScript - 也是基于JavaScript的,带有CoffeeScript偏差(2015年更新:我认为他们正在切换到ES6?)。

+0

感谢指向乌龟的指针。我会检查出来的。我不能说纯粹主义者真的是JavaScript,但至少有更好的控制结构。 – theoden 2014-08-29 20:49:24

2

NetLogo作为一种语言确实有一些缺陷。 lack of a case statement当然是一个小小的;功能级以上缺乏模块化对于非常复杂的仿真来说是一个较大的问题。

不过的事情,应该是简单的代码通常是,你可以不使用的方式简单的代码,虽然。这完全是一种心态:Logo语言源于Lisp家族,解决问题的最佳方式几乎总是从functional programming的角度来看。如果你试图保持一种必要的(甚至是“pythonic”)思维模式,你可能不得不“不断地扭曲你的大脑”。

我会建议在这里发布问题,当你发现自己与显然简单的事情挣扎。有人很可能愿意向你展示这种做法的“NetLogo方法”。

话虽这么说,有对的NetLogo主要有两种方式与其他JVM语言界面,包括Jython的:

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

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

但是,如果你的目标只是建立模拟,我不确定你会通过采取这些迂回的方式获得很多。你可能还需要切换到MASONRepast之类的不同平台,或者只是,你知道... 学会爱NetLogo

+0

是的,模块化的缺乏可能是一个大问题,但是小问题会出现并且是累积性的。我喜欢使用地图并减少原始图片,尽管很容易让它们变得聪明和简约,并且为了清晰起见而憎恨它们。 NetLogo作为一种语言看起来似乎是如此不受欢迎的道路。 – theoden 2014-08-29 20:49:49

+1

这是一篇关于从Python控制NetLogo的博客文章:http://davidmasad.com/blog/netlogo-from-python/ – 2014-09-05 17:38:38

+0

谢谢Seth。这是一个有趣的讨论,它将通过Python运行NetLogo API。 – theoden 2014-09-06 22:22:36

1

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

我绝对喜欢Python,但是我会为NetLogo写一句话:一旦习惯了它的功能集,特别是在添加了任务之后,对于大多数小规模的模拟来说这已经足够了。 (正如尼古拉斯所建议的,从功能编程的角度来说是有帮助的。)对于一些项目来说,NetLogo中缺乏继承非常不方便(品种不是一个合适的替代品)。不过,我正在进行的项目之一是在NetLogo中,在尝试使用Python教授基于代理的编程之后,我转而使用NetLogo作为教室。

还有一件事:期待,Tortoise看起来很激动人心。

+0

是的,规模是NetLogo的一个问题。我有一个数字蚂蚁模拟,由于性能问题,我无法获得10,000个以上的补丁。但它是在数百万台机器上运行的。我会去看看乌龟。谢谢! – theoden 2014-08-29 20:51:25

+0

NetLogo Web(又名乌龟)明显比普通NetLogo慢,所以对于高性能和/或大量代理,最好使用常规的NetLogo。 – 2015-10-24 15:25:07