【问题标题】:NetLogo: break out of nested foreach loopNetLogo:跳出嵌套的 foreach 循环
【发布时间】:2019-04-19 15:54:29
【问题描述】:

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

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

谢谢! 费利克斯

【问题讨论】:

    标签: foreach netlogo


    【解决方案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
    

    【讨论】:

    • 谢谢卢克!是的,这是一个选择。也许我可以想出一个在使用这种计算时使用的通用报告器。我发现的另一个选择是使用停止标志并在内部循环内部检查它的主体是否应该被执行。但这增加了一个额外的变量,并且循环仍然在运行。
    • @FelixHelix - 你打赌!您可能能够弄清楚这一点,但我不确定如何比for-y 示例更通用,因为它接受当前正在迭代的项目以及您想要传递给它的新列表。它也应该是“可嵌套的”。您对停止标志是正确的,但老实说,如果您没有非常大的模型,我敢打赌您可能可以让循环运行。如果你有一个更大的,像for-y 这样的东西会节省一些计算时间。
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2018-05-21
    • 2012-05-16
    • 2019-07-13
    相关资源
    最近更新 更多