Soooo,我有一群海龟特工需要彼此“分享”/“接收”能量。这个想法很简单,在一群海龟中,你可以获得平均能量,并从那些超过平均值的那些移动到少于平均值的那些。
如果你带走了整组海龟,但由于海龟按地点分组,完全计算所有共享的唯一方法就是检查附近的每只海龟。然后你要求他们周围的所有海龟增加/减少他们的能量。以某种方式进行线性时间计算会更好,但我无法想出任何好方法。我考虑的一种可能性是提前预先计算整个距离矩阵,以便找到附近的海龟不需要调用“半径为X的海龟”。
我正在寻找可能减少处理时间的其他实现快捷方式,或者共享算法的其他想法。谢谢!
答案 0 :(得分:1)
我知道你想避免使用in-radius
,但实际上它对于小半径非常有效。因此,在不知道更多的情况下,我认为这将是获得所需效果的最简单方法:
ask turtles [
set energy mean [ energy ] of turtles in-radius d
]
这不是线性的,但是如果d
很小而且你的海龟数量少于千只,它就会很快。这是灵活的,因为你不必预先计算海龟群。它实际上平滑了空间的能量,而平衡了群体内的能量。请注意,这是非确定性的:每只乌龟的最终能量取决于海龟的运行顺序。这应该不是什么大问题,但如果是,你可以通过让每只乌龟计算出手段来解决问题。然后让每只乌龟都精力充沛。
或者,如果你有一个包含每个组的乌龟集列表,你可以这样做:
foreach groups [
let new-energy mean [ energy ] of ?
ask ? [ set energy new-energy ]
]
这是线性的,唯一的缺点是你必须明确地计算组(它们也需要是传递的:如果turtle a
和b
在同一组中并且turtle {{ 1}}和b
属于同一群组,c
和a
也必须位于同一群组中。我很乐意推荐计算组的策略,但我需要知道如何定义组。
最后,如果你有足够的海龟,以便补丁少于海龟,你可以这样做:
c
这是补丁数量加上海龟数量的线性关系。这很好,因为您不必明确定义组,并且容易定义能量的扩散速率。
答案 1 :(得分:0)
尝试将表面(或空间)划分为四叉树(http://en.wikipedia.org/wiki/Quadtree)。
每次乌龟移动时,您应该计算它所属的四叉树的哪些部分并将其添加到某种列表中。然后在搜索时只检查附近的节点。
通过这种方式,您将显着减少操作次数(从n ^ 2开始)