NetLogo: выход из вложенного цикла foreach - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь вырваться из вложенного цикла foreach, используя 2 списка отсортированных черепах. Но вместо того, чтобы просто выходить из внутреннего цикла, 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)?

Это ожидаемое поведение? Если так, что является хорошей практикой в ​​этом случае?

Спасибо! Felix

1 Ответ

0 голосов
/ 16 ноября 2018

Похоже, даже вложение 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
...