ImageVerifierCode 换一换
格式:DOC , 页数:11 ,大小:178KB ,
资源ID:9434013      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9434013.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(最优化理论与方法 Dijsktra算法的实现.doc)为本站上传会员【s4****5z】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

最优化理论与方法 Dijsktra算法的实现.doc

1、 最优化理论与方法课程设计 班 级: 信息与计算科学专业1102班 学 号: 1108060214 姓 名: 朱晓东 设计日期: 2013.7.5 西安科技大学计算机学院 摘 要 在实际生活当中,我们需要知道从一个城市到达另一个城市的最短路径,在旅行时可以减少在路途中的时间。路由器的路由表的更新也需要知道两个路由之间的最短距离。很多的关于两点之间的最短路径问题都可以抽

2、象为求最短路径的数学模型。Dijkstra算法和Floyd算法是在求解最短路径问题上的最有效的算法。Dijkstra算法主要应用在求某一顶点到其余各顶点的最短路径。Floyd算法主要应用在求任意一对顶点的最短路径。本论文利用C语言实现了Dijkstra算法和Floyd算法。实际生活中的场景均可抽象成为一个有向图。程序通过实现创建有向图,以有向图作为载体实现对实际问题的求解。 关键字:最短路径,数学模型,Dijkstra算法,Floyd算法,有向图 Dijkstra算法

3、和Floyd算法的实现 一、 算法思想 Dijkstra算法引进一个辅助向量D,它的每个分量D表示当前所找到的从始点v到每个终点vi的最短路径的长度。如D[3]=2表示从始点v到终点3的路径相对最小长度为2。这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于最短路径长度。它的初始状态为:若从v到vi有弧,则D为弧上的权值;否则置D为∞。显然,长度为 D[j]=Min{D | vi∈V} 的路径就是从v出发的长度最短的一条最短路径。此路径为(v,vj)。 那么,下一条长度次短的最短路径是哪一条呢?假设该次短路径的终点是vk,则可想而知,这条路径或者是(v,

4、vk),或者是(v,vj,vk)。它的长度或者是从v到vk的弧上的权值,或者是D[j]和从vj到vk的弧上的权值之和。 一般情况下,假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。因此,下一条长度次短的最短路径的长度必是D[j]=Min{D | vi∈V-S} 其中,D或者是弧(v,vi)上的权值,或者是D[k](vk∈S)和弧(vk,vi)上的权值之和。Dijstra算法描述如下: 1)arcs表示弧上的权值。若不存在,则置arcs为∞。S为已找到从v出发的最短路径的终点的集合,初始状态为空集。

5、那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=arcs[Locate Vex(G,v),i] vi∈V 2)选择vj,使得D[j]=Min{D | vi∈V-S} 3)修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。 Floyd算法是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路

6、径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。采用的是(松弛技术),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);其状态转移方程如下: shorti][j]=min{short[i][k]+short[k][j],short[i][j]}; 其中short[i][j]表示i到j的最短距离。 二、 流程步骤 Dijkstra算法流程: (1) g为用邻接矩阵表示的带权图;S集合为已找到的从v0出发的最短路径终点集合,他的初始态为{v0};dist[i]=g.arcs[0][i].

7、 (2) 选择vk,使得dist[k]=min{dist[i]|vi∈V-S}。其中,vk就是当前求得一条从v0出发的最短路径的终点。令S=S∪{vk}。 (3) 修改从v0出发到集合V-S上任一顶点vi可达的最短路径长度。如果dist[k]+g.dist[k][i]

8、修正: (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) 在v

9、i、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的最短路径。按此方法可求得各对顶点间的最短路径。

10、 三、源程序 //创建有向图 #include #include typedef char VertexType; #define MAXNODE 100 //定义最大的顶点的个数 #define INIFITY 1000 //权值无穷大 int dist[MAXNODE]; // 表示当前点到源点的最短路径长度 int prev[MAXNODE]; //表示当前节点的紧前节点 int path[MAXNODE][MAXNODE]; //表示i到j的路径 int

11、shortDistance[MAXNODE][MAXNODE]; //表示i到j的最短路径长度 typedef struct { VertexType vertex[MAXNODE]; int arcs[MAXNODE][MAXNODE]; int vernum,arcnum; }Graph; //图的结构体 void initGraph(Graph* g) { int i,j; printf("请输入顶点的个数:"); scanf("%d",&g->vernum); //得到顶点的个数 for (i = 0;ive

12、rnum;++i) { g->vertex[i] = (char)(65+i); } for (i = 0;ivernum;++i) for(j = 0;jvernum;++j) g->arcs[i][j] = INIFITY; //初始化 每两个点之间都是无穷大 for (i = 0;ivernum;++i) g->arcs[i][i] = 0; //对角线上的权值为0 } int locateVertex(Graph g,VertexType vertex) //查找点的位置 { int i;

