好的,既然你让我发布答案……
在了解 A* 之前,您必须先了解Dijkstra 算法。给定一个图(一组节点和节点之间的边)和每条边的(正)“距离”(例如道路距离),Dijkstra 算法给出了某个源节点和每个目标节点之间的最短距离。例如,在您的图表中,节点可能是道路交叉口,边可能是道路,而您放在边上的权重/距离可能是该道路的长度,或者遍历它所需的时间,或者任何。
请理解:Dijkstra 的算法总是根据你放在边缘的权重给出正确的距离。事实上,图形甚至不需要嵌入到平面中,也就是说,首先可能没有“直线距离”的概念。它可以是任意图。
现在,可以将 A* 视为加速 Dijkstra 算法的特定启发式算法。您可以将其视为使用启发式方法来决定考虑图中节点的顺序。
形式上:你有一个图 G,其中有两个节点 s 和 t,你想找到 s 和 t 之间的距离 d(s,t)。(距离根据图表,例如根据您的示例中的道路距离。)要找到 d(s,t),在 A* 中,您使用满足 h(x) ≤ d(x) 的启发式函数 h(x) ,t)。例如(仅一种可能性),您可以选择 h(x) 作为从 x 到 t 的直线距离。h(x) 作为 d(x,t) 的估计值越好,A* 算法将运行得越快,但 h 的选择只影响速度,而不影响答案:它总是会根据下式给出最短距离d,不是 h。
所以要找到 s 到 t 的道路距离,只需将 d(u,v) 设置为每对节点 u 和 v 的道路距离,它们之间有一条道路,运行 A*,你会发现 d(s ,t) 你想要的。