我正在尝试创建一个模型,其中乌龟随机行走(但具有向前移动的倾向),直到它们落在黄色色块上,代表诱饵物体。
当一只乌龟落在其中一个黄色斑块上时,我希望它停在那个斑块上并在那里'调查'诱饵时留在那里15个蜱虫。
经过15个蜱虫后,我希望海龟像往常一样继续移动直到遇到另一个黄色斑块。
我试图在netlogo建模公告中修改这个停放的卡片模型的部分但是真的没有意义(我是netlogo的新手) http://modelingcommons.org/browse/one_model/3205#model_tabs_browse_procedures
我也尝试过实现这个线程中描述的倒计时器 How can one create a countdown timer in NetLogo?
但是当我尝试运行模拟时,我收到一个运行时错误“只有观察者可以询问所有海龟的集合”。谁能告诉我哪里出错了?可能有好几个地方!感谢。
这是导致运行时错误的代码:
turtles-own [count-down]
to setup
clear-all
ask patches with [count neighbors != 8]
[set pcolor blue]
create-turtles 20
ask turtles
[setxy random-xcor random-ycor
pen-down]
ask n-of 20 patches
[ set pcolor yellow ]
reset-ticks
end
to go
move-turtles
tick
if ticks >= 720 [stop]
end
to move-turtles
ask turtles
[ ifelse pcolor != yellow
[continue]
[stay]
]
end
to continue
ask turtles
[rt -90 + random 181]
ask turtles
[ifelse [pcolor] of patch-ahead 1 = blue [ lt random-float 360 ]
[fd 1]
]
end
to stay
ask turtles
[
setup-timer
decrement-timer
if timer-expired? [continue]
]
end
to setup-timer
set count-down 15
end
to decrement-timer
set count-down count-down - 1
end
to-report timer-expired?
report ( count-down <= 0 )
end
答案 0 :(得分:2)
要回答关于“只有观察者可以询问所有海龟的一部分”的部分,如果你这样做,就会出现错误信息:
ask turtles [
ask turtles [
do-something
]
]
这在NetLogo中是不允许的,因为它几乎总是偶然的而不是故意的。你可能只想让每只乌龟“做一件事”一次;你可能并不是说每只乌龟都要为两只乌龟的每一对“做什么”。
不太明显的是,如果所有的海龟都是在程序中分开的话,那么他们会问所有海龟。例如,如果你写:
to go
ask turtles [ my-procedure ]
end
to my-procedure
ask turtles [ do-something ]
end
出于同样的原因,它仍然是错误的,但仅仅通过瞥一眼就不那么容易了。
您的代码遵循后一种模式。你有:
to move-turtles
ask turtles [
...
continue
...
]
end
to continue
ask turtles [
rt -90
...
]
end
我认为您不想在ask turtles
程序中执行continue
。由于您在ask turtles
内调用该过程,因此它已经是一个乌龟程序。我建议把它写成:
to continue ;; turtle procedure
rt -90
...
end
该评论提醒您,它的目的是由海龟运行。 (我们在模型库中的所有模型中都遵循这种风格。)
答案 1 :(得分:1)
这只是一个例子,他们应该在黄色区域停留多少蜱?我假设15个蜱虫,我要求海龟在他们的标签上打印他们的蜱虫编号,如果跑得太快你可能会错过他们的停留时间,所以调整模型的运行速度,看看他们何时停留以及何时移动。您可以使用不同的方法继续,在这一方面,他们只需向前移动1个补丁。
turtles-own [count-down]
to setup
clear-all
ask patches with [count neighbors != 8]
[set pcolor blue]
create-turtles 20
ask turtles
[setxy random-xcor random-ycor
pen-down
set count-down 15
]
ask n-of 20 patches
[ set pcolor yellow ]
reset-ticks
end
to go
move-turtles
tick
if ticks >= 720 [stop]
end
to move-turtles
ask turtles
[ ifelse pcolor != yellow
[continue]
[stay]
]
end
To continue
rt random 10
fd 1
end
to stay
set count-down count-down - 1 ;decrement-timer
set label count-down
if count-down = 0
[
Continue
set label ""
reset-count-down
]
end
to reset-count-down
set count-down 15
end