要求补丁评估后的海龟行为
Turtle Behavior after asking for Patch Evaluation
我正在 NetLogo 中创建鱼缸式模拟。有"prey"、"predators"、"hidingspots".
这个想法是,当捕食者出现在地图上时,猎物将单独 运行 "hide" 行为并前往最近的 "hidingspot" - 如果两者之间没有捕食者它和 "hidingspot".
to move-turtles
ask prey [
if (any? predators)
[
hide
stop
]
运行隐藏命令的相关代码。
to hide
face min-one-of hidingspot [distance myself]
set d distance min-one-of hidingspot [distance myself]
ask patches in-cone d 80
[ set pcolor yellow
if (any? predators-here)
[ ask prey
[ forward 1
set color red
output-print "DANGER"]]]
forward 1
end
问题是我不知道如何正确使用 "ask patches" 中的 if 语句。因此,当一个猎物发现威胁时,所有猎物都会 运行 处理语句的其他部分,而不是单独评估它。
我该如何解决这个问题?
感谢任何帮助。
你是在要求每个猎物要求所有猎物躲起来。如果你从命令中删除 ask prey all prey are 运行 它应该工作正常并且速度更快
to hide
face min-one-of hidingspot [distance myself]
set d distance min-one-of hidingspot [distance myself]
ask patches in-cone d 80
[set pcolor yellow]
if (any? predators-here)
[
forward 1
set color red
output-print "DANGER"
]
end
你需要把你要求猎物做什么和你要求补丁做什么分开。正如King-Ink所说,你是在要求补丁要求所有的猎物做事。
最简单的方法是为 'danger' 补丁创建一个补丁集,然后检查这些补丁上是否有捕食者。为此,您需要如下内容(请注意,这是一个完整的模型,因此您可以将整个代码复制到一个新模型中并 运行 它)。
我清理了您代码中的其他一些内容。我将 let
用于局部变量 d,这样它就不必出现在您的全局变量中。我只要求 min-one-of
一次并重复使用,否则每次都可以选择不同的隐藏点(如果多个相同距离)。虽然这一次不会导致错误(因为第二次选择只是为了找到根据定义相同的距离),但这是一个很好的做法。
breed [prey a-prey]
breed [predators predator]
breed [hidingspots hidingspot]
to setup
clear-all
create-predators 1 [setxy random-xcor random-ycor set color red]
create-prey 5 [setxy random-xcor random-ycor set color brown]
create-hidingspots 20
[ setxy random-xcor random-ycor
hide-turtle
ask patch-here [set pcolor green]
]
reset-ticks
end
to go
ifelse any? predators
[ ask prey [hide] ]
[ ask prey [swim] ]
end
to hide ; turtle procedure
let target min-one-of hidingspots [distance self]
let path patches in-cone distance target 80
ask path [ set pcolor yellow ]
if any? predators-on path
[ set color red
output-print "DANGER"
face target
]
forward 1
end
to swim
end
我正在 NetLogo 中创建鱼缸式模拟。有"prey"、"predators"、"hidingspots".
这个想法是,当捕食者出现在地图上时,猎物将单独 运行 "hide" 行为并前往最近的 "hidingspot" - 如果两者之间没有捕食者它和 "hidingspot".
to move-turtles
ask prey [
if (any? predators)
[
hide
stop
]
运行隐藏命令的相关代码。
to hide
face min-one-of hidingspot [distance myself]
set d distance min-one-of hidingspot [distance myself]
ask patches in-cone d 80
[ set pcolor yellow
if (any? predators-here)
[ ask prey
[ forward 1
set color red
output-print "DANGER"]]]
forward 1
end
问题是我不知道如何正确使用 "ask patches" 中的 if 语句。因此,当一个猎物发现威胁时,所有猎物都会 运行 处理语句的其他部分,而不是单独评估它。
我该如何解决这个问题?
感谢任何帮助。
你是在要求每个猎物要求所有猎物躲起来。如果你从命令中删除 ask prey all prey are 运行 它应该工作正常并且速度更快
to hide
face min-one-of hidingspot [distance myself]
set d distance min-one-of hidingspot [distance myself]
ask patches in-cone d 80
[set pcolor yellow]
if (any? predators-here)
[
forward 1
set color red
output-print "DANGER"
]
end
你需要把你要求猎物做什么和你要求补丁做什么分开。正如King-Ink所说,你是在要求补丁要求所有的猎物做事。
最简单的方法是为 'danger' 补丁创建一个补丁集,然后检查这些补丁上是否有捕食者。为此,您需要如下内容(请注意,这是一个完整的模型,因此您可以将整个代码复制到一个新模型中并 运行 它)。
我清理了您代码中的其他一些内容。我将 let
用于局部变量 d,这样它就不必出现在您的全局变量中。我只要求 min-one-of
一次并重复使用,否则每次都可以选择不同的隐藏点(如果多个相同距离)。虽然这一次不会导致错误(因为第二次选择只是为了找到根据定义相同的距离),但这是一个很好的做法。
breed [prey a-prey]
breed [predators predator]
breed [hidingspots hidingspot]
to setup
clear-all
create-predators 1 [setxy random-xcor random-ycor set color red]
create-prey 5 [setxy random-xcor random-ycor set color brown]
create-hidingspots 20
[ setxy random-xcor random-ycor
hide-turtle
ask patch-here [set pcolor green]
]
reset-ticks
end
to go
ifelse any? predators
[ ask prey [hide] ]
[ ask prey [swim] ]
end
to hide ; turtle procedure
let target min-one-of hidingspots [distance self]
let path patches in-cone distance target 80
ask path [ set pcolor yellow ]
if any? predators-on path
[ set color red
output-print "DANGER"
face target
]
forward 1
end
to swim
end