迪杰斯特拉(Dijkstra)算法描述与路径计算

1.迪杰斯特拉算法描述

迪杰斯特拉算法是基于LLDP(一种由IEEE802.1AB[11]定义的链路层发现协议)获取信息,是一个从顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。其中,算法描述如下:

  1. 将起始节点置于最短路径树的路径(顶点)中。如果是进行自律分散的路径计算,则将自身置于路径树中,如果是通过openflow控制器进行计算,则将关注的节点置于路径树中。
  2. 将与起始节点直接相连的所有节点作为未确定的路径置于最短路径树中。
  3. 从未确定的路径中,找出距离起始节点权值之和最小的路径。
  4. 将与已确定节点直接相连作为未确定的路径置于最短路径树中
  5. 计算与确定节点直接相连的节点的权值之和,并比较新加入最短路径树的节点的权值之和,删除权值之和较高、时间较长的路径。
  6. 重复3到5,直到未确定的路径变为0为止。

2.算法原理

下图1-1中有6个节点A-F,每个节点到相邻节点的权值已标记在图中,假设从A节点开始计算路径,则将A设为起始节点,即将A置于最短路径树的路径中,之后将A所连接的节点B和C作为未确定路径添加到最短路径中。

《迪杰斯特拉(Dijkstra)算法描述与路径计算》 图1-1.png

  • 迪杰斯特拉算法路径计算1
    因为从A到B的路径已经确定,则将B连接的节点作为未确定路径添加到最短路径树中,A到C的直接路径权值为200,A-B-C的权值之和为110,则比较后A-B-C路径较优,删去A-B的路径。

  • 迪杰斯特拉算法路径计算2
    由路径计算1可确定A到C节点的最优路径,接下来,将C节点所连接的节点作为未确定路径加入到路径树中,可知A-B-C-E的权值之和为120,A-B-E的路径权值之和为210,比较后删除B-E路径。对于未确定节点D,可知A-B-D为最短路径,进而确定B-D的路径,之后,将已确定的D节点上连接的F节点和E节点作为未确定路径进行添加。

  • 迪杰斯特拉算法路径计算3
    对于未确定路径节点E由A-B-E为最短路径,所以比较A-B-C-E与A-B-E,确定C-E为最短路径,之后将未确定节点F作为未确定路径进行添加比较A-B-C-E-F与A-B-D-F的权值之和,确定最短路径为E-F。最终,A对于所有节点的路径均已确定。

3.代码描述(Python)

def dijkstra_shortest_paths(graph,v0)
     vnum=graph.vertex_num()
     assert 0<=v0<vnum
     paths=[None]*vnum
     count=0
     cands=PrioQueue([0,v0,v0])
     while count<vnum and not cands.is_empty():
            plen,u,vmin=cands.dequeue()
            if paths[vmin]:
                  continue
            paths[vmin]=(u,plen)
            for v,w in graph.out_edges(vmin):
                  if not paths[v]:
                        cands.enqueue((plen+w,bmin,v))
            count+=1
      return paths
参考自数据结构与算法(Python语言描述)
    原文作者:墨痕hz
    原文地址: https://www.jianshu.com/p/764efe159d85
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