如何在netlogo中为每只乌龟实现定时器



我正在尝试为Netlogo中的每只乌龟实现一个定时器这样我就可以得到每只乌龟所花费的最小值、最大值和平均时间。有人能帮助吗

您还没有说出您真正想要的定时(或给定任何代码尝试(。任何时候,你都需要一只乌龟来记住从一个记号到下一个记号的任何事情,你需要一个变量。计时器最简单的代码是有一个变量,当进程开始时,您将该变量设置为ticks的当前值,当进程停止时,从ticks的当前值中减去该开始时间。以下是一个完整的模型示例:

turtles-own
[ start-time
time-taken
]
to setup
clear-all
create-turtles 20
[ set start-time 2 + random 10
set time-taken -1
]
reset-ticks
end
to go
let movers turtles with [time-taken = -1 and start-time <= ticks]
ask movers
[ set heading random 360
forward 1 + random 3
if random-float 1 < 0.05 [ set time-taken ticks - start-time ]
]
tick
end

如果您希望计时器使用实时单位(秒、分钟、年…(并且具有非整数值,请检查新的时间扩展。

https://github.com/NetLogo/Time-Extension

查看时间等基元:之间的差异

例如,您可以执行此编码,标记要监视的乌龟,并在事件发生时增加标记变量。然后,您可以在BehaviorSpace中对其进行监控,并分析csv文件中输出的结果。例如,以下代码:

globals [ID]
turtles-own [special-turtle]
to create-turtle
crt 1 [
setxy min-pxcor 0
set heading  90
set special-turtle false
set ID who]
end
to go
;omitted
special-turtles
tick
end
to special-turtles
ask turtles-on patch 0 0 [set ID who]
ask max-one-of turtles [who] [set special-turtle true]
ask turtles with [special-turtle = true][set special-turtle (special-turtle + 1)]
end

我认为前面的答案都没有考虑到:实现计时器的方式取决于您想要如何使用测量。

1-如果您只想在测量完成后读取测量值

表达式";在测量完成之后;这可能意味着你想在模型后期的某个时候阅读它,甚至可能只是从某个模型的输出中阅读。

在这种情况下,我会采取的方法与JenB建议的类似,但我相信你可以简单一点,因为这里我只使用了一个额外的海龟变量(除了my-variable,它只是用来表示你的模型中已经存在的东西(:

turtles-own [
my-variable    ; This represents something you have in your model, to be used as a condition for the timer
my-timer
]
to setup
clear-all
reset-ticks
create-turtles 10
end
to go
; Here you have your normal code. When you need, just include
; 'start-timer' and 'stop-timer'. For simplicity, let's
; say you want to count how long does each turtle take
; to get from a value of 1 to a value of 5 for my-variable.
; You can just do:

ask turtles [
if (random 10 < 2) [
set my-variable (my-variable + 1)
]

if (my-variable = 1) [
start-timer 
]

if (my-variable = 5) [
stop-timer
type "I am turtle " type who type " and it took me " type my-timer print " ticks."
die
]
]

tick

if (not any? turtles) [stop]
end
to start-timer
set my-timer ticks
end
to stop-timer
set my-timer (ticks - my-timer)
end

请注意,大多数代码只是为了制作一个完全可复制的示例,但实际实现仅由my-timerto start-timerto stop-timer组成。

你可以采取这种方法,因为这里的假设是,只有在to stop-timer发生后,你才会有兴趣阅读测量结果。否则,请参见第2点。

2-如果您希望能够在模拟过程中的任何时刻读取测量值

在这种情况下,您需要使计时器随着时间的推移而前进(与第1点相反,在第1点中,您可以只获取初始和最终时间,并在两者之间做出区分(。

我想最简单的方法是在每次出现tick时有条件地增加计时器。

举一个与以前相同的例子,它将类似于:

turtles-own [
my-variable    ; This represents something you have in your model, to be used as a condition for the timer
timer-active?
my-timer 
]
to setup
clear-all
reset-ticks
create-turtles 10 [
set timer-active? FALSE 
]
end
to go  
ask turtles [
if (random 10 < 2) [
set my-variable (my-variable + 1)
]

if (my-variable = 1) [
set timer-active? TRUE 
]

if (my-variable = 5) [
set timer-active? FALSE 
]
]

tick
ask turtles with [timer-active?] [
set my-timer (my-timer + 1) 
]

if (count turtles with [my-variable < 5] = 0) [stop]
end

这样,您就可以随时看到每只海龟的my-timer的当前值。

最新更新