最短路径算法--A*算法实现

岁酱吖の 提交于 2019-11-27 15:48:54

定义

A*算法是最短路径算法中的一种启发式算法。

去看原文

算法介绍

A*算法是一个目标导向的算法。为什么这么说了,这是因为A*在Dijkstra算法的基础上利用了一个启发式函数,该函数被定义为某个节点到目标点的距离(欧式距离、曼哈顿距离等),可以表示为h(u,t),其中u是任意一个节点,t是目标点,所以A*算法的每个节点的优先值为f(u)=dist(s,u)+h(u,t)。这个启发式函数的作用就是能够让那些靠近目标点的节点先被访问到,从而驱动搜索方向朝目标点方向推进。就是这个小小的改进就可以让算法的效率有一定提升。

它的搜索空间是这样的:
在这里插入图片描述

算法原理

A*算法的基本步骤和Dijkstra算法是一样的,也需要一个优先队列,唯一不一样的便是这个启发值,当你把启发值设为0时,也就是Dijkstra算法。

算法实现

伪代码
这是松弛函数,红色框中便是加入了欧式距离启发值。
在这里插入图片描述

实验对比

测试部分比较了单向Dijkstra算法、双向Dijkstra算法以及A*算法的效率。随机从武汉路网中取了100对OD,分别记录每对OD最短路径计算的运行时间以及扩展节点数量。
在这里插入图片描述
在这里插入图片描述
从图中,我们可以很清楚的看到A*的运行时间还是要优于Dijkstra算法的,搜索空间A*算法也是比Dijkstra算法要小,但是A*算法运行效率略慢于双向Dijkstra算法。

更多精彩内容,请关注探索GIS的小蜗牛。如需源码,请后台留言。
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!