计算机网络课程实验4——编程实现路由算法(迪杰斯特拉算法)

实验目的: 运用各种编程语言实现基于 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是指每一轮迪杰斯特拉算法找到的当前最近点
第二行的是每一轮对应的路径长度
第三部分是初始点到每一个点的最短路径。

计算机网络课程实验4——编程实现路由算法(迪杰斯特拉算法)_第1张图片

你可能感兴趣的:(课程作业记录博客,算法,图论,python,计算机网络)