Проблемы с тиками в NetLogo

#netlogo

Вопрос:

Я пытаюсь понять и посмотреть, можно ли изменить следующее:

У меня есть код, состоящий из 2 итераций. с конфигурацией точно такой, какая она есть. Нажав кнопку «Настройка-все», а затем 4 раза нажмите кнопку «Перейти один раз». Вызовите вторую итерацию. Но эта вторая итерация начинается с тика 1, а не с нуля. Почему это происходит? Есть ли способ решить эту проблему?

 globals [ iteration ]

patches-own [ scale-patch ]

to setup-world
  clearMethod
  random-seed 1  
  ifelse iteration = 0
  [setup-layers]
  [setup-layers-2]
  setup-turtles
  reset-ticks
end

to clearMethod
  clear-ticks
  clear-turtles 
end

to setup-all
  clear-all
  random-seed 1  
  ifelse iteration = 0
  [setup-layers]
  [setup-layers-2]
 setup-turtles  
  reset-ticks
end


to setup-layers
  ask patches [
    set scale-patch random 10
    set pcolor scale-color blue scale-patch -8 12 ]   
end


to setup-layers-2
  ask patches [
    set scale-patch random 10
    set pcolor scale-color green scale-patch -8 12 ]  
end


to setup-turtles
   crt 1 [ set color black ] 
end


to go
moveproc
 let n count turtles
  if n = 0
  [
  ifelse iteration = 0
    [
      set iteration 1
      setup-world
    ]
    [
      stop
    ]
  ]
  
  tick
end


to moveproc
  ask turtles [
    right random 360
    fd 1 
  if ticks >= 3
      [
          die
      ]
  ]
end
 

Заранее спасибо

Ответ №1:

Момент, когда вы меняете итерацию, находится в рамках go процедуры (т. е. set iteration 1 setup-world ). Однако go процедура также заканчивается tick . Это означает, что при изменении итерации NetLogo сначала выполнит все новые настройки, которые включают reset-ticks в себя (доведение тиков до 0), а затем выполнит tick (доведение тиков до 1).

Если вам не нравится, что это происходит, и если вам нужно сохранить эту структуру (т. Е. go Выполнить настройку), вы можете изменить go процедуру таким образом, чтобы это tick произошло до проверки условия изменения итерации:

 to go
  moveproc
  tick
  
  let n count turtles
  if n = 0 [
   ifelse iteration = 0
    [set iteration 1
     setup-world]
    [stop] 
  ]
end
 

PS: тот, который вы предоставили, — отличный минимально воспроизводимый пример

Комментарии:

1. Большое тебе спасибо, Маттео, за решение и объяснение :). Решено! И спасибо за множество советов о том, как задать вопрос 🙂