运用各种编程语言实现基于Dijkstra算法的路由软件
本次实验利用课后的作业题实现:
利用path.txt来实现图的各个边的三元组存储:
利用python中的networkk中的函数add_edge()来实现边的输入和图的构建:
- def init(G):
- data = []
- for line in open("path.txt","r"):
- data.append(line.strip('\n'))
- for row in data:
- row=row.split(',')
- G.add_edge(eval(row[0]), eval(row[1]), weight=eval(row[2]))
- return G
算法实现流程:
代码:
- import networkx as nx
- def init(G):
- data = []
- for line in open("path.txt","r"):
- data.append(line.strip('\n'))
- for row in data:
- row=row.split(',')
- G.add_edge(eval(row[0]), eval(row[1]), weight=eval(row[2]))
- return G
- def Dijkstra(G,start,end):
- RG = G.reverse()
- dist = {}
- previous = {}
- for v in RG.nodes():
- dist[v] = float('inf')
- previous[v] = 'none'
- dist[end] = 0
- u = end
- while u!=start:
- u = min(dist,key=dist.get)
- distu = dist[u]
- del dist[u]
- for u,v in RG.edges(u):
- if v in dist:
- alt = distu + RG[u][v]['weight']
- if alt < dist[v]:
- dist[v] = alt
- previous[v] = u
- path = [start]
- last= start
- while last != end:
- nxt = previous[last]
- path.append(nxt)
- last = nxt
- return path[::-1] # 反转路径
- if __name__=="__main__":
- G=nx.DiGraph()
- G=init(G)
- start_node = 1
- end_node = 7
- print("start:",start_node,"to end:",end_node)
- path=Dijkstra(G,start_node,end_node)
- answer=nx.dijkstra_path(G,source=start_node,target=end_node)
- print("dijkstra_path:")
- for i in range(len(answer)-1):
- print(str(answer[i])+'->',end="")
- print(answer[i+1])
起点1到终点7的最短路径:
手动计算的结果也与程序得出的结果相同,可见其正确性。
Dijkstra算法是非常经典的求最短路径的算法,在离散数学和数据结构中反复学习不是没有意义的,在路由算法中就用到了。但Dijkstra算法在路由算法中并不是最优解,因为可能会出现振荡。还有很多优化的算法。
本次实验中,对Dijkstra算法进行了编程复现,对算法有了更深入的理解。