Introduction of A* Algorithm

参考:wiki A* search algorithm

  • 概述
    该算法用于查找图中源点到某一特定目标顶点的最短路径。
  • 算法理解
  1. 首先参考 Dijkstra每一次迭代从优先队列(剩下的顶点)中选择一个与源点距离最小的顶点加入到已计算完成的点集中,并根据该点的edges更新优先队列。
  2. 与A*算法相比,Dijkstra算法具有盲目性,即它计算源点到所有顶点的最短路径.
  3. A*算法中的重要公式:f(n)=g(n)+h(n)。g(n)为从源点到n的距离、h(n)为n到目标顶点的预测距离
  4. 在A*算法的优先队列中的排列依据是f(n)。而在Dijkstra中的排列依据是g(n)。与Dijkstra一样每一次迭代从优先队列(Open Set)中取出f(n)最小的顶点B,并加入Close Set,而这意味着B最短路径已计算出来了。这是为什么呢?需要满足什么条件呢? 对于预测函数h(n)需要满足的是h(x)<=d(x,y)+h(y)。而(x,y)为graph中的任意一条边。h(goal)=0,因此可知每一个顶点的预测h(n)都比实际的最短路径还要小。假设在B加入Close后存在点A经过B使得g(B)更小,则应该f(A)
  5. 所以A* 算法和Dijkstra算法相比到底有什么本质上的不同呢? 我们考虑到在dijkstra的优先队列的基础上增加h(n)会产生什么影响呢?首先我们需要知道在优先队列中A、B、C、D…中先取出A或B,其产生结果可能正确也可能错误,若B中最终最短路径中不包含A则没有影响,但算法并不能事先知道此事,所以只能按照优先队列中最小值取出。那么加入h(n)后会不会破化了这些特殊的A、B顺序(即B的最短路径经过A)?答案是不会的,我们需要证明若B最短路径经过A的情况下,分别加上h(A)和h(B)后仍然是A、B。在Dikstra下g(A)=a,g(B)=b,(A,B)=ab,则g(B)>=g(A)+ab,因为h(A)<=h(B)+ab,所以f(A)
  6. A* 算法如何提高了效率? 它在保证了正确性的情况下,将到达gold顶点较近的点移到优先队列之前,使得尽可能快的找到结果。
  7. 常用的评估函数有:欧几里得距离、曼哈顿距离、切比雪夫距离

你可能感兴趣的:(笔记)