我必须创建一个Netlogo世界,为家庭提供N个绿色补丁,为超市提供M个蓝色补丁。在这个世界上,海龟从家(绿色区域(到超市(蓝色区域(再回家。我在下面发布了我的代码。
为什么要将week
变量作为补丁变量?换句话说,为什么要使用补丁来测量时间?
我认为你应该考虑另外两种选择:
-
使用全局变量测量时间:已经有
ticks
全局变量,但您可以创建自己的全局变量,每个代理都可以读取它 - 让您的乌龟测量它们想去商店的频率:每只乌龟都可以有一个自己的变量,用作倒计时。当倒计时到达0时,乌龟将离开去商店参观
例如,根据我的理解,如果你希望每70只乌龟去一次他们选择的商店,你可以这样做。
turtles-own [
housePatch
target
storeVisited
phase
countdown
]
to setup
clear-all
reset-ticks
ask n-of 10 patches [set pcolor blue]
ask n-of 15 patches with [ pcolor != blue ][
set pcolor green
sprout 1 [
set target one-of patches with [pcolor = blue]
set housePatch patch-here
set phase 1
set color red
set size 1
]
]
end
to go
ask turtles [
ifelse (phase = 1)
[shop]
[return]
]
ask turtles with [countdown > 0] [
set countdown countdown - 1
]
tick
end
to shop
if (countdown = 0) [
face target
forward 1
]
if (patch-here = target) [
set storeVisited storeVisited + 1
set phase 2
]
end
to return
face housePatch
forward 1
if (patch-here = housePatch) [
set countdown 70
set phase 1
]
end
让我们探讨一下我在这里实现的主要内容:
- 阶段:设置模型的方式意味着,在
go
的大多数迭代中,每个海龟要么执行shop
,要么执行return
。但是,您的go
是:
to go
ask turtles [
shop
return
]
end
当我去实现倒计时时,这造成了一些混乱,所以我想用phase
海龟自己的变量来清楚地划分海龟的活动:值为1意味着海龟必须执行shop
;值为2意味着乌龟将不得不执行CCD_ 9。phase
的值在setup
和每次乌龟回家时设置为1,并且在每次乌龟到达商店时设置为2。
正如你所看到的,我从模型中删除了stay
,因为它让海龟什么都不做。
- 倒计时:每只乌龟都有一个
countdown
变量,在shop
开始时进行检查。如果countdown
达到0,那么乌龟实际上是向商店移动的。countdown
的值在setup
时保留为默认值0,这意味着一开始每只乌龟都会向商店移动。在每次访问商店之后回家时,countdown
的值被设置为70。在go
的每一次迭代中,所有倒计时大于零的海龟都会将其降低一
注意,我对代码进行了一些其他小的更改,其中一些是:
- 我从
setup
程序中删除了set storeVisited 0
。NetLogo中变量的默认值为0,因此无需在开始时将其设置为0 - 在
go
结束时,您使用的是reset-ticks
而不是tick
- 在
shop
中,我用if (patch-here = target)
取代了if (pcolor = blue)
。这是因为,在前往target
的途中,海龟可能会发现自己身上有一块蓝色的斑块,而这不是它的目标