在移动点的距离内的点

时间:2013-08-04 21:22:57

标签: algorithm python-3.x

我正在研究捕食者,猎物和食物的进化模拟(根据生物在死亡时释放的条件和肉类在地形上生长的植物)。 他们每个人都有一个(x,y)位置。

目前,每个生物都有一些对红色,绿色和蓝色通道敏感的“眼睛”,当一个生物或一块食物在他们的观察距离内时,眼睛会对他们的视线发送输入作出反应。神经网络,取决于他们所看到的物体的颜色,它的相对角度和它与生物的距离。

我现在正在做的是遍历所有植物,肉块和生物,并检查它们是否在生物的观察距离内。如果该条件为真,则计算网络的输入。

问题是,与观看距离的生物相比,世界是巨大的(大约10,000 * 10,000“单位”),通常在150到300“单位”之间。最重要的是,植物数量可以变得非常高,这取决于地形条件(也可以高达几千),以及所有其他生物和肉块。

所以,我通常最终会为每个生物执行一个大规模的循环,当大多数被检查的生物和食物完全不相关(太远)时,它会真正减慢模拟速度。

我要求的是一些方法或算法,可以减少每个循环中检查距离的点数,限制被检查点的距离,或其他一些技术。

PS:我想过将模拟分成各个“区域”,所以如果一个生物在一个区域内,它只会检查该特定区域中的其他点(食物和其他生物)。然而,由于它们不断移动,如果它们位于区域的边缘,它将使它们的视图非常不准确。 我还通过检查距离^ 2(不做sqrt)来略微提高速度,并且只有当它小于viewing_distance ^ 2时才计算它。

2 个答案:

答案 0 :(得分:1)

将区域划分为世界。如果区域宽度略大于最大观看距离,则只需要检查最多4个区域。

使用四叉树或kd树的缺点是需要不断更新结构。但它可能会更好,做一些分析。

答案 1 :(得分:0)

四叉树结构可用于几何表示: http://en.wikipedia.org/wiki/Quadtree

这完全取决于您需要多少效率。区域答案还有一个问题,即如果你的生物靠近区域的边界,你可能会最终扫描4个区域..