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()
这个转载要注明出处啊!~
http://www.cnblogs.com/bnkr