- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北交计算机网络13281069编程实现路由算法讲述
编程实现路由算法
实验目的
运用各种编程语言实现基于Dijkstra 算法的路由软件。
实验意义
通过本实验,使学生能够对路由原理和路由算法有进一步的理解和掌握。
实验背景
Dijkstra 算法描述如下:
设:
c(i,j): 结点i 至结点j 之间链路的代价,若i,j 不直接相连,则为无穷大。
D(v): 当前从源结点至目的结点V 之间路由的代价。
p(v): 从源结点至目的结点V 之间路由中V 之前的结点
N: 已经知道最优路径的结点集合
1 Initialization:
2 N = {A}
3 for all nodes v
4 if v adjacent to A
5 then D(v) = c(A,v)
6 else D(v) = infty
7 Loop
8 find w not in N such that D(w) is a minimum
9 add w to N
10 update D(v) for all v adjacent to w and not in N:
11 D(v) = min( D(v), D(w) + c(w,v) )
12 /* new cost to v is either old cost to v or known
13 shortest path cost to w plus cost from w to v */
14 until all nodes in N
实验步骤
选择合适的编程语言编程实现基于 Dijkstra 算法的路由软件。
输入不同的网络拓扑和链路代价测试和验证自己的路由软件。
设计方法
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
本实验使用OPEN,CLOSE表方式来实现Dijkstra算法,其采用的是贪心法的算法策略,过程如下:
声明两个集合,open和close,open用于存储未遍历的节点,close用来存储已遍历的节点
初始阶段,从键盘输入节点、边、权值、初始节点等信息,使用MapBuilder类初始化数据源,用Node对象封装节点信息,包括名字和子节点,将初始节点放入close,其他所有节点放入open,并返回图的起始节点。
从open中选出距离最短的顶点k,并将顶点k加入到close中;同时,从open中移除顶点k。
更新open中各个顶点到起点的距离。之所以更新open中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离。
重复步骤(3)和(4),直至close包含所有子节点。
六、 类概览与描述
(1) Node类:用于封装节点信息,包括节点名name和子节点child两个属性。child表示和此结点相邻的结点以及两个结点之间的代价,主要功能函数为对两各私有属性的set和get函数。
(2) MapBuilder类:用于初始化数据源,返回图的起始节点。主要功能函数为:
public Node build(SetNode open, SetNode close, MapString, Node nodes)用于接收从键盘输入的节点个数,节点名称,边的条数,边的信息,起始点等信息,并将节点名,节点与其子节点之间的代价存入Node对象之中,将起始点存储到close变量中,其它节点存储到open变量中。
(3)Dijkstra类:实现核心功能, open属性用来存储尚未加入最短路径的节点,close属性存储已加入最短路径的节点,path属性用来封装各节点到起始节点的路径距离,pathInfo属性用来保存路径信息(起始点到各目标节点的最短路径上的路由器名称)。该类用于计算起始节点到所有其他节点的最短路径。主要功能函数有:
public void init() :初始化路径,调用MapBuilder类中的build函数,将初始节点放入close,其他节点放入open中,并且对于open中的每一个节点,将其到起始点的路径距离存入path变量中(若与起始点不相邻,则距离设置Integer.MAX_VALUE),路径信息存入pathInfo变量中。
public void computePath() :计算起始节点到所有其他节点的最短路径和路径信息。首先调用getShortestPath函数,获取到距离最近的子节点,存入close变量之中,然后更新open中各个顶点到起点的距离,递归调用computePath函数向外一层层递归,直至所有顶点被遍历。
private Node getShortestPath() :获得与当前结点最近的子结点, 并返回该节点
文档评论(0)