赏金
这个问题提出了几个问题。赏金将用于从整体上解决它们的答案。
这是我一直在玩的一个问题。
注意我对不基于欧几里得空间的解决方案特别感兴趣。
有一组 Actor 形成了一个大小为 K 的人群。d(ActorA,ActorB)
对于任何两个 Actor 来说,距离很容易计算(解决方案应该适用于“距离”的各种定义),我们可以使用任何给定 Actor 找到 N 个最近邻居的集合许多已建立的算法中的任何一种。
这个邻居集在第一时刻是正确的,但是Actor 总是在移动,我想为每个 Actor 维护 N 个最近邻居的进化列表。我感兴趣的是比完美解决方案更有效的近似解决方案。
- 引入错误后,解决方案应该收敛到正确性。
- 如果错误变得太大,有时执行完全重新计算是可以接受的,但检测这些错误应该很便宜。
到目前为止,我一直在使用朋友的朋友算法:
recompute_nearest (Actor A)
{
Actor f_o_f [N*N];
for each Actor n in A.neighbours
append n to f_o_f if n != A and n not in f_o_f
Distance distances [N*N];
for 0 <= i < f_o_f.size
distances [i] = distance (A, f_o_f [i])
sort (f_o_f, distances)
A .neighbours = first N from f_o_f
}
当人群移动缓慢且 N 适当大时,这表现得相当好。它在小错误后收敛,满足第一个标准,但
- 我没有检测大错误的好方法,
- 我没有对错误的大小和频率进行定量描述,
- 它在实践中收敛,但我不能证明它总是会的。
你能帮助解决这些问题吗?
另外,您是否知道任何表现良好的替代方法
- 当人群快速移动时,
- 当一些演员快速移动时,
- 当 N 很小时,
- 当人群在某些地方稀疏而在其他地方密集时,
- 还是使用特定的空间索引算法?
我目前正在做的扩展是在邻居快速移动的情况下将朋友的朋友推广到朋友的朋友的朋友。我怀疑这不能很好地扩展,并且如果不对误差进行量化,就很难得出正确的参数。
我欢迎所有建议!这是一个有趣的小问题:-)
迄今为止值得注意的建议
Fexvez:随机采样额外邻居,采样大小取决于 Agent 的速度。从它即将进入的区域取样可能也会有所帮助。
当代理speed*delta_time
超过与最远已知邻居的距离时,对邻居重新采样。
维护Delaunay 三角剖分,它是最近邻图的超集。只考虑一个最近的邻居。
David Mount 的ANN 库 似乎无法处理移动物体。