我使用Dijkstra
algorithm来查找地图上两个站点之间的最短路径。从一个站到另一个站的成本在每个链路上都是相同的。
然而,问题是Dijkstra
试图找到从源到所有站的最低成本路径。我希望在找到目的地的最低成本路径后停止搜索。
所以,我决定使用A*
algorithm。但在这种情况下,我无法想到一个好的启发式方法。我可以将什么作为启发式使用?
答案 0 :(得分:1)
如果你只是
希望搜索在到达目的地的最低成本路径后停止 已被发现
,Dijkstra的算法已经可以有效地做到这一点。一旦目标节点的状态从"灰色"更改,您就可以让算法返回。到#"最终"。引用wikipedia
如果我们只对顶点源之间的最短路径感兴趣 如果u = target,我们可以在第13行终止搜索。
1 function Dijkstra(Graph, source):
2 dist[source] := 0 // Distance from source to source
3 for each vertex v in Graph: // Initializations
4 if v ≠ source
5 dist[v] := infinity // Unknown distance function from source to v
6 previous[v] := undefined // Previous node in optimal path from source
7 end if
8 add v to Q // All nodes initially in Q
9 end for
10
11 while Q is not empty: // The main loop
12 u := vertex in Q with min dist[u] // Source node in first case
13 remove u from Q
14
15 for each neighbor v of u: // where v has not yet been removed from Q.
16 alt := dist[u] + length(u, v)
17 if alt < dist[v]: // A shorter path to v has been found
18 dist[v] := alt
19 previous[v] := u
20 end if
21 end for
22 end while
23 return dist[], previous[]
24 end function
A *解决了不同的方面,仅在您对目标节点的接近程度进行有意义的启发式估计时才有用。
另外,如果
从一个车站到另一个车站的费用是相同的 链路
,即。如果路径长度是从始发地到目的地的链接数,则最短路径将减少到depth first search。使用DFS算法可能更有效。
附加说明:
在Dijkstra的算法中,当从行u
中的优先级队列的顶部元素12
中提取节点时,其距离标签是固定的,并且它是不可能的找到比u
目前更小的距离标签。这就是为什么你可以在行13
中删除。您可以通过类似于数学归纳的技术证明这一点。如果从u
移除Q
之后的其他字词,则Dijkstra无法找到更短的路径。