实验目的: 运用各种编程语言实现基于 Dijkstra 算法的路由软件。
实验意义: 通过本实验,使学生能够对路由原理和路由算法有进一步的理解和掌握。
实验步骤: 1, 选择合适的编程语言编程实现基于 Dijkstra 算法的路由软件。 输入不同的网络拓扑和链路代价测试和验证自己的路由软件。
实验代码部分如下(python):
def generate_matrix():
M = 1E100
matrix = [[0, 2, 8],
[2, 0, 3],
[8, 3, 0]]
return matrix
def dijkstra(matrix, source):
M = 1E100
n = len(matrix)
m = len(matrix[0])
if source >= n or n != m:
print('Error!')
return
found = [source] # 已找到最短路径的节点
cost = [M] * n # source到已找到最短路径的节点的最短距离
cost[source] = 0
path = [[]]*n # source到其他节点的最短路径
path[source] = [source]
while len(found) < n: # 当已找到最短路径的节点小于n时
min_value = M+1
col = -1
row = -1
for f in found: # 以已找到最短路径的节点所在行为搜索对象
for i in [x for x in range(n) if x not in found]: # 只搜索没找出最短路径的列
if matrix[f][i] + cost[f] < min_value: # 找出最小值
min_value = matrix[f][i] + cost[f] # 在某行找到最小值要加上source到该行的最短路径
row = f # 记录所在行列
col = i
if col == -1 or row == -1: # 若没找出最小值且节点还未找完,说明图中存在不连通的节点
break
found.append(col) # 在found中添加已找到的节点
cost[col] = min_value # source到该节点的最短距离即为min_value
path[col] = path[row][:] # 复制source到已找到节点的上一节点的路径
path[col].append(col) # 再其后添加已找到节点即为sorcer到该节点的最短路径
return found, cost, path
def main():
matrix = generate_matrix()
found, cost, path = dijkstra(matrix, 0)
print('found:')
print(found)
print('cost:')
print(cost)
print('path:')
for p in path:
print(p)
if __name__ == '__main__':
main()
代码说明:
还是编译器的原因,sublime text不支持输入,所以我选择将图的关联矩阵输入到代码中,同时设置不相邻点之间路径长度为一个足够大的数。
初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为”起点s到该顶点的距离”。如果不相邻,则取做设定大数。
从U中选出”距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。
更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
重复步骤(2)和(3),直到遍历完所有顶点。
程序运行结果:
第一行的found是指每一轮迪杰斯特拉算法找到的当前最近点
第二行的是每一轮对应的路径长度
第三部分是初始点到每一个点的最短路径。