Netlogo “放在哪里?”;停止“;结束模拟

Netlogo “放在哪里?”;停止“;结束模拟,netlogo,Netlogo,如果没有要占用的特定补丁(目标),我想停止模拟。我执行了以下代码,但仍然无法工作。它只是阻止了乌龟,而不是模拟。我将这个“target”变量作为全局变量,并将其包含在“go”中,但也无法停止模拟 to set-move ask migrants [set pot-target patches with [value < 11 and not any? turtles-here] set target pot-target with [count neighbors with [

如果没有要占用的特定补丁(目标),我想停止模拟。我执行了以下代码,但仍然无法工作。它只是阻止了乌龟,而不是模拟。我将这个“target”变量作为全局变量,并将其包含在“go”中,但也无法停止模拟

to set-move
 ask migrants
  [set pot-target patches with [value < 11 and not any? turtles-here]
   set target pot-target with [count neighbors with [any? turtles-here with [value < 11]] >= 1]
   ifelse (count target != 0 and (status != "resident")) [move-to min-one-of target [value]
                                                          set status "resident"
                                                          set color blue]
                                                    [stop]
  ]
设置移动
询问移民
[将pot目标补丁设置为[值<11,此处没有海龟]
使用[count Neights with[any?turtles here with[value<11]]>=1]设置target pot target
ifelse(计数目标!=0和(状态!=“常驻”))[移动到目标[值]的最小值之一
设置状态为“常驻”
设置颜色[蓝色]
[停止]
]
这是完整的代码

breed [migrants migrant]
breed [residents resident]

patches-own [value]
turtles-own [income
status]

to setup
  ca
  let total problo + probmid + probhi
  if (total != 100)
     [print (word "prob is more than 100")]
  ask patches [set value random-normal 10 3
  let patch-value value
    set pcolor scale-color (gray - 5) patch-value 10 3]
  ask patches
  [if random 100 < 3
    [sprout-residents 1
      [set color red
       set shape "default"
       set size 1
       set status "resident"
      ]
    ]
  ]

end

to go

  ask patches
  [if not any? patches with [value < 11 and not any? turtles-here] [stop ]
    if random 100 < 1
    [sprout-migrants 1
      [set color green
       set shape "default"
       set size 1
       set status "migrant"
       set-move

  ]]]

end


to set-move
  let pot-target patches with [value < 11 and not any? turtles-here]
  let target pot-target with [count neighbors with [any? turtles-here with [value < 11]] >= 1]
  if any? target and (status != "resident")
  [ move-to min-one-of target [value]
    set status "resident"
    set color blue
  ]
end


繁殖[移民]
品种[居民]
自己的[价值]
海龟拥有[收入]
地位]
设置
ca
总problo+probmid+probi
如果(总计!=100)
[打印(单词“prob大于100”)]
询问补丁[设置值随机正常10 3
让面片值
设置P颜色比例颜色(灰色-5)面片值10 3]
询问补丁
[如果随机100<3
[萌芽居民1
[设置颜色为红色
将形状设置为“默认”
1号套餐
设置状态为“常驻”
]
]
]
结束
外带
询问补丁
[如果没有任何带[值<11且此处没有海龟]的补丁][停止]
如果随机100<1
[萌芽移民1
[设置颜色为绿色
将形状设置为“默认”
1号套餐
设置“移民”身份
移动
]]]
结束
移动
让pot以[value<11]的补丁为目标,这里没有海龟]
使用[count Neights with[any?turtles here with[value<11]]]>=1]将目标设定为pot target
如果有的话?目标和(状态!=“居民”)
[移动到目标[值]的最小值之一]
设置状态为“常驻”
设置颜色为蓝色
]
结束

原语
停止
将终止出现
停止
的代码块。在代码中,一旦满足条件,设置移动过程将结束,但这不会结束模拟。您需要做的是在顶层测试条件(go过程),这将终止运行。我对你的代码有点困惑,但我认为答案是将运动部分与检查是否停止分开

因此,在set-move-change中:

ifelse (count target != 0 and (status != "resident"))
[ move-to min-one-of target [value]
  set status "resident"
  set color blue
]
[ stop ]
只需切换到
if
块,而不是
ifelse
(同时删除
停止
)。然后,在顶层添加一行,如下所示:

if not any? patches with [value < 11 and not any? turtles-here] [stop]
请注意,我还更改了您的
计数!=0
无?
作为可读性建议。就个人而言,我还想命名agentset targets,而不是target,以提醒自己它可能有多个成员

更新:您需要让您的
停止
在go程序的顶层,以便它停止该程序。它应该是这样的:

to go
 if not any? patches with [value < 11 and not any? turtles-here] [stop ]
 ask patches
 [ if random 100 < 1
   [ sprout-migrants 1
     [ set color green
要走了
如果没有?[value<11且没有任何海龟的补丁在此][停止]
询问补丁
[如果随机100<1
[萌芽移民1
[设置颜色为绿色

我建议您使用while循环,而不是使用[stop]来结束模拟

while [not stop-condition][
  run
]

这种方法的问题在于它与NetLogo程序的
勾选
时间推进结构相冲突。您能否解释一下,为什么您认为这种方法比使用NetLogo文档中推荐的
停止
更好?清晰。如果您有大量代码库,其他人会查看您的代码
[stop]
很容易被忽略,而且很突然。while循环,特别是以
while[running condition]的形式出现
,将立即说明此代码应该一直运行,直到满足某个条件,并且将使您倾向于查找该条件。谢谢你,Jumboman,我认为使用stop比使用loop替换它更好。谢谢你JenB。我遵循你的建议,我认为它工作得很好。正如你所说,我认为主要问题是em在ask-Movers中。所以现在在set-move中,我删除了ask-Movers并添加了go-stop命令的ask补丁。我重新发布了上面所示的完整代码。我认为这已经很好地工作了。请看我的更新,你没有把它放在正确的位置。有时它不工作。补丁不断地让海龟发芽。当它工作时,有两个(或以上)海龟在补丁上。所以,我试着把它放在ask patches命令中,这样补丁就不会让海龟发芽。当它工作时,补丁上只有一只海龟是好的。但当它不工作时,结果与把命令放在顶层是一样的。请澄清你试图停止的是什么——模拟,或者只是crea的过程ting more turtlesI想停止模拟,这也(我认为)将停止创建更多的海龟。因此,当没有更多的补丁可占用时,模拟将停止,不再有海龟出芽。目前,在每次勾选期间都会创建多个海龟。勾选开始时,go过程检查是否有可用的补丁,如果没有,则停止模拟。但是,想象一下这里有3个可用的补丁,它不会停止,但是你的创建过程可能会长出5只海龟,而最后两个却没有地方可去。因此你需要添加一个检查,这样海龟只有在有位置的情况下才会发芽。这与停止模拟不同。正如一般评论所说,它们为什么会移动?移动的意思是什么在某种程度上,如果你只想要海龟在某些补丁上,那么你可以在那些地方发芽,而不是移动它们。我想你对运动是正确的。这没有什么意义。我会考虑直接从目标补丁中发芽。
while [not stop-condition][
  run
]