同时在Netlogo中的两个世界

时间:2015-10-08 10:35:56

标签: simulation netlogo modeling

美好的一天,

我们正在尝试创建一些东西,我们可以直观地在Netlogo中同时运行两个模拟。它将分为两半, 世界的前半部分将模拟跑步,另一半将模拟另一个具有不同变量的跑步。

可能吗?

我只想让我当前的程序在屏幕的一半上运行。

4 个答案:

答案 0 :(得分:2)

我的建议是使用LevelSpace(基于Seth Tisue在其他答案中链接的Controlling API)。 LevelSpace是一个NetLogo扩展,允许您从NetLogo内部打开NetLogo模型。

基本上你想要做的就是编写一个NetLogo模型,从模型文件中打开两个GUI模型,并根据需要设置每个模型中的变量。然后,您将在两个子模型中的'父'模型调用'go'中执行go过程,使它们串联运行。

LevelSpace的优点在于您可以根据需要打开任意数量的模型,而无需使用Java编写代码。您只需要使用扩展及其原语。

披露:我们仍在努力。它很稳定,但语言(原语)会随着时间的推移而改变。完全披露:我是LevelSpace扩展的作者之一,所以我有偏见。但它肯定会在这里做你想要的。

编辑:只是为了展示LevelSpace相对简单,这是完成所需操作所需的全部代码。下载扩展程序,解压缩,将ls文件夹放在extensions文件夹中。将此代码放在一个单独的模型中,在其界面上创建一个设置和一个go(重复)按钮,就是这样。:

extensions [ls]

to setup
  ls:reset ; resets the levelspace extension
  repeat 2 [ls:load-gui-model "</path/to/your/model.nlogo>"] ; load two of your models
  ls:ask ls:models "setup" ; call 'setup' in all your models
end

to go
  ls:ask ls:models "go"
end

如果您只想设置模型而不关闭模型并关闭窗口,只需执行

to re-setup
  ls:ask ls:models "setup"
end

并使用按钮或在命令中心写入re-setup程序。

答案 1 :(得分:1)

如果仔细查看图像,您会发现它实际上是一个world(在NetLogo意义上的单词 - 一种特定类型的输出窗口),它在视觉上与灰色墙隔开在中间。您可以通过查看窗口的顶部栏看到这一点 - 正常的平移控件和刻度计仅位于左角,3D按钮仅位于右侧角。也就是说,这是用巧妙的编码而不是NetLogo功能构建的。

假设您已将中间色块变为灰色(例如ask patches with [pxcor = 0][set pcolor grey]),则左手模拟的代码将控制代理移动,因此它们具有xcor&lt; -0.5和右边将使用xcor&gt; 0.5

由于您使用不同的参数值运行相同的模型,因此您可能希望代理程序属于同一品种。它们可以具有左侧或右侧的属性,并使用代理集来构造左侧龟或右侧龟。但是你可能也想考虑有不同的品种。

以下是一些如何在NetLogo语言中完全实现效果的建议:

  1. 使用左/右的巧妙编程,如启发你的截图
  2. 为这两种情景分别制作品种(如红海龟和蓝海龟),让它们在不相互作用的情况下占据同一个世界。如果它们与斑块(例如吃草)相互作用,那么您需要为每个品种(例如红草和蓝草)提供斑块变量。创建绘图和监视器以总结感兴趣的方面。这些情节可以将两种情景都视为不同的线条,使比较变得容易。
  3. 至于2,还可以选择在品种之间切换视图(这样你就可以看到它们在世界中的位置。例如,创建一个update-view按钮,调用代码来显示/隐藏海龟和根据选择器上的选择(可能是红色,蓝色和两者)来调整色块。
  4. 使用BehaviorSpace并在根据生成的输出运行模拟后进行比较。
  5. 所有选项2-4的优势在于它们可以运行2种以上的场景(例如红色,蓝色和黄色龟)。

答案 2 :(得分:1)

好的,既然你继续问同样的问题,我已经把我的评论中的一点实际上给了你答案。

无论你有哪些海龟从其他海龟中选择(例如寻找配偶),他们只能选择墙边的海龟。一种方法是设置补丁集,例如set left-side patches with [pxcor < 0],然后像let partner-to-be one-of turtles-on left-side一样进行搜索。

如果您只想将它​​们限制在一边(如右图所示),那么您需要xcor&gt; 0(左侧xcor <0)。使用abs功能。每当一个人移动时你还需要检查位置,以确保它保持在一边。

答案 3 :(得分:0)

您可以使用NetLogo的Controlling API编写一个嵌入两个NetLogo模型的Java程序(或Scala或Clojure或任何您想要的JVM语言)。