路径规划算法之Djistra算法

本文转载自作者Ouyang_Lianjun的《最短路径问题---Dijkstra算法详解》一文。

附原文链接:https://blog.csdn.net/qq_35644234/article/details/60870719。

觉得作者写的很好就转载过来了,稍作了描述上的修改,是很实用的基础算法,需要牢牢掌握,再次感谢作者的原创。


问题:寻找最短路径(从图中的某个顶点出发到达另外一个顶点的所经过的边的”权重和“最小的一条路径称为最短路径)

特点:使用了广度优先搜索解决“赋权有向图或者无向图”的“单源最短路径问题”。

算法思路:

  • 声明数组dis:来保存源点到各个顶点的最短的距离大小。假设原点为s。
  • 声明数组T:如果已经找到从源点出发到该点的最短路径,则把该点保存在数组T中。
  • 假设原点为s。则原点s到原点s的路径权重设为 0 即dis[s] = 0。初始时,集合T只有顶点s。
  • 若对于顶点s存在能直接到达顶点m的边(s,m),则把dis[m]的大小设为W(s,m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。
  • 然后,从dis数组选择出最小值,则该最小值就是源点s到“该最小值对应的顶点”的最短路径的长度,并且把该点加入到T中,OK,此时完成一个顶点。
  • 接下来,我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比“从源点s直接到这个其他顶点”短,如果是,那么就更新这些顶点在dis数组中的值,即更新源点s到该顶点的最短路径长度。
  • 然后,又从dis中找出最小值,重复上述动作,直到T中包含了图的所有顶点,此时结束循环。

算法演示:求从顶点v1到其他各个顶点的最短路径长度

  • 路径规划算法之Djistra算法_第1张图片 
  • 首先第一步,声明一个dis数组,该数组初始化的值为: 路径规划算法之Djistra算法_第2张图片 。          同时,我们的顶点集T的初始化为:T={v1}
  • 算法最终目标是:求 v1顶点到其余各个顶点的最短路径。那就从离 v1 顶点最近的顶点找起,求v1到这个顶点的最短路径。
  • 从除dis[0]外的其他值中寻找最小值。发现dis[2]最小。
    • 检查dis[2]是否可以变为确定值:通过数组 dis 可知当前离v1顶点最近是 “v3顶点也就是2号顶点”。可以变为确定值。
    • 将V3加入到集合T中。
    • 考虑v3的出度是否会影响数组dis的值。
      • v3作为出度,发现有存在< v3,v4 >这一路径。
      • v1–v4的长度就是dis[3],值为无穷大,而v1–v3–v4的长度为:10+50=60,所以更新dis[3]的值。
        • 数组中02是确定的
  • 然后,我们又从除dis[2]和dis[0]外的其他值中寻找最小值(因为只有dis[2]和dis[0]是确定值),发现dis[4]的值最小。
    • 检查dis[4]是否可以变为确定值:v1到v5的最短距离就是dis[4]的值。
    • 于是,把v5加入到集合T中。
    • 考虑v5的出度是否会影响数组dis的值。
      • v5有两条出度:< v5,v4>和 < v5,v6>。
      • 发现,v1–v5–v4的长度为:50,而dis[3]的值为60,所以我们要更新dis[3]的值.
      • 发现,v1-v5-v6的长度为:90,而dis[5]的值为100,所以我们需要更新dis[5]的值。
      • 更新后的dis数组如下图。 
    • (数组中024是确定的,用绿色标出)
  • 然后,我们又从除dis[2],dis[4],dis[0]外的其他值中寻找最小值(因为只有dis[2],dis[4],dis[0]是确定值),发现dis[3]的值最小。
    • 检查dis[3]是否可以变为确定值:v1到v4的最短距离就是dis[3]的值。
    • 于是把v4加入到集合T当中。
    • 考虑v4的出度是否会影响数组dis的值。
      • v4有一条出度:< v4,v6>。
      • 发现:v1–v5–v4–v6的长度为:60,而dis[5]的值为90,所以我们要更新dis[5]的值。
      • 更新后的dis数组如下图。
  • 。。。。最后使用同样原理,分别确定了v6和v2的最短路径,最后dis的数组的值如下:
    • 路径规划算法之Djistra算法_第3张图片

 

你可能感兴趣的:(路径规划算法之Djistra算法)