最短路径的启发式函数

时间:2014-04-06 18:29:27

标签: algorithm shortest-path heuristics

我想找到成本最低的最短路径(两个红色圆圈之间)(方块中的数字是每个步骤的成本)。

在下面的图片中使用 A * 方法可以解决问题但是我不知道有希望的启发式功能。任何人都可以给我一个很好的启发式功能吗?

Table with different costs for each step

2 个答案:

答案 0 :(得分:3)

由于那里有0,并且你没有说明对分布的任何限制,可能会有任意数量的0,因此从任何给定点到达目标的成本可能是0,因此,对于admissible heuristic,如果不环顾四周,您只能使用h(x) = 0 Dijkstra's algorithm

稍微更好,但仍然不是很好,启发式只是采取最小的周围细胞。

我能想到的任何其他事情要么花费太长时间才能有用,要么无法保证达到目标。

你也可以考虑同时从这两个点运行Dijkstra算法,你只需要在你停止时聪明一点。


如果您要在同一网格上运行多个最短路径计算,您可以考虑预处理网格以确定由n个节点组成的最低成本路径,然后在您的启发式中使用此路径像Manhattan distance这样的东西。

对于您的示例,如果n = 3,那可能是2-3-9,因为2+3+9 = 14是我可以看到的3个相邻节点的最低总和。

然后您可以将其除以3(n)以获得单次移动的成本,并计算到目标的曼哈顿距离(假设只有左,右,上和下移动,否则计算将稍微复杂一点),减去2n-1),然后乘以单个移动的成本作为启发式。

我们需要除以n-1,因为如果到达目标的距离为n-1,那么到达目标的费用可能会低于计算的费用 - 请考虑上面的2-3-9示例 - 如果剩余路径为2-3,则我们的每次移动费用低于14/3,因此我们需要忽略n-1距离。

对于您的网格,起点的启发式将是:

h(x) = cost for single move * (change in x + change in y - (n-1))
     = 14/3 * (7 + 14 - 2)
     = 88.7

答案 1 :(得分:3)

如果起始点的位置是(x,y)并且终点的位置是(i,j),那么简单的启发式函数可以是((x-i)^ 2 +( y - j)^ 2)^(1/2)。基本上它的毕达哥拉斯定理,你只是跟踪到终点的近似距离,所以移动到另一侧将花费你更多,所以A *将首先检查更接近终点的点。