




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最优化理论与方法课程设计班 级: 信息与计算科学专业1102班 学 号: 1108060214 姓 名: 朱晓东 设计日期: 2013.7.5 西安科技大学计算机学院摘 要在实际生活当中,我们需要知道从一个城市到达另一个城市的最短路径,在旅行时可以减少在路途中的时间。路由器的路由表的更新也需要知道两个路由之间的最短距离。很多的关于两点之间的最短路径问题都可以抽象为求最短路径的数学模型。Dijkstra算法和Floyd算法是在求解最短路径问题上的最有效的算法。Dijkstra算法主要应用在求某一顶点到其余各顶点的最短路径。Floyd算法主要应用在求任意一对顶点的最短路径。本论文利用C语言实现了Dijkstra算法和Floyd算法。实际生活中的场景均可抽象成为一个有向图。程序通过实现创建有向图,以有向图作为载体实现对实际问题的求解。关键字:最短路径,数学模型,Dijkstra算法,Floyd算法,有向图Dijkstra算法和Floyd算法的实现1、 算法思想Dijkstra算法引进一个辅助向量D,它的每个分量D表示当前所找到的从始点v到每个终点vi的最短路径的长度。如D3=2表示从始点v到终点3的路径相对最小长度为2。这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于最短路径长度。它的初始状态为:若从v到vi有弧,则D为弧上的权值;否则置D为。显然,长度为 Dj=MinD | viV 的路径就是从v出发的长度最短的一条最短路径。此路径为(v,vj)。 那么,下一条长度次短的最短路径是哪一条呢?假设该次短路径的终点是vk,则可想而知,这条路径或者是(v,vk),或者是(v,vj,vk)。它的长度或者是从v到vk的弧上的权值,或者是Dj和从vj到vk的弧上的权值之和。 一般情况下,假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。因此,下一条长度次短的最短路径的长度必是Dj=MinD | viV-S 其中,D或者是弧(v,vi)上的权值,或者是Dk(vkS)和弧(vk,vi)上的权值之和。Dijstra算法描述如下: 1)arcs表示弧上的权值。若不存在,则置arcs为。S为已找到从v出发的最短路径的终点的集合,初始状态为空集。那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=arcsLocate Vex(G,v),i viV 2)选择vj,使得Dj=MinD | viV-S 3)修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。Floyd算法是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。从图的带权邻接矩阵A=a(i,j) nn开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。采用的是(松弛技术),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n3);其状态转移方程如下:shortij=minshortik+shortkj,shortij;其中shortij表示i到j的最短距离。2、 流程步骤Dijkstra算法流程:(1) g为用邻接矩阵表示的带权图;S集合为已找到的从v0出发的最短路径终点集合,他的初始态为v0;disti=g.arcs0i.(2) 选择vk,使得distk=mindisti|viV-S。其中,vk就是当前求得一条从v0出发的最短路径的终点。令S=Svk。(3) 修改从v0出发到集合V-S上任一顶点vi可达的最短路径长度。如果distk+g.distkidisti,则将disti修改为:distk+g.arcski.(4) 重复(2)、(3)步n-1次,即可求得最短路径长度的递增长度的递增顺序,逐个求出v0到图中其他每个顶点的最短路径。Floyd算法流程:将vi、vj的最短的路径长度初始化为g.arcsij,然后进行如何n次比较和修正:(1) 在vi、vj间加入顶点v0,比较(vi,v0,vj)和(vi,vj)的路径长度,取其中比较短的路径作为vi到vj的且顶点号不大于0的最短路径。(2) 在vi到vj间加入顶点v1,得(vi,.,v1)和(v1,.,vj)。其中,(vi,.,v1)是vi到v1的且中间顶点号不大于0的最短路径;(v1,.,vj)是v1到vj的且中间顶点号不大于0的最短路径,着两条路径在上一步中已求得。将(vi,.,v1,.,vj)与上一步已求得的且vi到vj中间顶点号不大于0的最短路径比较,取其中较短的路径作为vi到vj的且中间顶点号不大于1的最短路径。(3) 在vi、vj间加入顶点v2,得(vi,.,v2)和(v2,.,vj)。其中,(vi,.,v2)是vi到v2的且中间顶点号不大于1的最短路径;(v2,.,vj)是v2到vj的且中间顶点号不大于1的最短路径,着两条路径在上一步中已求得。将(vi,.,v2,.,vj)与上一步已求得的且vi到vj中间顶点号不大于1的最短路径比较,取其中较短的路径作为vi到vj的且中间顶点号不大于2的最短路径。以此类推,经过n次比较和修正,在第(n-1)步将求得vi到vj的且中间顶点号不大于n-1的最短路径,这必是vi到vj的最短路径。按此方法可求得各对顶点间的最短路径。三、源程序/创建有向图#include #include typedef char VertexType;#define MAXNODE 100/定义最大的顶点的个数#define INIFITY 1000/权值无穷大int distMAXNODE; / 表示当前点到源点的最短路径长度int prevMAXNODE;/表示当前节点的紧前节点int pathMAXNODEMAXNODE;/表示i到j的路径int shortDistanceMAXNODEMAXNODE;/表示i到j的最短路径长度typedef structVertexType vertexMAXNODE;int arcsMAXNODEMAXNODE;int vernum,arcnum;Graph;/图的结构体void initGraph(Graph* g)int i,j;printf(请输入顶点的个数:);scanf(%d,&g-vernum);/得到顶点的个数for (i = 0;ivernum;+i)g-vertexi = (char)(65+i);for (i = 0;ivernum;+i)for(j = 0;jvernum;+j)g-arcsij = INIFITY;/初始化 每两个点之间都是无穷大for (i = 0;ivernum;+i)g-arcsii = 0;/对角线上的权值为0int locateVertex(Graph g,VertexType vertex)/查找点的位置int i;for (i = 0;iarcnum);fflush(stdin);for (int i = 0;iarcnum;+i)printf(请输入两点和两点的权值:);scanf(%c %c %d,&ver1,&ver2,&weigt);fflush(stdin);a = locateVertex(*g,ver1);b = locateVertex(*g,ver2);g-arcsab = weigt;/g-arcsba = weigt;void Dijkstra(int n, int v, int *dist, int *prev, int cMAXNODEMAXNODE)int sMAXNODE; / 判断是否已存入该点到S集合中for(int i=0; in; +i)disti = cvi;si = 0; / 初始都未用过该点if(disti = INIFITY)previ = 0;elseprevi = v;distv = 0;sv = 1;/ 依次将未放入S集合的结点中,取dist最小值的结点,放入结合S中/ 一旦S包含了所有V中顶点,dist就记录从源点到所有其他顶点之间的最短路径长度/ 注意是从第二个节点开始,第一个为源点for(i=1; in; +i)int tmp = INIFITY;int u = v;/ 找出当前未使用的点j的distj最小值for(int j=0; jn; +j)if(!sj) & distjtmp)u = j; / u保存当前邻接点中距离最小的点的号码tmp = distj;su = 1; / 表示u点已存入S集合中/ 更新distfor(j=0; jn; +j)if(!sj) & cujINIFITY)int newdist = distu + cuj;if(newdist =0; -i)if(i != 0)printf(%c-,g.vertexquei);elseprintf(%cn,g.vertexquei);void DijkstraPath(Graph g)VertexType ch;int flag = 1;while (flag)printf(请输入终点(以#字符结束,并显示所有的两点之间的最短路径):);fflush(stdin);scanf(%c,&ch);if(ch = #)printf(n);return;/searchPath(prev,0,locateVertex(g,ch),g);if (distlocateVertex(g,ch) = INIFITY)printf(不能到达%c点n,ch);elsesearchPath(prev,0,locateVertex(g,ch),g);printf(最短路长为%dn,distlocateVertex(g,ch);void Floyd(Graph g)int i,j,k;for(i = 0;ig.vernum;i+)for (j = 0;jg.vernum;j+)/初始化路径if (g.arcsijINIFITY)pathij = j;/i的后继节点为jelsepathij = -1;shortDistanceij = g.arcsij;for(k = 0;kg.vernum;k+)for(i = 0;ig.vernum;i+)for(j = 0;jshortDistanceik+shortDistancekj)/插入0、1、2、.n-1点shortDistanceij=shortDistanceik+shortDistancekj;pathij = pathik;for(i=0;ig.vernum;i+)/输出每对顶点间最短路径长度及最短路径for(j=0;j%c,g.vertexk);/输出kk=pathkj;/求路径上下一顶点序号printf(-%cn,g.vertexj);/输出路径终点序号void main()Graph g;initGraph(&g);createGraph(&g);Dijkstra(g.vernum,0,dist,prev,g.arcs);DijkstraPath(g);Floyd(g);4、 算例和结果本演示程序用vc6.0编写,在console下完成Dijkstra算法和Floyd算法的演示。(1)输入的形式和输入值的范围:以整数的形式输入点边的个数,以整数的形式输入边的权值。以大写字母输入顶点。(2)输出的形式:两点之间最短路径和最短长度。(3)程序所能达到的功能:完成Dijkstra算法和Floyd算法的演示。(4)测试数据:输入边数:4输入顶点数:4输入两顶点和两顶点边的权值:A B 3 输入两顶点和两顶点边的权值:B D 8 输入两顶点和两顶点边的权值:D C 6 输入两顶点和两顶点边的权值:C A 4输入的格式如下:下面演示以A为起点,到任意一点的距离:下面通过Floyd算法实现任意两点之间的最短路径:5、 总结Dijkstra算法和Floyd算法在离散数学和数据结构中均有涉及,在最优化理论中,这两种算法都属于动态规划中的内容。动态规划的算法思想是解决多阶段决策过程最优化问题的一种方法。将复杂的问题分解成相互关联的若干阶段,每个阶段都是一个最优化子问题。在做这个程序的时候,遇到的最大的困难便是如何将这种动态的思想转化成程序。在动态规划的过程中,动态转移方程是非常关键的一个步骤,在程序中,是整个算法的集中体现。还有在程序中记录经过的顶点的位置,需要用到栈这个数据结构。程序的实现用到了很多的数据结构方面的问题,尤其是图论中的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园中班教案《咏柳》
- 2026届西藏自治区日喀则市南木林高中高二化学第一学期期中监测试题含解析
- 高端人才选拔门户:空乘面试题库精 编
- 警校面试实战模拟题:职业素养与能力提升
- 剖腹产术后药水护理规范
- 系统式家庭治疗
- 小学生学科讲解
- 伤口医院感染防控与管理
- 相机工作原理与使用技巧
- 如何构建与维护高效团队
- 读书分享读书交流会《人生海海》
- GA/T 1359-2018信息安全技术信息资产安全管理产品安全技术要求
- 荨麻疹的临床表现及护理课件
- 急性肾盂肾炎教学查房课件
- 微小灶外卖订餐系统
- 玻璃边部应力对切割的影响及解决方法
- 感染性休克的护理查房
- 市政道路雨污水管道工程施工技术
- 田径校本教材--
- 中国特色社会主义生态文明建设讲稿
- 机电安装施工界面划分电气
评论
0/150
提交评论