NetLogo:突破嵌套的foreach循环

时间:2018-11-16 12:45:44

标签: foreach netlogo

我正在尝试使用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循环)?

这是预期的行为吗?如果是这样,在这种情况下,什么是良好做法?

谢谢! 费利克斯

1 个答案:

答案 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