我目前正在使用Netlogo3d对一些简单的boid进行建模,并且我在in cone和in radius函数方面遇到了问题。
(我正在重新实现Couzin、Krause、James、Ruxton和Franks的文章《动物群体中的集体记忆和空间排序》(
我使用我的boid周围的三个不同区域来定义它的行为:一个用于排斥,一个用于吸引,另一个用于定向。Thoses三是围绕boid的球体Thoses区域看起来像这样我正在像这样的区域检测海龟:
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) ]
如果可能的话,不在两个列表上循环,我会努力提高我的boids的效率非常感谢。
(附言:抱歉英语坏了(
您可以像在问题中所做的那样简单地计算三个代理集,然后从较大的代理集中删除较小的代理集,以获得差异代理集,这就是您所追求的,而不是找到对in-cone的修改,我认为这是高效的。
所以你应该这样做:
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代理集,下面应该为您提供不是B.成员
让DminusB D与[不是成员?self B]