Netlogo 中的两个世界同时存在

Two Worlds in Netlogo at the Same Time

美好的一天,

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

这可能吗?

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

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

假设您已将中间补丁变成灰色(例如 ask patches with [pxcor = 0][set pcolor grey]),那么左手模拟的代码将控制代理移动,因此它们具有 xcor < -0.5,而右手将使用 xcor > 0.5

由于您运行使用不同参数值的相同模型,您可能希望代理是同一品种。它们可以有一个属性是左还是右,并使用代理集来构造左海龟或右海龟。但您可能还想考虑拥有不同的品种。

这里有一些如何完全在 NetLogo 语言中实现效果的建议:

  1. 像启发您的屏幕截图中那样用左/右进行巧妙的编程
  2. 为这两个场景设置不同的品种(例如红海龟和蓝海龟),让它们占据同一个世界而不相互影响。如果它们与斑块相互作用(例如吃草),那么您需要为每个品种(例如红草和蓝草)设置一个斑块变量。创建绘图和监视器以总结感兴趣的方面。这些地块可以将两种情况作为不同的线,以便于比较。
  3. 至于 2,但也可以选择在品种之间切换视图(这样您就可以看到它们在它们的世界中的位置。例如,创建一个 update-view 按钮调用代码 show/hide 根据选择器上的选择(可能是红色、蓝色或两者)选择的海龟和色块。
  4. 使用 BehaviorSpace 并在 运行根据生成的输出进行模拟后进行比较。

所有选项 2-4 的优点是它们可以 运行 超过 2 个场景(例如红色、蓝色和黄色海龟)。

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

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

基本上你想在这里做的是编写一个 NetLogo 模型,从你的模型文件中打开两个 GUI 模型,并根据需要在每个模型中设置变量。然后,您将在两个子模型的 'parent' 模型调用 '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

如果您只想设置模型而不关闭它们并关闭 windows,只需执行

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

并调用 re-setup 过程,可以使用按钮或在命令中心写入。

好的,既然你一直在问同样的问题,我就把我的评论中真正能给你答案的部分分离出来。

无论你从其他海龟那里得到海龟 select(例如寻找配偶),它们都必须 select 只从墙边的海龟那里得到。一种方法是设置补丁集,例如 set left-side patches with [pxcor < 0],然后像 let partner-to-be one-of turtles-on left-side.

一样进行搜索

如果您只想将它​​们限制在一侧(比如右侧),那么您需要 xcor > 0(左侧 xcor < 0)。使用 abs 函数。每当有人移动时,您还需要检查位置以确保它保持在一边。