我正在尝试使用2个排序的乌龟列表打破嵌套的foreach循环。 但是,不仅仅是退出内部循环,netlogo突破了整个过程。 我有类似下面的代码(此代码是组成的,但结构完全相同):
to do-something
let xturtles sort-by [ [a b] -> [birthday] of a > [birthday] of b ] turtles
;; construct an ordered set
foreach xturtles [ the-xturtle ->
ask the-xturtle [
let xage birthday
let yturtles sort-by [ [a b] -> [birthday] of a > [birthday] of b ] turtles with [birthday < xage]
;; construct a second ordered set
foreach yturtles [ the-yturtle ->
let breakout-condition? false
ask the-yturtle [
if (hidden? ) [
set breakout-condition? true
]
]
if breakout-condition? [ stop ]
]
]
]
end
但是,当达到停止条件时,netlogo会跳出整个过程,而不是继续执行外部循环(xturtles循环)?
这是预期的行为吗?如果是这样,在这种情况下,什么是良好做法?
谢谢! 费利克斯
答案 0 :(得分:1)
在同一过程中,甚至将stop
嵌套在一个额外的ask
过程中也无济于事。但是,如果您需要快速修复,我认为您可以使用包含foreach
作为解决方法的独立过程替换第二个stop
循环。例如,此过程遵循与您相似的格式,并且出现同样的问题-退出stop
时,会退出更广泛的foreach
。
to nest-foreach-example
ca
crt 1
let xs [ 1 2 3 4 ]
let ys [ 1 2 3 4 ]
foreach xs [
x ->
foreach ys [
y ->
ask turtles [
if y > x [
stop
]
]
print word x y
]
]
end
这将打印出11
。
但是,如果您创建一个自定义过程来代替“ y” foreach
循环,那么它将起作用(有或没有ask turtles
):
to nest-foreach-example-turtles
ca
crt 1
let xs [ 1 2 3 4 ]
let ys [ 1 2 3 4 ]
foreach xs [
x ->
for-y x ys
]
end
to for-y [ x_ ys ]
foreach ys [
y ->
ask turtles [
if y > x_ [
stop
]
]
print word x_ y
]
end
输出:
11
21
22
31
32
33
41
42
43
44