算法课程设计校园导航问题.wps
《算法课程设计校园导航问题.wps》由会员分享,可在线阅读,更多相关《算法课程设计校园导航问题.wps(16页珍藏版)》请在冰豆网上搜索。
![算法课程设计校园导航问题.wps](https://file1.bdocx.com/fileroot1/2022-10/19/eaa1fdea-c007-4fa5-b4b8-68ca8d268a6d/eaa1fdea-c007-4fa5-b4b8-68ca8d268a6d1.gif)
算法设计与分析课程设计算法设计与分析课程设计题目:
题目:
校园导航问题文档:
文档:
物联网工程学院物联网工程专业学号学生姓名班级二一三年十二月校园导航问题校园导航问题一、问题描述与分析一、问题描述与分析课程设计主要内容及要求:
设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径).首先,根据江南大学的主要场所设计江南大学的学校平面图如下所示:
图1:
江南大学主要场所平面图之后,需要进行算法的选择与分析,显然,这是一个主要涉及贪婪算法的问题,简单的描述就是计算求解一个节点到其他所有节点的最短路径的问题,通过查阅算法设计与分析的相关资料,最终选择了狄斯奎诺算法来设计解决这个问题。
二、设计概要二、设计概要贪婪法的设计思想:
贪婪法的设计思想:
在实际生活中,经常有这样一类问题:
它有n个输入,它的解由这n个输入中的一个子集组成,但这个子集必须满足事先给定的某些条件。
有时,把这些条件称为约束条件,把满足约束条件的解称为问题的可行解。
满足约束条件的解可能不止一个,因此可行解也不是唯一的。
为了衡量可行解的优劣,事先给出一定的标准,这些标准通常以函数的形式给出,把这些函数称为目标函数。
使目标函数取极值(极大或极小)的可行解,称为最优解。
贪婪法通常用来解决具有最大值或最小值的优化问题。
它犹如登山一样,一步一步地向前推进,从某一个初始状态出发,根据当前局部的而不是全局的最优决策,以满足约束方程为条件、以使得目标函数的值增加最快或最慢为准则,选择一个能够最快地达到要求的输入元素,以便尽快地构成问题的可行解。
在一般情况下,贪婪法由一个迭代的循环组成,在每一轮循环中,通过少量的局部的计算,试图去寻求一个局部的最优解,而不考虑将来如何。
因此,它是一步一步得建立问题的解的。
每一步的工作都增加了部分解的规模,每一步的选择都极大地增长了它所希望实现的目标函数。
因为每一步都是由少量的工作基于少量的信息组成的,因此所产生的算法特别有效。
适合于用贪婪法求解的问题,一般具有下面两个重要性质,即贪婪选择性质和最优子结构性质。
所谓贪婪选择性质,是指所求问题的全局最优解,可以通过一系列局部最优的选择来达到。
每进行一次选择,就得到一个局部的解,并把所求解的问题简化为一个规模更小的类似子问题。
所谓最优子结构,是指一个问题的最优解中包含其子问题的最优解。
基于贪心算法的最短路径算法(狄斯奎诺算法)具体如下:
基于贪心算法的最短路径算法(狄斯奎诺算法)具体如下:
最短路径算法关键先把已知最短路径顶点集(只有一个源点)和未知的顶点分开,然后依次把未知集合的顶点按照最短路径加入到已知结点集中。
在加入时可以记录每个顶点的最短路径,也可以在加入完毕后回溯找到每个顶点的最短路径和权重。
算法把一个图(G)中的点划分成了若干部分:
(1):
原点(v)
(2):
所有周边点(C)另外有一个辅助集合S,从v到S中的点的最短路径已经求得。
S的最初状态是空集。
这样就可以进一步划分图(G):
(1):
原点(v);
(2):
已求出v至其最短路径的周边点(S);(3):
尚未求出v至其最短路径的周边点(Other=C-S);算法的主体思想:
A、找到v-Other所有路径中的的最短路径vd=v-d(Other的一个元素);B、找到v-S-Other所有路径中的的最短路径vi=v-i(Other的一个元素);C、比较vd和vi如果vd=vi则将d加入S且从Other中删除,否则将i加入S且从Other中删除。
D、重复以上步骤直至Other为空集。
系统功能框图设计如下:
系统功能框图设计如下:
图2:
系统功能框图相关函数及函数名称的设计:
相关函数及函数名称的设计:
1、邻接矩阵创建函数:
CreateMGraph()2、校园平面图展示函数:
Map()3、资料介绍函数:
Info()4、求最短路径函数:
Dijkstra()5、主菜单函数:
Menu()6、输出结果函数:
Display()7、主函数:
main()各函数之间的调用关系设计如下:
图3:
函数调用关系图三、流程图及主要源程序三、流程图及主要源程序主程序流程图如下所示:
主程序流程图如下所示:
图4:
主程序流程图1、节点数据类型的描述与定义
(1)顶点信息的结构体定义:
typedefstructVertexTypeintnumber;/顶点数字char*sight;/顶点向量VertexType;
(2)邻接矩阵的结构体定义:
typedefstructVertexTypevexNUM;/顶点序号intarcsNUMNUM;/邻接矩阵intvexnum;/图的当前顶点数MGraph;2、节点图函数的描述代码voidCreateMGraph(intv)/建立节点图的函数inti,j;G.vexnum=v;for(i=1;iG.vexnum;+i)G.vexi.number=i;G.vex0.sight=江南大学主要场所的名字;G.vex1.sight=北大门;G.vex2.sight=二食堂;G.vex3.sight=男生宿舍园区;G.vex4.sight=教职工公寓;G.vex5.sight=一食堂;G.vex6.sight=第一教学楼;G.vex7.sight=女生宿舍园区;G.vex8.sight=公益图书馆;G.vex9.sight=东大门;G.vex10.sight=食品学院;G.vex11.sight=第二教学楼;G.vex12.sight=三食堂;G.vex13.sight=四食堂;G.vex14.sight=南大门;for(i=1;iG.vexnum;+i)for(j=1;jG.vexnum;+j)G.arcsij=Max;G.arcs13=G.arcs31=580;G.arcs14=G.arcs41=620;G.arcs15=G.arcs51=750;G.arcs18=G.arcs81=1260;G.arcs23=G.arcs32=490;G.arcs25=G.arcs52=620;G.arcs27=G.arcs72=230;G.arcs34=G.arcs43=650;G.arcs35=G.arcs53=180;G.arcs38=G.arcs83=1330;G.arcs45=G.arcs54=750;G.arcs46=G.arcs64=430;G.arcs48=G.arcs84=1290;G.arcs49=G.arcs94=1340;G.arcs58=G.arcs85=690;G.arcs68=G.arcs86=110;G.arcs69=G.arcs96=150;G.arcs710=G.arcs107=760;G.arcs714=G.arcs147=1820;G.arcs89=G.arcs98=680;G.arcs811=G.arcs118=190;G.arcs812=G.arcs128=810;G.arcs813=G.arcs138=1240;G.arcs814=G.arcs148=1100;G.arcs911=G.arcs119=440;G.arcs913=G.arcs139=980;G.arcs914=G.arcs149=1480;G.arcs1012=G.arcs1210=320;G.arcs1014=G.arcs1410=1560;G.arcs1112=G.arcs1211=880;G.arcs1113=G.arcs1311=410;G.arcs1114=G.arcs1411=820;G.arcs1213=G.arcs1312=610;G.arcs1214=G.arcs1412=390;G.arcs1314=G.arcs1413=510;3、求最短路径的算法函数代码voidDijkstra(intnum)/狄斯奎诺算法最短路径intv,w,i,t;intfinalNUM;intmin;for(v=1;vNUM;v+)finalv=0;Dv=G.arcsnumv;for(w=1;wNUM;w+)Pvw=0;if(DvMax)Pvnum=1;Pvv=1;Dnum=0;finalnum=1;for(i=1;iNUM;+i)min=Max;for(w=1;wNUM;+w)if(!
finalw)if(Dwmin)v=w;min=Dw;finalv=1;for(w=1;wNUM;+w)if(!
finalw&(min+G.arcsvw)Dw)Dw=min+G.arcsvw;for(t=0;tNUM;t+)Pwt=Pvt;Pww=1;4、主菜单函数代码charMenu()/主菜单函数charc;intflag;dosystem(cls);flag=1;Map();printf(ntttn);printf(tttn);printf(ttt欢迎使用江南大学导航图系统n);printf(tttn);printf(ttt1、查询场所之间最短路径n);printf(ttt2、江南大学主要场所介绍n);printf(ttte、退出系统n);printf(tttn);printf(tttn);printf(tttt请输入您的选择:
);scanf(%c,&c);if(c=1|c=2|c=e)flag=0;while(flag);returnc;5、输出最短路径函数代码voidDisplay(intsight1,intsight2)/输出函数inta,b,c,d,q=0;a=sight2;if(a!
=sight1)printf(nt从%s到%s的最短路径是,G.vexsight1.sight,G.vexsight2.sight);printf(t(最短距离为%dm.)nnt,Da);printf(t%s,G.vexsight1.sight);d=sight1;for(c=0;cNUM;+c)Pasight1=0;for(b=0;bNUM;b+)if(G.arcsdb%s,G.vexb.sight);q=q+1;Pab=0;d=b;if(q%8=0)printf(n);6、主函数代码voidmain()/主函数intv0,v1;chare;charck;CreateMGraph(NUM);dosystem(cls);ck=Menu();switch(ck)case1:
gate:
system(cls);Map();doprintf(nntt请输入出发场地的序号(114):
);scanf(%d,&v0);if(v014)printf(nntttt输入错误!
请重新查询!
n);while(v014);doprintf(tt请输入目的场地的序号(114):
);scanf(%d,&v1);if(v114|v1=v0)printf(nntttt输入错误!
请重新查询!
n);while(v114|v1=v0);Dijkstra(v0);Display(v0,v1);printf(nntttt按回车键继续,按e退回首页n);getchar();scanf(%c,&e);if(e=e)break;gotogate;case2:
system(cls);Info();printf(nntttt请按回车键返回首页.n);getchar();getchar();break;while(ck!
=e);四、程序调试及运行结果四、程序调试及运行结果在多次调试程序并修改其中的语法错误之后,最终成功运行程序并得到如下几张图所示的运行结果
(1)江南大学导航系统运行界面菜单
(2)校园导航系统的主要场地的简介(3)校园导航系统求解显示最短距离四、课程设计总结与心得四、课程设计总结与心得
(1)算法总结与心得首先,这次的课程设计的算法主要用到了贪婪算法的主要思想,贪婪算法是算法设计课程中的一个十分重要的规划思想,能够一步一步地来解决问题。
狄