python实现通信网络的dijkstra算法

通信与网络作业。。略坑啊。本来以为很简单,但是据说又要求写成神马网络传输的形式,平白无故增加了许多许多许多行。不过这样以来之后自己也能看懂了。。大概能。

具体内容是路由算法中的状态链路法,其实本质上对Dijkstra算法一点改进都没有。。贴代码留存。python版。目测是对的,如果是错的请告诉我。

 1 # coding=utf-8
 2 # 模拟网络通信路由表建立的Daoijkstra算法实现
 3 # Author bnkR.
 4 import random
 5 def d_gen(d_max, thr, INF):
 6     # 此函数用来生成一条随机长度的边,thr是无穷大的阈值
 7     d = random.randint(1, d_max)
 8     if d < thr:
 9         return d
10     else:
11         return INF
12 
13 # 通过LSP表返回邻居
14 def neighbor(lsp, INF):
15     return [ix for ix in range(len(lsp)) if lsp[ix] != INF and lsp[ix] != 0]
16 
17 # Dijkstra算法
18 def dijkstra(gram, vs, INF):
19     vNum = len(gram[0])
20     cfmTable = [vs] #证实表
21     cfmInfo = [(INF, INF) for ix in range(vNum)] #证实表信息(距离,下一跳)
22     cfmInfo[vs] = (0, vs)
23     testTable = neighbor(gram[vs], INF) #试探表
24     testInfo= [(gram[vs][ix], ix) for ix in range(vNum)] #试探表信息(距离,下一跳)
25     v_next = vs
26     while True:
27         lsp = gram[v_next]
28         #获取v_next的LSP包,现实中可以调用其他函数
29         for v in neighbor(lsp, INF):
30             #遍历v_next的所有邻居
31             if v not in cfmTable and v not in testTable:
32                 #如果此邻居不在证实表和试探表中,则加入试探表
33                 testTable.append(v)
34             if lsp[v] + cfmInfo[v_next][0] < testInfo[v][0]:
35                 #如果在试探表中,则比较它到源的距离是否比试探表中之前存的更小,是则替换
36                 testInfo[v] = (lsp[v] + cfmInfo[v_next][0], cfmInfo[v_next][1])
37         if not len(testTable):    #检查试探表是否非空
38             break
39         #找到试探表中的最小节点,将其加入证实表,并指定为下一个v_next
40         minCostNode = testInfo[testTable[0]]
41         vmin = testTable[0]
42         for v in testTable:
43             if testInfo[v][0] < minCostNode[0]:
44                 minCostNode = testInfo[v]
45                 vmin = v
46         cfmTable.append(vmin)
47         cfmInfo[vmin] = minCostNode
48         v_next = vmin
49         testTable = [v for v in testTable if v != v_next]
50     return (cfmTable, cfmInfo)
51 
52 # 主函数,图的生成,通过调整阈值来随机确定一些无法达到的边。
53 def main():
54     INF = 1000
55     vNum = 10
56     gram = [[d_gen(100, 10, INF) for col in range(vNum)] for row in range(vNum)]
57     # 对称化矩阵
58     for row in range(vNum):
59         gram[row][row] = 0
60         for col in range(row):
61             gram[row][col] = gram[col][row]
62     for row in range(vNum):
63         print gram[row]
64     print dijkstra(gram, 0, INF)
65     
66 if __name__ == "__main__":
67     main()

这个转载要注明出处啊!~

bnkR.

http://www.cnblogs.com/bnkr

posted @ 2012-06-04 20:02  蚌壳星人  阅读(788)  评论(0编辑  收藏  举报