Geo*_*ire 1 math computer-science netlogo
我正在思考如何在 netlogo 中编写“令人厌恶的”动作。如下:我们正在尝试建立一个模型,让牧羊犬牧养一群羊。当狗靠近羊时(即距离小于羊的“反应距离”时),羊就会逃离狗。我不知道如何做到这一点“当羊的距离小于响应距离时,羊会逃离狗”。有人可以帮我吗?非常感谢!!
这是一个完整的解决方案。解释如下。
breed [sheep a-sheep]
breed [dogs dog]
globals [
panic-distance
the-dog
]
to setup
clear-all
set panic-distance 10
set-default-shape sheep "sheep"
create-sheep 50 [
setxy random-xcor random-ycor
]
create-dogs 1 [
set the-dog self
]
reset-ticks
end
to go
ask the-dog [
rt random 30
lt random 30
fd 1
]
ask sheep [
if distance the-dog < panic-distance [
face the-dog
right 180
fd 1
]
]
tick
end
Run Code Online (Sandbox Code Playgroud)
您的评论中有两个关键语句,它们可以非常直接地转换为 NetLogo 代码:
当狗靠近最近的羊并且距离低于恐慌距离时
“最近的羊”在如何接近它方面可能有点转移注意力。您可能想要做的是询问每只羊当前与狗的距离是否小于恐慌距离。NetLogo 拥有distance专门用于此目的的原语!在代码中,它变成:
ask sheep [if distance the-dog < panic-distance [...]]
您只需要将 the 替换...为您希望羊在这种情况下执行的操作,这将在您的下一个语句中进行描述:
羊会走与狗相反的路
我猜你的意思可能是远离狗,因为“与狗相反的方式”实际上可能是朝向狗。
NetLogo没有原face-away-from语,但它有一个face原语,它会让羊转向狗。你可以使用它,然后将其一直转回去,这样它就可以逃跑:
face the-dog
right 180
Run Code Online (Sandbox Code Playgroud)
就这样吧。这就是它的核心。其余的你可以随心所欲地玩。