当您有多个源和多个目的地时,是否有比A *更好的寻路算法?

时间:2012-03-26 23:37:26

标签: java graph path-finding

我们有一个学校项目,我们有一个8x8游戏板上有碎片。目标是将任何一块放到相反后排的任何方格上。碎片只能向前移动,但向前移动(向前 - 向左,向前或向前 - 向右)。

我们能够将棋盘表示为有向无环图,并且根据游戏的各种规则,我们也能够在每个边缘设置权重。简而言之,我们正在寻找每一块作为可能的起源,到任何后排方格,以便找到从任何一块完成的阻力最小的路径。此外,在终点线附近会遇到大多数阻力。

然而,我们的计划花了很多时间做这件事。我们认为这是因为很多路径的重量非常相似,特别是考虑到任何可能的步骤将导致胜利(因为它只能向前移动并且所有后行方格都是目的地)。这块板上没有障碍物,只是重量较重的边缘,所以这给我们留下了许多开放的节点,这些节点看起来都很好。

我们的启发式功能非常简单:

movement_cost = # movement cost here #
def heuristic(node):
    return node.cost + node.distanceToFinish * movement_cost

其中node.cost是遍历边的权重之和,加上movement_cost乘以遍历边数。

是否有一种比A *更有效的算法来处理您有多个来源和多个目的地的情况?电路板永远不会超过8x8,因此也可能欢迎使用空间太多的算法。

编辑我们考虑过从完成到碎片的寻路,但这为启发式功能增加了很多复杂性,因为我们现在必须跟踪每一块而不仅仅是跟踪如何我们远离最后一行。

3 个答案:

答案 0 :(得分:2)

除非您对问题进行特定的次优化,否则A *完全适合您的目的。但是,您可以通过memoization段之间共享的路径来改进此解决方案,从而允许您计算到目标的每条路径的成本最少次数。

答案 1 :(得分:2)

事实证明,问题的大小使得“强力”方法最有效 - 也就是说,通过遍历整个网格计算每个源的每个节点的最短路径比使用A更快*。这可能是因为我们没有PriorityQueue产生的任何开销,并且比较可以变得更简单。

对于较大的尺寸,这可能不是一个好主意,因为这是O(n 2 )与网格的宽度。

答案 2 :(得分:-1)

Dijkstra's algorithm是一种寻路算法,用于查找从给定节点到图中每个其他节点的最低成本路径。您可能需要查看此内容,看看它是否对您的用例更有效。