用于在平铺地图上查找最近对象的算法

时间:2015-10-15 14:58:25

标签: c# algorithm path-finding closest

我有一个游戏地图,表示为平铺地图。目前,地图上存在两种与此问题相关的对象:可收集资源(树木,岩石等)和由玩家建造的建筑物。建筑物也通过道路连接。

我在找出可以执行以下操作的高效算法时遇到了问题:

  • 找到距离任何相关建筑物最近的资源(即找到离伐木工人/树木收集者最近的树)
  • 找到距离任何建筑物最近的相关建筑物(即找到距离任何锯木厂最近的仓库)

我将这两个问题分开了,因为第一个需要道路,但第二个应该 使用道路。

所以,这个结果应该是单个对象的单一路径,也就是我最接近的对象。然后,工人使用该路径收集资源并将其带回,或者说,从锯木厂中挑选资源并将其带到最近的存储区。

我知道如何获得最接近的路径(A *,Djikstra甚至是Floyd-Warshall),但是我不确定如何以最佳方式进行最佳路径并获得最佳/最接近的路径,尤其是它会定期运行,地图对象集合(道路和建筑物)预计也会定期更改。

我在Unity3D / c#中这样做,但我想这不是与Unity3D相关的问题。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

找到两个物体之间的地理距离是一种便宜(快速)的操作 - 你可以负担得起每场比赛的那么多次。如果该选项可用,请使用它。

通过利用诸如道路,轨道等地形特征来寻找最短路径是一项复杂得多的操作。正如您在帖子中已经提到的,A *搜索算法可能是您的最佳选择,但速度很慢。

但一般来说,你应该不需要经常运行 - 只需每X秒计算一次路径(对于X的某个值),并让你的工作人员花费接下来的几个游戏时间计算出的路径,直到你刷新"它。您拥有的精确度越高,对游戏环境变化的响应性越强(例如路径中出现的障碍物),您将使用的CPU时间就越多。

尝试不同的精度,并找到一个提供相当精确度但在CPU时间方面不太昂贵的精度。 (更新间隔完全取决于您预期要进行的呼叫次数。计算100名工作人员的路径显然比1更难。)