针对多个目标的2D平铺贴图的寻路

时间:2015-03-03 19:17:32

标签: c++ path-finding

我正在尝试用C ++创建一个简单的基于网格的游戏。寻路是必要的一部分。我一直在寻找,但没有我正在寻找的东西。

规则很简单。有一张地图。尺寸通常不超过100 x 100个瓷砖。 1是地砖,0是墙。不允许对角线移动,因此每个网格只有4个方向。然而,大多数目标都不止一个。我想找到最近的路。请记住,我们不能只计算,哪一个距离公式最近。由于墙壁,较短距离的目标可以有更长的路程。我认为使用一种已知算法并重复,对于每个目标都不是一个好主意,因为它会变慢。

你有什么看法?我该怎么办?

4 个答案:

答案 0 :(得分:3)

这不是一个大问题。添加一个距离为1的假设终点节点E到所有实际目标,并搜索到E的最佳路径。路径上的一个但最后一个节点将是这些真实目标之一。

答案 1 :(得分:0)

正如其他人所说。考虑编码到图形,也许最好是为所有图块预先计算。我基本上会去Floyd-Warshall算法。 https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm

答案 2 :(得分:0)

A *是一种可用于在2D网格上进行寻路的算法。 Here's a good simple A* tutorial

虽然您可以多次运行该算法,但对于每个目标,另一种方法是使用算法" Dijkstra的算法",与A *不同,在每个方向均匀扩展,直到所有找到目标并选择效果最佳的目标。

答案 3 :(得分:0)

可能有助于解决此问题的一个小技巧:使用A *同时从所有目标搜索到开始,然后反转路径。它比计算每个步骤中每个目标的最小曼哈顿距离或向图表添加额外节点更简单。

由于A *通过OPEN列表维护了最低成本路径的候选列表,因此您只需将所有目标图块插入该打开列表即可。由于开放列表是优先级队列,A *将通过首先尝试启发式关闭目标并且只有在明确指出它们的路径时才切换到更远的目标,从而找到来自任何目标的最低成本路径成本更低。这为您提供了从最佳目标到起始位置的路径,然后您可以简单地反转以获得从开始到目标的路径。