程序员

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

2017-11-28  本文已影响282人  墨痕hz

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作为未确定路径添加到最短路径中。


图1-1.png

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语言描述)
上一篇 下一篇

猜你喜欢

热点阅读