13、 for (i = 0;iarcnum); fflush(stdin); for (int i = 0;iarcnum;++i) {

14、 printf("请输入两点和两点的权值:"); scanf("%c %c %d",&ver1,&ver2,&weigt); fflush(stdin); a = locateVertex(*g,ver1); b = locateVertex(*g,ver2); g->arcs[a][b] = weigt; //g->arcs[b][a] = weigt; } } void Dijkstra(int n, int v, int *dist, int *prev, int c[MAXNODE][MAXNODE]) { int s[

15、MAXNODE]; // 判断是否已存入该点到S集合中 for(int i=0; i

16、// 注意是从第二个节点开始,第一个为源点 for(i=1; i

17、j=0; j

18、nt tot = 0; que[tot] = u; tot++; int tmp = prev[u]; while(tmp != v) { que[tot] = tmp; tot++; tmp = prev[tmp]; } que[tot] = v; for(int i=tot; i>=0; --i) if(i != 0) printf("%c->",g.vertex[que[i]]); else printf("%c\n",g.vertex[que[i]]); } void DijkstraPath(Gra

19、ph 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 (dist[locateVertex(g,ch)] == INIFITY) print

20、f("不能到达%c点\n",ch); else { searchPath(prev,0,locateVertex(g,ch),g); printf("最短路长为%d\n",dist[locateVertex(g,ch)]); } } } void Floyd(Graph g) { int i,j,k; for(i = 0;i

21、 //i的后继节点为j else path[i][j] = -1; shortDistance[i][j] = g.arcs[i][j]; } for(k = 0;kshortDistance[i][k]+shortDistance[k][j]) { //插入0、1、2、...n-1点 shortDistance[i][j

22、]=shortDistance[i][k]+shortDistance[k][j]; path[i][j] = path[i][k]; } for(i=0;i

23、取路径上i的后续k if(k==-1) //路径不存在 { printf("There is no path between %c and %c\n",g.vertex[i],g.vertex[j]); } else { printf("最短路径为:"); printf("%c",g.vertex[i]); //输出Vi while(k!=j){ //k不等于路径终点j时 printf("->%c",g.vertex[k]); //输出k k=path[k][j]; //求路

24、径上下一顶点序号 } printf("->%c\n",g.vertex[j]); //输出路径终点序号 } } } } void main() { Graph g; initGraph(&g); createGraph(&g); Dijkstra(g.vernum,0,dist,prev,g.arcs); DijkstraPath(g); Floyd(g); } 四、 算例和结果 本演示程序用vc6.0编写,在console下完成Dijkstra算法和Floyd算法的演示。 (1)输入的形式和输

25、入值的范围:以整数的形式输入点边的个数,以整数的形式输入边的权值。以大写字母输入顶点。 (2)输出的形式:两点之间最短路径和最短长度。 (3)程序所能达到的功能:完成Dijkstra算法和Floyd算法的演示。 (4)测试数据: 输入边数:4 ‚输入顶点数:4 ƒ输入两顶点和两顶点边的权值:A B 3 输入两顶点和两顶点边的权值:B D 8 输入两顶点和两顶点边的权值:D C 6 输入两顶点和两顶点边的权值:C A 4 输入的格式如下: 下面演示以A为起点,到任意一点的距离: 下面通过Floyd算法实现任意两点之间的最短路径:

26、 五、 总结 Dijkstra算法和Floyd算法在离散数学和数据结构中均有涉及,在最优化理论中,这两种算法都属于动态规划中的内容。动态规划的算法思想是解决多阶段决策过程最优化问题的一种方法。将复杂的问题分解成相互关联的若干阶段,每个阶段都是一个最优化子问题。在做这个程序的时候,遇到的最大的困难便是如何将这种动态的思想转化成程序。在动态规划的过程中,动态转移方程是非常关键的一个步骤,在程序中,是整个算法的集中体现。还有在程序中记录经过的顶点的位置,需要用到栈这个数据结构。程序的实现用到了很多的数据结构方面的问题,尤其是图论中的问题。我想我在这方面还是需要进一步的加强。 通过对于Dijkstra算法和Floyd算法的实现,我还需要进一步对实际问题进行解决,这样才能学以致用。对于实际问题的求解需要建立数学模型,如最短路径问题,使用Dijkstra算法可以有效地解决一点到任意一点的最短距离。 六、 参考文献 【1】李占利,张卫国编著. 最优化理论与方法[m]. 中国矿业大学出版社,2012年8月 【2】张小艳,龚尚福编著. 数据结构与算法[m]. 中国矿业大学出版社 【3】严蔚敏,吴伟民编著. 数据结构(C语言版)[m]. 清华大学出版社,2012 【4】百度百科 Dijkstra算法,Floyd算法

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服