【问题标题】:Two Worlds in Netlogo at the Same Time同时在 Netlogo 中的两个世界
【发布时间】:2016-01-05 22:20:52
【问题描述】:

早安,

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

这可能吗?

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

【问题讨论】:

  • 类似ccl.northwestern.edu/modelsim/tools.shtml# -- “双世界建模”找不到资源。
  • 为什么不直接打开两份NetLogo?
  • 为什么不并排运行两个 NetLogos?
  • 因为我们的领导不希望这样,哈哈。是的,顺便说一句,模型中的所有海龟有可能只占据世界的一半吗?

标签: simulation netlogo modeling


【解决方案1】:

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

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

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

披露:我们仍在努力。它是稳定的,但语言(原语)会随着时间而改变。全面披露:我是 LevelSpace 扩展的作者之一,所以我有偏见。但它肯定会满足您的要求。

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

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 过程,可以使用按钮或将其写入命令中心。

【讨论】:

  • 你可以在这里下载LevelSpace扩展:github.com/NetLogo/LevelSpace/releases/tag/0.1
  • 会不会在旁边打开另一个世界,让我们肉眼看到?
  • 它可以以完整的界面打开,例如:i.imgur.com/DHdO8ck.png。它也可以无头打开,或者只打开视图,但在这些情况下,您必须以编程方式与模型交互。
  • 类似 ccl.northwestern.edu/modelsim/tools.shtml#“双世界”建模
  • 绝对!我用相关代码编辑了我的答案。很高兴我(和 LevelSpace!)可以提供帮助。 :)
【解决方案2】:

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

假设您已将中间的补丁变为灰色(例如ask patches with [pxcor = 0][set pcolor grey]),那么左侧模拟的代码将控制代理移动,因此它们的 xcor 0.5

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

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

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

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

【讨论】:

  • 如果您是 NetLogo 的新手并且一般没有进行过多的编程,我强烈建议您先构建一个单一的世界版本。当你这样做时,你会学到很多关于 NetLogo 的知识。然后,您可以使用您的新知识(从头开始)构建两个世界的版本并引入代码的相关部分,因此您将只关注两个世界方面而不是开发模型。另外,想想你是否真的想同时看到两个场景。您始终可以运行多个场景(请参阅 BehaviorSpace 工具)并根据生成的数据比较您的运行情况。
  • “唯一的事情”不是一项小任务。我快速浏览了一下。无论您在哪里让海龟从其他海龟中选择(例如寻找配偶),它们都只能从墙边的海龟中进行选择。一种方法是设置像set left-side patches with [pxcor &lt; 0] 这样的补丁集,然后像let partner-to-be one-of turtles-on left-side 这样进行搜索。但是您还有其他问题 - 例如,两个世界的重点是让两个场景使用不同的参数运行,但您的代码只设置了一组参数值(例如国家/地区)。
  • 和一般建议一样。学习 NetLogo 时,先从一个简单的模型开始,让它工作,然后再添加更多细节。例如,不需要生成一个随机数并使用它来按 who 值选择代理,只需使用 one-of 就像我在上面的评论中所做的那样。如果你有其他海龟,你的方法会引入错误,因为不能保证所有的 who 数字都是正确类型的海龟。该教程具有误导性,因为它引用了who 并拥有所有代理(如ask turtles),但只是应该让你继续前进。还有其他文档和示例模型。
  • 所以一般来说,我们必须对代码进行大修?我的任务主要是将整个模拟放在左侧(第一个世界),然后他们会做剩下的事情。用当前的代码可以吗?
  • 是的,大修。比 SO 问题更重要。
【解决方案3】:

好的,既然你一直在问同样的问题,我已经隔离了我的评论中实际上给你答案的部分。

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

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

【讨论】:

  • 仁,真的很抱歉。现在压力很大,实际上知道 netlogo 的其他人完成了我的任务.. 即将因为没有贡献而被踢出局。大声笑谢谢你的帮助! -- 学到了很多。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2023-03-19
    相关资源
    最近更新 更多