time - 每滴答声释放两只海龟 netlogo
问题描述
我目前正在研究一个模型,我可以在其中模拟购物时的行人运动。所以,我已经想出了一些我需要的东西,但我一直在试图弄清楚如何在某个补丁中每滴答刻释放 2 只海龟(比如一对)。两只海龟同时释放。我的代码基于蚂蚁线,但它只是一次性释放所有行人,然后海龟开始行走。所有海龟都被释放后,蜱虫也会开始。我希望海龟在进入时开始“行走”。这是我的代码:
breed [ leadvisitors leadvisitor ]
breed [ visitors visitor ]
to setup
clear-all
setup-visitors
reset-ticks
end
to setup-visitors
create-leadvisitors num-of-pedestrians * 0.1 ;;create 10% of the total number of pedestrians
[
set demand-type "none"
set color black
set size 1
setxy 0 16
set heading 180
set pen-size 1
set destination one-of patches
set wait-time -1
set demand-lvl 0
]
create-visitors (num-of-pedestrians - (num-of-pedestrians * 0.1))
[ set demand-type 0
set size 1
setxy 0 16
set heading 180
set pen-size 1
set destination one-of patches
set wait-time -1
set demand-lvl 1
set attracted? false
] ]
end
to go
if turtles = 0 [ stop ]
ask turtles
[
set-demand-type
have-demand
]
if ticks > 100 [ stop ]
tick
display-labels
end
;;;;; visitor's internal state of demand ;;;;;
to set-demand-type
if demand-type = 0
[ set demand-type "food"
set color red
let target (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = red]
]
end
to have-demand
if demand-lvl = 0
[
ifelse wait-time = -1
[ stroll ]
[ set wait-time wait-time - 1
if wait-time = 0
[ stroll ]]
]
if demand-lvl = 1
[ ifelse wait-time = -1
[ stroll
evaluate ]
[ set wait-time wait-time - 1
if wait-time = 0
[ stroll
evaluate ]]
]
end
to stroll
if any? neighbors with [ pcolor = gray - 3 ]
[ die ]
ifelse any? neighbors with [ pcolor = gray or pcolor = orange or pcolor = blue or pcolor = red]
[ facexy exitpt-x exitpt-y ]
[ rt random-float visitor-view-angle lt random-float visitor-view-angle ]
fd walking-speed
end
to evaluate
if any? neighbors with [ pcolor = gray or pcolor = orange or pcolor = blue or pcolor = gray - 4 or pcolor = gray - 3 or pcolor = red + 2]
[ facexy exitpt-x exitpt-y
rt random-float visitor-view-angle lt random-float visitor-view-angle
fd walking-speed ]
let _mycolor color
if any? (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = _mycolor]
[ let new-target max-one-of ( patches with [pcolor = _mycolor] in-cone visitor-vision-depth visitor-view-angle) [patch-influence]
let dist-to-new-target min-one-of (patches with [pcolor = _mycolor] in-cone visitor-vision-depth visitor-view-angle) [distance myself]
face new-target
set heading towards new-target
fd walking-speed
set attracted? true
attracted-and-visiting
re-evaluate
]
end
to attracted-and-visiting
if pcolor = red + 2
[ set heading towards one-of patches with [pcolor = red + 2]
fd 0
set patch-popularity patch-popularity + 1
set wait-time avg-waiting-time
if count turtles-here > 0
[ set num-of-visitors num-of-visitors + 1 ]
set plabel num-of-visitors
]
end
to re-evaluate
let _mycolor color
if not any? (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = _mycolor]
[ set attracted? false ]
ifelse choose? [set heading towards one-of patches with [pcolor = _mycolor]] [facexy exitpt-x exitpt-y]
end
to-report choose?
report random 2 = 0
end
解决方案
作为我们来回评论的结果,让我来看看你在寻找什么。我假设您想leadvisitors
在运行开始时创建,然后visitors
随着运行的进行每个刻度添加两个。如果是这样,那么您的setup
程序将类似于
globals [num-visitors-created]
to setup
clear-all
set num-visitors-created 0
create-leadvisitors num-of-pedestrians * 0.1 [
set demand-type "none"
set color black
set size 1
setxy 0 16
set heading 180
set pen-size 1
set destination one-of patches
set wait-time -1
set demand-lvl 0
set num-visitors-created num-visitors-created + 1
]
reset-ticks
end
创建你的leadvisitors
,但没有visitors
。请注意,全局变量num-visitors-created
会跟踪和创建的数量,leadvisitors
每次visitors
创建leadvisitor
或时都会增加一visitor
。
然后,在您的过程中,您将创建两个访问者,每个刻度线,直到和创建go
的总数达到。(如果只有一个新访客的空间,您希望只创建一个,还是需要成对创建?我假设是后者。)因为您不希望访客死亡为一个新的开辟空间,我们测试创建的数字,而不是仍然活着的数字。visitors
leadvisitors
num-of-pedestrians
to go
if turtles = 0 [ stop ]
; create a new pair of visitors if there is room.
if num-visitors-created <= (num-of-pedestrians - 2)
create-visitors 2 [
set demand-type 0
set size 1
set heading 180
set pen-size 1
setxy 0 16
set destination one-of patches
set wait-time -1
set demand-lvl 1
set attracted? false
set num-visitors-created num-visitors-created + 1
]
ask turtles
[
set-demand-type
have-demand
]
if ticks > 100 [ stop ]
tick
display-labels
end
(既然看起来也leadvisitors
可能死掉,你想保持一定的最小数量或比例leadvisitors
吗?如果是这样,你应该提出一个新问题。)
上面的代码将在每个刻度visitors
上创建一对新的。patch 0 16
但是,如果您想visitors
在不同的补丁上创建新的补丁,比如红色补丁之一,您可以在您的go
程序中将该补丁sprout
添加到新访问者。
ask one-of patches with [pcolor = red] [
sprout-visitors 2 [
set demand-type 0
set size 1
set heading 180
set pen-size 1
set destination one-of patches
set wait-time -1
set demand-lvl 1
set attracted? false
set num-visitors-created num-visitors-created + 1
]
]
请注意,此处未设置新访问者的 xy 坐标,因此它们从产生它们的补丁开始。
推荐阅读
- python-3.x - 为什么可滚动画布中的按钮不动?(Python3 + tkinter)
- css - 为什么更改单个组件的 css 会影响所有其他组件?
- google-apps-script - Google Script/Sheet 不确定如何从用户个人资料中提取员工信息部分的信息,例如员工 ID 和职位
- python - 由于 Python 2 中的可变长度可选参数 (*args) 而导致的错误
- python - 在 Django REST 框架中公开 MoneyFields?
- log4j2 - 如何在log4j2中将不同的日志级别写入不同的滚动文件
- visual-studio-code - 如何在 Visual Studio Code 中隐藏缩进箭头?
- python - Pandas groupby 将多列相加
- javascript - Electron js应用程序在构建后无法正常工作
- typescript - Typescript - 属性将自身作为参数的接口