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)<f(B),显然矛盾。因为若g(A)+d(A,B)<g(B),则f(A)<=g(A)+d(A,B)+h(B)<g(B)+h(B)=f(B)。
  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)<f(B)。
  6. A* 算法如何提高了效率? 它在保证了正确性的情况下,将到达gold顶点较近的点移到优先队列之前,使得尽可能快的找到结果。
  7. 常用的评估函数有:欧几里得距离、曼哈顿距离、切比雪夫距离
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值