没有合适的资源?快使用搜索试试~ 我知道了~
VC++环境下的最短路径算法
需积分: 10 24 下载量 95 浏览量
2009-09-23
15:18:36
上传
评论 1
收藏 147KB DOC 举报
温馨提示
试读
14页
1. 了解静态路由和动态路由的运行机制 2. 验证路由算法的功能和性能 3. 掌握路由算法工作过程 是一个比较完整的课程设计,大家可以直接下载下来用.程序可以运行,运行的结果图与程序是相呼应的
资源推荐
资源详情
资源评论
VC++环境下的最短路径算法
1、课程设计目的
1. 了解静态路由和动态路由的运行机制
2. 验证路由算法的功能和性能
3. 掌握路由算法工作过程
2、设计方案论证
2.1 课程设计原理及设计目标
路由算法在路由协议中起着至关重要的作用,采用何种算法往往决定了最
终的寻径结果,因此选择路由算法一定要仔细。通常需要综合考虑以下几个设
计目标:
(1)最优化:指路由算法选择最佳路径的能力。
(2)简洁性:算法设计简洁,利用最少的软件和开销,提供最有效的功能。
(3)坚固性:路由算法处于非正常或不可预料的环境时,如硬件故障、负载
过高或操作失误时,都能正确运行。由于路由器分布在网络联接点上,所以在
它们出故障时会产生严重后果。最好的路由器算法通常能经受时间的考验,并
在各种网络环境下被证实是可靠的。
(4)快速收敛:收敛是在最佳路径的判断上所有路由器达到一致的过程。当
某个网络事件引起路由可用或不可用时,路由器就发出更新信息。路由更新信
息遍及整个网络,引发重新计算最佳路径,最终达到所有路由器一致公认的最
佳路径。收敛慢的路由算法会造成路径循环或网络中断。
(5)灵活性:路由算法可以快速、准确地适应各种网络环境。例如,某个网
段发生故障,路由算法要能很快发现故障,并为使用该网段的所有路由选择另
一条最佳路径。
2.2 路由算法分类
路由算法按照种类可分为以下几种:静态和动态、单路和多路、平等和分
级、源路由和透明路由、域内和域间、链路状态和距离向量。前面几种的特点
与字面意思基本一致,下面着重介绍链路状态和距离向量算法。
链路状态算法(也称最短路径算法)发送路由信息到互联网上所有的结点,
然而对于每个路由器,仅发送它的路由表中描述了其自身链路状态的那一部分。
距离向量算法(也称为 Bellman-Ford 算法)则要求每个路由器发送其路由表
全部或部分信息,但仅发送到邻近结点上。从本质上来说,链路状态算法将少
量更新信息发送至网络各处,而距离向量算法发送大量更新信息至邻接路由器。
由于链路状态算法收敛更快,因此它在一定程度上比距离向量算法更不易
产生路由循环。但另一方面,链路状态算法要求比距离向量算法有更强的 CPU
能力和更多的内存空间,因此链路状态算法将会在实现时显得更昂贵一些。除
了这些区别,两种算法在大多数环境下都能很好地运行。
最后需要指出的是,路由算法使用了许多种不同的度量标准去决定最佳路
径。复杂的路由算法可能采用多种度量来选择路由,通过一定的加权运算,将
它们合并为单个的复合度量、再填入路由表中,作为寻径的标准。通常所使用
的度量有:路径长度、可靠性、时延、带宽、负载、通信成本等。
2.3 课程设计过程
2.3.1 前 k 条最短路径算法说明
(1)定义一个临时数组 A,当用户在画图时,按下鼠标左键,采集此时
鼠标的坐标,存储在临时数组中,当用户完成一条线时,必然以松开左键结束,
再次采集此时鼠标的坐标,也存储在临时数组中,如此重复,完成整个图的输
入。
(2)再定义一个 2 行 2 列的临时数组 B,以存储用户指定要求解的两个
顶点,因为左键已被使用,这时定义右键按下为选中某个要求解的顶点,并且
在该顶点上画一个较大的点以突出显示,如果用户没有指定点就按了按钮,弹
出一个 MESSAGE BOX 提示用户要先指定点,当用户指定了两个点后还要指
定,也弹出一个 MESSAGE BOX 提示用户已经选择了两个点。
(3)当准备完成后,用户按下了“开始求解”的按钮,于是程序先将 A 中的
相邻点提取出来,构成邻接链表,然后使用 Dijkstra 算法求得最短路径,最后
将所得最短路径标记出来。
由于在屏幕上接受用户输入各边的权值比较麻烦,所以本程序就以两顶点
之间的实际距离为边的权值,进行求解。这并不影响数据结构的课设意义。
(4)Dijkstra 最短路径算法
Dijkstra 算法对每个顶点做标记,令 L(v)表示顶点 v 的标记,在任何时候,
有些顶点具有临时标记,有些顶点具有永久标记。w(a,b)表示顶点 a,b 之间的
权值。令 T 代表具有临时标记的顶点的集合。在进行算法的过程中,将对具有
临时标记的顶点改为永久标记,如果 L(v)被标记为永久,则从指定起点到 v 的
最短路径就找到了。开始时,所有的顶点都具有临时标记,在每一次迭代过程
中,算法将一个顶点的标记从临时改为永久,这们,当终点得到一个永久标记
时,算法就结束了。
输入:一个(连通)在加权图,其中所有的权值为正,顶点 a,顶点 z;
输出:从 a 到 z 的最短路径;
Procedure Dijkstra (w ,a ,z ,L)
L(a)=0;
For 所有顶点 x!=a do
L(x)=无穷大(在程序中可具体指定)
T=所有顶点的集合
While(z 属于 T) do
Begin
从 T 中找出具有最小 L(v)的顶点 v
T=T-{v}
For 所有与 v 相邻的顶点,且属于 T 的顶点 x
L(x)=min{L(x),L(v)+w(v,x)}
记录前一个可以得到最小路径的顶点
End
End Dijkstra
2.3.2 前 k 条最短路径算法示例
下面以图 1 所示网络图为例,根据上述算法,分别求得其第 k 条最短路径,
求解过程中有向图的变化情况如图 1 所示,粗体路径表示当前状态下的最短路
径,不同类型的圈表示不同阶段生成的节点。
剩余13页未读,继续阅读
资源评论
超级网络军迷
- 粉丝: 2
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功