如何在 Netlogo 中的计数器末尾正确实现功能?

How can I properly implement a function at the end of a counter in Netlogo?

我正在编写一个流水线模型,我想实现一个计数器以在特定补丁(在本例中为补丁 3 0)处保持 10 个刻度的海龟。一旦 10 个滴答声过去,我希望乌龟继续以每个滴答声一个补丁的速度移动,并让下一只乌龟在到达指定补丁后开始自己的 10 个滴答计时器。 到目前为止,我可以在指定的补丁和 运行 一个 10 滴答计数器停止海龟;但是,我似乎无法让海龟在计时器完成后继续移动。

到目前为止,这是我的代码的相关部分。

to go
  move-tubs
  move-drums
  machine-marriage
  move-machines
  stay
  keep-going
  tick
end



to move-machines
  ask wmachines [
    if not any? turtles-on patch-ahead 1 and xcor < 3
    [ forward 1]
    ]

end

to stay
  ask wmachines-on patch 3 0[
    ifelse counter = 0 [
    set counter 10
    ]
    [set counter counter - 1
      set label counter 
      if counter = 0 
      [forward 1]
    ]
    ]

end



to keep-going
  ask wmachines-on patch 4 0[
    if not any? turtles-on patch-ahead 1 and xcor < 12
    [ forward 1]
  ]
  end

如果您的问题是海龟离开了 patch 3 0,但随后它们没有继续向前移动超过 patch 4 0,这仅仅是因为您的 keep-going 程序只处理了恰好是海龟的问题在 patch 4 0 上(因此 xcor < 12 部分完全未使用)。

一般来说,您使用三种不同的程序(即一种在 patch 3 0 之前,一种用于 patch 3 0,一种用于 patch 4 0,但应该确实超出 patch 3 0) 每个都是 hard-coding 模型中的某个位置。

拥有计数器的全部意义在于您可以在整个模型中概括等待条件,因此您的 go 程序可以通过简单地要求已经结束倒计时的代理人做一个来简化很多事情,还有那些还没有结束倒计时的人去做另一件事。

看看这个最小的可重现示例,其中我有一个不可预测的 stopping-patches 安排,但以非常通用和简单的方式实现等待条件:

turtles-own [
  counter
]

to setup
  clear-all
  reset-ticks
  
  resize-world 0 30 0 4
  set-patch-size 25
  
  ask patches with [pxcor = min-pxcor] [
    sprout 1 [
      set heading 90
      set color lime
    ]
  ]
  
  ask n-of 15 patches with [pxcor > min-pxcor] [
    set pcolor brown
  ]
end


to go
  ask turtles [
    ifelse (counter = 0)
    ;; If the counter equals 0:
      [forward 1
       if (pcolor != black) [
         set counter 10
       ]
      ]
    ;; If the counter does not equal 0:
      [set counter counter - 1]
    
    
    ifelse (pcolor = black)
    ;; If the turtle is on a black patch:
      [set label ""]
    ;; If the turtle is not on a black patch:
      [set label counter]
  ]
  
  tick
end