开放最短路径优先协议(ospf)路径选择算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
译者:张长富出版社:清华大学出版社
TCP/IP协议详解(三卷本)(W.Richard Stevens).
工作计划:(1)2010.6.7 –9分析课程题目设计要求,构建模型,划分子模块进行分工合作;
(2)2010.6.10 – 13根据设计要求和模块写出各部分相应的程序代码;
(3)2010.6.14 –15组合并调试程序,得到相应的实验结果;
final[v0]=TRUE;
for( j=0 ; j<i ; ++j )
{
min=MaxNum;
for( w=0 ; w<i ; w++)
{
if( !final[w] )//判断是否已被最短路径路过
Dijkstra算法的基本思路是:假设每个点都有一对标号(dj, pj),其中dj是从起源点s到点j的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);pj则是从s到j的最短路径中j点的前一点。求解从起源点s到点j的最短路径算法的基本过程如下:
(1)初始化。起源点设置为:ds=0, ps为空;所有其他点: di=∞, pi=?;标记起源点s,记k=s,其他所有点设为未标记的。
(3)调试、运行程序进而得到正确的结果;
(4)根据实验设计运行过程,写出实验论文并总结实验教训。
参考文献阅读:
数据结构程序设计(苏仕华等,机械工业出版社);
数据结构(吴伟民等c语言版,清华大学出版社);
C++程序设计导学(李春葆等清华大学出版社);
TCP/IP协议原理与应用(第3版)查普尔(Laura A.Chappell) (美国)蒂特尔(Ed Title)
(2)检验从所有已标记的点k到其直接连接的未标记的点j的距离,并设置lkj是从点k到j的直接连接距离。
(3)选取下一个点。从所有未标记的结点中,选取dj中最小的一个i:di=min[dj,所有未标记的点j]点i就被选为最短路径中的一点,并设为已标记的。
(4)找到点i的前一点。从已标记的点中找到直接连接到点i的点j*,作为前一点,设置:i=j*
专业、年级、班
08网络工程一班
设计要求:实现以下几个功能
1、实现图的建立;
2、用邻接矩阵存储图的信息;
3、用不同的算法实现在已建图中最短路径的选择;
4、输出最短路径的权值和相应的路径。
学生应完成的工作:
(1)根据课程设计要求,分析思路并构建模型,划分子模块、完善其功能;
(2)根据各模块的功能设计并编写程序段、连接各程序段使之形成一个有机的整体;
(1)、实现图的建立;
(2)、用邻接矩阵存储图的信息;
(3)、用不同的算法实现在已建图中最短路径的选择
(4)、输出最短路径的权值和相应的路径。
1.3运行环境
该程序的运行环境为Windows XP系统,Microsoft Visual C++6.0版本。
2.设计方案
2.1最短路径算法的分类
所谓最短路径(shortest path)问题指的是:如果从图中某顶点出发(此点称为源点),经图的边到达另一顶点(称为终点)的路径不止一条,如何找到一条路径使沿此路径上各边的权值之和为最小。设一有向网络G =(V,E),已知各边的权值,并设每边的权均大于零,以某指定V0为源点,求从V0到图的其余各点的最短路径。用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:
(3).”main.cpp”模块
此模块主要实现邻接矩阵的创建,从输入的图中提取信息并将其存储到创建的邻接矩阵中,并在此模块中用main()函数控制程序的运行及相关函数的调用。
3.2算法核心代码实现
3.2.1Dijkstra算法的实现
从上面可以看出,在按标记法实现Dijkstra算法的过程中,核心步骤就是从未标记的点中选择一个权值最小的弧段。这是一个循环比较的过程,如果不采用任何技巧,未标记点将以无序的形式存放在一个链表或数组中。那么要选择一个权值最小的弧段就必须把所有的点都扫描一遍,在大数据量的情况下,这无疑是一个制约计算速度的瓶颈。要解决这个问题,最有效的做法就是将这些要扫描的点按其所在边的权值进行顺序排列,这样每循环一次即可取到符合条件的点,可大大提高算法的执行效率。另外,GIS中的数据(如道路、管网、线路等)要进行最短路径的计算,就必须首先将其按结点和边的关系抽象为图的结构,这在GIS中称为构建网络的拓扑关系(由于这里的计算与面无关,所以拓扑关系中只记录了线与结点的关系而无线与面的关系,是不完备的拓扑关系)。如果用一个矩阵来表示这个网络,不但所需空间巨大,而且效率会很低。下面主要就如何用一个简洁高效的结构表示网的拓扑关系以及快速搜索技术的实现进行讨论。
(5)标记点i。如果所有点已标记,则算法完全推出,否则记k=i,转到2)再继续。
具体流程图如图1所示
图1 Dijkstra算法流程图
3.方案实施
3.1实验程序的整体框架
本次实验的具体结构框架安排如下:
(1)“Dijkstra.h”模块
此模块功能是实现Dijksta算法选择最短路径,用函数void ShortestPath_DIJ( Node a ,Status i ,Status v0 ,Status *D ,Status *pre )计算图a中所有顶点的最短路径,另外并用函数void Show(Status *D , Status *pre ,int i ,int v0)显示最短路径长度及相应的最短路径。
(2).”Floyd.h”模块
此模块的主要功能是实现Floyd算法选择最短路径,用函数void floyd1(Node g, int num,path &p,dist d)计算图g中所有顶点的最短路径,另外并用函数void output_pd(Node g,int num,path p,dist d)显示最短路径长度及相应的最短路径。
根据所学数据结构基础知识,使用迪杰斯特拉(Dijkstra)算法,编写一C程序,它能根据读入得带权有向图G的数据,构造并输出图G的顶点Vi到其它每个顶点的最短路径及长度,并输出其最短路径。并附有弗洛伊德(Floyd)算法和迪杰斯特拉(Dijkstra)算法相比较,两算法有何不同?
设计具体要求:实现以下几个功能:
关键词:
C语言最短路径优先协议(ospf)迪杰斯特拉(Dijkstra)
弗洛伊德(Floyd)最短路径算法图邻接矩阵最短路径长度权值(cost)
1.课程设计背景
1.1课程设计目的
本次课程设计我门要在VC++环境的最短路径,常用得有Dijkstra算法和Floyd算法等,这次主要应用Dijkstra算法并附有Floyd算法加以比较完成课程设计。Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如通信有原理,图论,运筹学等等。
(1)Dijkstra算法
(2)A*算法
(3)SPFA算法
(4)Bellman-Ford算法
(5)Floyd-Warshall算法
(6)Johnson算法
2.2Dijkstra算法的基本原理
Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻发现的。算法解决的是有向图中最短路径问题。举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离。Dijkstra算法可以用来找到两个城市之间的最短路径。这个算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。初始时,源点s的路径长度值被赋为0(d[s]=0),同时把所有其他顶点的路径长度设为无穷大,ห้องสมุดไป่ตู้表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。
if(D[v]<10000)//找到头结点
pre[v]=v0;
}
for(v=0;v<i;v++)
{
if( a[v0][v]>=10000 )
l++;
}
if(l>i)
{
printf("\n从路由%d出发没有最短路径到其他端点!\n",v0+1);
exit(0);
}//v0是一个孤立的顶点
D[v0]=0;
(4)2010.6.16 -19根据设计过程写出实验论文并总结
任务下达日期:2010年6月5日
任务完成日期:2010年6月5日
指导教师(签名):学生(签名):
开放最短路径优先协议(ospf)路径
选择算法—Dijkstra
摘要:
OSPF采用SPF(Shortest Path First)算法(也叫做Dijkstra算法),SPF算法是链路状态型算法,链路状态型算法对自己以及其它路由器产生的链路状态信息进行汇总,在本地生成一个链路状态数据库,来对此数据库进行运算,从而得到一张以自己为根的、到达其它各目的节点最近的一张路径图,根据算法和协议特点,这张图是无环路的。
本次课程设计是模拟最短路径优先协议(ospf)路径选择算法,使用邻接矩阵存储图的有关信息,用迪杰斯特拉(Dijkstra)算法得出最短路径,并附有弗洛伊德(Floyd)算法加以比较。另为了更好的对Dijkstra算法和Floyd算法有更好的理解在对其又做了改进-----使其能生成多源结点到多结点的最短路径及相应的最短路径的权值。
通过本次通过这次课程设计,我们要对上课所学得知识进行巩固,掌握图、子图、结点的度数、有向图、无向图、多重图、完全图、补图、生成子图、图的同构、路、回路、连通图、弱连通、强连通等概念及其性质;掌握图的矩阵表示,给定图的邻接矩阵会求任一结点的入度、出度和度数;一个结点到另一个结点长度为k的路径的条数;该图的可达性矩阵。
网络在数学和计算机领域中被抽象为图,所以其基础是图的存储表示。一般而言,无向图可以用邻接矩阵和邻接多重表来表示,而有向图则可以用邻接表和十字链表示。
图1带权有向图
具体的实现代码如下:
void ShortestPath_DIJ( Node a ,Status i ,Status v0 ,Status *D ,Status *pre )//a是传进的矩阵,i是结点数,v0是最短路径的源结点
{
int v,w,j,l=1;
Status *final;//设置int指针
Status min;
final=(Status *)malloc( sizeof(Status)*i );//分配空间
for(v=0;v<i;v++)//初始化
{
final[v]=FALSE;
pre[v]=FALSE;
D[v]=a[v0][v];
Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路径。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过组织因而当d[u]达到它最终的值的时候每条边(u,v)都只被拓展一次。算法维护两个顶点集S和Q。集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。集合S初始状态为空,而后每一步都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d[u]值的顶点。当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进行拓展。
对最小生成树、最短路径、Dijkstra算法,最短路由有了更深得理解。本次课程实验,要了解最短得路由得算法,掌握Dijkstra算法,Floyd-Warshall算法等算法得概念,基本原理和思想。加深对数据结构这门课程的理解,并且在VC++环境下进行运行,得到输出结果图,并对图进行结果与分析。
1.2课程设计要求
课程设计说明书
课程名称:数据结构
设计题目:开放最短路径优先协议(ospf)路径选择算法
院系:计算机科学与信息工程系
*******
学号:************
专业班级:网络一班
*******
2010年6月19日
课程设计任务书
设计题目
开放最短路径优先协议(ospf)路径选择算法
学生姓名
王振锋
所在院系
计算机科学与信息工程系
相关文档
最新文档