我想找到成本最低的最短路径(两个红色圆圈之间)(方块中的数字是每个步骤的成本)。
在下面的图片中使用 A * 方法可以解决问题但是我不知道有希望的启发式功能。任何人都可以给我一个很好的启发式功能吗?
答案 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
)以获得单次移动的成本,并计算到目标的曼哈顿距离(假设只有左,右,上和下移动,否则计算将稍微复杂一点),减去2
(n-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 *将首先检查更接近终点的点。