1

我正在考虑如何在 netlogo 中编写“令人反感”的动作。就是这样:我们正在尝试建立一个模型,其中牧羊犬放牧一群羊。当狗靠近羊时(即距离小于羊的“反应距离”时)羊会从狗身边跑开。我不知道如何做到这一点“当它们的距离小于响应距离时,羊会从狗身边跑开”。有人可以帮我吗?非常感谢!!

4

2 回答 2

4

这是一个完整的解决方案。解释如下。

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

您的评论中有两个关键语句,它们非常直接地转换为 NetLogo 代码:

当狗靠近最近的绵羊并且距离低于恐慌距离时

就如何接近它而言,“最近的绵羊”可能有点红鲱鱼。您可能想要做的是询问每只羊当前与狗的距离是否小于恐慌距离。NetLogo 有这个distance原语!在代码中,它变成:

ask sheep [if distance the-dog < panic-distance [...]]

在这种情况下,您只需要将 替换为...您想要羊做的事情,这在您的下一个语句中进行了描述:

羊会和狗走相反的路

我想,您可能是指远离狗,因为“与狗相反的方式”实际上可能是朝向狗。

NetLogo没有face-away-from原语,但它有一个原face语,它会让羊转向狗。您可以使用它,然后将其完全转回以便它可以逃跑:

face the-dog
right 180

你去吧。这就是它的核心。你可以随心所欲地和其他人一起玩。

于 2012-12-04T05:14:31.607 回答
0

打开 NetLogo 并查看模型库的Shepherds演示(在文件菜单中找到它)。

您也可以在这里在线找到它。

于 2012-12-03T20:12:40.273 回答