用于在地图上查找最短路径的启发式算法

时间:2014-07-13 03:22:50

标签: a-star heuristics

我使用Dijkstra algorithm来查找地图上两个站点之间的最短路径。从一个站到另一个站的成本在每个链路上都是相同的。

然而,问题是Dijkstra试图找到从源到所有站的最低成本路径。我希望在找到目的地的最低成本路径后停止搜索。

所以,我决定使用A* algorithm。但在这种情况下,我无法想到一个好的启发式方法。我可以将什么作为启发式使用?

1 个答案:

答案 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无法找到更短的路径。