1、算法简介
Dijkstra 是一种寻找最短路径的算法(如解决TSP问题等),TSP问题一般采用图来描述,图就是由节点和边组成的,边是用来描述节点之间的连接关系,比如节点1到节点2的边表示了由节点A到节点B所花费的代价,其代价为5(如下图),寻常情况下代价即是路径的长度。
Dijkstra算法即从起始节点开始逐步扩展,每一步都为一个节点找到最短路径,主要分为以下两步:
Step1:基于贪心思想,从未访问的节点选择距离最小的节点收录;
Step2:收录节点后遍历该节点的邻接节点,采用松弛的方法来更新到起点的距离;
Dijstra算法每一步都为一个节点找到最短路径,这样一步一步扩展,在需要为终点扩展时即找到了从起点到终点的最短路径。
2 求解示例
在路径规划中,还需要维护Open List和Close List两个列表,Open List中存放与起点已经存在路径的节点;Closed List中存放收录之后的节点,这些节点都是已经找到起点最短路径的节点。
对于上图由起点1开始寻找最短路径的过程可以表示如下(注:括号中表示当前点到起点的距离):
Step1 :
Open : 1(0)
Closed: 1(0) (加入Closed表后就需要将其从Open表里删除)
遍历已经收录节点的邻接节点:2(5)、6(20),将其加入Open表。
Step2:
Open : 2(5) 6(20)
Closed: 2(5)
Step3:
Open : 6(20) 5(-) 3(-) — 6(20) 5(5+22) 3(5+10)(“松弛”邻近节点)
Closed: 2(5)
Step4:
Open : 6(20) 5(27) 4(-) —6(20) 5(27) 4(15+8) (“松弛”邻近节点)
Closed: 2(5) 3(15)
Step5:
Open: 5(27) 4(23)
Closed: 2(5) 3(15) 6(20)
Step6:
Open: 5(27)
Closed: 2(5) 3(15) 6(20) 4(23)
Step7:
Open :
Closed: 2(5) 3(15) 6(20) 4(23) 5(27)
即找到了起始节点1到各个节点之间的最短路径。
3 Dijkstra算法伪代码
用伪代码表示更容易理解Dijkstra算法原理
###start###
while ture
if Open List为空
搜索失败,结束
else
取Open List中g(n)最小的节点,将节点加入Closed List中
if 节点为终点
找到路径,结束
else
遍历当前节点未在Closed List中的邻接节点
if 节点在Open List中
更新节点g(n)值
else
计算节点g(n)值,加入Open List中
end
end
end
4 小结
Dijkstra算法能保证找到一条最短路径,但显然其每次都要遍历图中所有节点,耗时长也是其最大的缺点,在实际应用中都是与其它启发式算法结合起来运用,如A*、D*等。(对算法的理解还存在不足之处,如有错误,还请指出┭┮﹏┭┮)