代理商与附近代理商共享能源的高效算法?

时间:2014-02-15 01:42:52

标签: algorithm netlogo

Soooo,我有一群海龟特工需要彼此“分享”/“接收”能量。这个想法很简单,在一群海龟中,你可以获得平均能量,并从那些超过平均值的那些移动到少于平均值的那些。

如果你带走了整组海龟,但由于海龟按地点分组,完全计算所有共享的唯一方法就是检查附近的每只海龟。然后你要求他们周围的所有海龟增加/减少他们的能量。以某种方式进行线性时间计算会更好,但我无法想出任何好方法。我考虑的一种可能性是提前预先计算整个距离矩阵,以便找到附近的海龟不需要调用“半径为X的海龟”。

我正在寻找可能减少处理时间的其他实现快捷方式,或者共享算法的其他想法。谢谢!

2 个答案:

答案 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 ab在同一组中并且turtle {{ 1}}和b属于同一群组,ca也必须位于同一群组中。我很乐意推荐计算组的策略,但我需要知道如何定义组。

最后,如果你有足够的海龟,以便补丁少于海龟,你可以这样做:

c

这是补丁数量加上海龟数量的线性关系。这很好,因为您不必明确定义组,并且容易定义能量的扩散速率。

答案 1 :(得分:0)

尝试将表面(或空间)划分为四叉树(http://en.wikipedia.org/wiki/Quadtree)。

每次乌龟移动时,您应该计算它所属的四叉树的哪些部分并将其添加到某种列表中。然后在搜索时只检查附近的节点。

通过这种方式,您将显着减少操作次数(从n ^ 2开始)