1

我目前正在使用 Netlogo3d 对一些简单的 boid 进行建模,但我遇到了圆锥内和半径内功能的问题。

(我正在重新实现来自 Couzin、Krause、James、Ruxton 和 Franks 的文章“动物群中的集体记忆和空间排序”)

我在我的 boids 周围使用三个不同的区域来定义它的行为:一个用于排斥,一个用于吸引,一个用于定向。那些三个是围绕 boid 的球体 这些区域看起来像这样 我在这些区域检测到海龟,如下所示:

to find-flockmates-repulsion  ;; turtle procedure
  set flockmatesRepulsion other turtles in-cone (visionRepulsion * scale) fov
end
to find-flockmates-orientation  ;; turtle procedure
  set flockmatesOrientation other turtles in-cone ((visionOrientation + visionRepulsion) * scale) fov
end
to find-flockmates-attraction  ;; turtle procedure a modifier pour enlever les turtles dans le radius visionOrientation
  set flockmatesAttraction other turtles in-cone ((visionAttraction + visionOrientation + visionRepulsion) * scale) fov
end

但这三个领域是重叠的,我不希望它们重叠。

有没有办法减少锥内和半径内函数的选择,例如:

set flockmatesAttraction other turtles [ (in-cone ((visionAttraction + visionOrientation + visionRepulsion) * scale) fov) and not (in-cone ((visionOrientation + visionRepulsion) * scale) fov) ]

如果可能的话,不要在 2 个列表上使用循环,我正在努力让我的 boids 高效谢谢!

(PS:抱歉英文不好)

4

1 回答 1

1

您可以像在问题中所做的那样简单地计算您的三个代理集,然后从较大的代理集中删除较小的代理集以获得差异代理集,这就是您所追求的。

所以你会这样做:

to find-flockmates-repulsion  ;; turtle procedure
  set flockmatesRepulsion other turtles in-cone (visionRepulsion * scale) fov
end
to find-flockmates-orientation  ;; turtle procedure
  set flockmatesOrientation other turtles in-cone ((visionOrientation + visionRepulsion) * scale) fov
end
to find-flockmates-attraction  ;; turtle procedure a modifier pour enlever les turtles dans le radius visionOrientation
  set flockmatesAttraction other turtles in-cone ((visionAttraction + visionOrientation + visionRepulsion) * scale) fov
end

;; and then remove the overlap using the member? reporter
set flockmatesAttraction flockmatesAttraction with [not member? self flockmatesOrientation ]

顺便说一句,我使用了查尔斯发布的关于如何从另一个代理集中 删除一个代理集的答案(第一组中的代理也存在于第二组中),他说:

我想你想要的是会员?原始。如果 D 和 B 是代理集,则以下内容应为您提供 D 中不是 B 成员的成员。

让 DminusB D 与 [不是成员?自我B]

于 2019-11-02T20:21:46.497 回答