82组终期报告【数据结构与算法基础】要点.docx
- 文档编号:345486
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:41
- 大小:834.01KB
82组终期报告【数据结构与算法基础】要点.docx
《82组终期报告【数据结构与算法基础】要点.docx》由会员分享,可在线阅读,更多相关《82组终期报告【数据结构与算法基础】要点.docx(41页珍藏版)》请在冰点文库上搜索。
《数据结构与算法基础》课程项目
实施报告
题 目:
校园最短路径漫游
组 号:
任课教师:
组 长:
成 员:
成 员:
成 员:
成 员:
联系方式:
年 月 日
报告目录
一、 课程项目实施方案
1.课程设计要求
2.设计思想
3.算法基础
4.软件基础
5.实现方式
6.关键技术
二、项目的结果分析展示
三、项目总结以及对于数据结构与算法课程的感悟四、项目分工
五、源程序代码及注释
一、课程项目实施方案
1.课程设计要求:
根据校园各主要生活、学习、活动等场所、地点,设计并实现基于校园各场所之间的最短路径漫游。
要求:
(1)掌握数据结构的输入/输出;
(2)设计与实现校园各主要场所之间的最短路径算法;
(3)根据场所之间的最短路径及不同场所之间的路况信息,设置相应的步行、骑行等出行方式,计算到达每一目的地的时间及总的路程耗时;
(4)各主要场所、地点以及漫游状态,以地图缩、放方式动态展示;
(5)校园各主要场所、地点不少于50个。
2.设计思想:
具体分析:
(1).打开初始界面,直接输入起始点和终点,实现最短路径查询、校园场所的介绍等功能。
(2).操作方式
I.最短路径查询:
分别选择界面中“起始点”和“终点”的下拉框里的50个校园场所,点击“查询”按钮,会在界面上方的“最短路径”小框中出现最短路径的具体方案,以及大致的距离,同时在界面地图上以动画方式展现出具体的最短路径。
如果起点和终点的场所选择相同,会出现
“选择错误,您选择的起点与终点是相同的”的提示。
II.校园场所介绍:
鼠标点击校园地图中50个场所之一,会在“校园介绍”
中显示该场所名称以及可直达的校园地点。
(3).结束最短路径查询之后,点击界面上的退出按钮从而退出界面。
根据对课程项目设计要求的分析,我们程序设计的流程图大致如下:
开始
用VS打开登陆界面
输入起点和终点
显示最短路径
退出
3.算法基础:
【Dijkstra算法】
1.定义概览
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
注意该算法要求图中不存在负权边。
问题描述:
在无向图G=(V,E)中,假设每条边E[i]的长度为w[i],找到由顶点V0到其余各点的最短路径。
(单源最短路径)
2.算法描述
1)算法思想:
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径,就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。
在加入的过程中,总保持从源点
v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。
此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
2)算法步骤:
a.初始时,S只包含源点,即S={v},v的距离为0。
U包含除v外的其他顶点,即:
U={其余顶点},若v与U中顶点u有边,则正常有权值,若u不是v的出边邻接点,则权值为∞。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离
(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d.重复步骤b和c直到所有顶点都包含在S中。
3代码
/*用迪杰斯特拉算法求有向网G的V0顶点到其他顶点的最短路径P,以及其带权长度D。
其中P是二维数组,行号表示终点,列号表示经过的路径。
P[v][w]为
TRUE的意思就是从v0到v,要经过w点)。
D是一维数组,表示某顶点到v0点的路径长(D[v]==10表示从v0到v要经过的路径长度为10。
final存放已经求得的路径结果(比如final[v]为TRUE表示已经找到v0到v的最短路径)。
*/
void ShorttestPath_DIJ(
MGraph G, int v0,PathMatrix &P,
ShortPathTable &D)
{
for( v = 0; v { final[v] = FALSE; D[v] = G.arcs[v0][v]; for( w = 0;w < G.vexnum; ++w ) { P[v][v0] = TRUE; P[v][v] = TRUE; } } D[v0] = 0; final[v] = TRUE; /*下面开始主循环,每次求得v0到某个v顶点的最短路径,同时刷新之前的最短路径。 */ for( i = 1; i { // 对于除了v0之外的 顶点(这个循环仅仅限制次数,i的值不用). P[v][w] = FALSE; } min = INFINITY; // 假定初始的“最小 if( INFINITY ) D[v] < 值”为无穷大。 for( w = 0; { //如果有直接互通的两个顶点,直接将这个路径赋值到数组P[v]。 w < G.vexnum; ++w ) { if( ! final[w] ) // w顶点在V-S 中,即还未确定的顶点。 if( D[w] < min ) { v = w; min = D[w]; // 随着循环进行,依与v0的距离大小,从小到大取得顶点v,并标记进 final。 } w < G.vexnum; w++ ) { // 更新路径 if( ! final[w] && (min +G.arcs[v][w] < D[w])) { D[w] = min + G.arcs[v][w]; P[w] = P[v]; // 把一行都给赋值了 P[w][w] = TRUE; } } } final[v]TRUE; // 标记已经找到 = } } for( w = 0; 【弗洛伊德算法】 1.定义概览 Floyd-Warshall算法(Floyd-Warshallalgorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。 Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为 O(N2)。 2.算法描述 1)算法思想原理: Floyd算法是一个经典的动态规划算法。 用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。 从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在) 从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。 所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k)+Dis(k,j) =Dis(i,k)+Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i 到j的最短路径的距离。 2).算法描述: a.从任意一条单边路径开始。 所有两点之间的距离是边的权,如果两点之间没 有边相连,则权为无穷大。 b.对于每一对顶点u和v,看看是否存在一个顶点w使得从u到w再到v 比己知的路径更短。 如果是更新它。 3).Floyd算法过程矩阵的计算 十字交叉法 方法: 两条线,从左上角开始计算一直到右下角如下所示 给出矩阵,其中矩阵A是邻接矩阵,而矩阵Path记录u,v两点之间最短路径所必须经过的点 相应计算方法如下: 最后A3即为所求结果 3.算法代码实现 typedefstruct { //图中当前的顶点数和边数 char vertex[VertexNum]; //顶点表 intedges[VertexNum][VertexNum]; //邻接矩阵,可看做边表 int n,e; }MGraph; voidFloyd(MGraphg) { intA[MAXV][MAXV]; intpath[MAXV][MAXV]; inti,j,k,n=g.n; for(i=0;i for(j=0;j { A[j]=g.edges[j]; path[j]=-1; □} for(k=0;k { for(i=0;i for(j=0;j if(A[j]>(A[k]+A[k][j])) { A[j]=A[k]+A[k][j]; path[j]=k; □} } } 4.软件基础: MicrosoftVisualStudio 简介: MicrosoftVisualStudio(简称VS)是美国微软公司的开发工具包系列产品。 VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。 所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和 MicrosoftSilverlight及WindowsPhone。 项目用途: 制作登陆界面,编写主程序,子程序以及展示最终结果。 界面制作过程: 本界面采用c++语言,按钮包含起始点,终点,校园路径查询,路程显示等。 其中起点和终点包括A楼,AJ楼,B楼,BJ楼,C楼,CJ楼,D楼,DJ楼,J楼,E楼,EJ楼,文化广场,F楼,FJ楼,G楼,GJ楼,水秀,伟长楼,音乐学院,南门,游泳馆,训练馆,体育馆,风雨操场,图书馆,尔美,中间点1,美院下沉式广场,中间点2,中间点3,中间点4,中间点5,山明,益新,教育超市,西门,中间点6,中间点7,中间点8,中间点9,中间点10,南二门,中间点,东门,校内楼1,校内楼2,校内楼3,校内楼4,校内楼5,校内楼6。 校园路径显示为迪杰斯特拉算法中得到的路径。 路程显示为迪杰斯特拉算法得到的最短路径。 其具体代码如下图所示: 百度地图 简介: 百度地图是百度提供的一项网络地图搜索服务,覆盖了国内近400个城市、数千个区县。 在百度地图里,用户可以查询街道、商场、楼盘的地理位置,也可以找到离您最近的所有餐馆、学校、银行、公园等等。 用途: 测量校园间具体两地点的距离。 操作过程: 学校点的选取主要使用百度地图中的描点连线功能。 打开百度地图,采用测距功能。 5.实现方式: 利用C++程序实现各种功能。 具体过程: ①先创建一个MFC工程文件,在VS中先建立若干类,定义好对象需要的数组、链表变量和最短路径计算函数,方便主程序中调用; ②编辑主程序,建立对话框,完成各种操作代码的编写; ③调试程序,解决程序中的bug; ④撰写报告,总结汇报。 6.关键技术: C++源程序: (具体代码与分析见代码附录) 二、项目的结果分析展示 1.用visualstudio2013打开.VCPROJ文件,在VS里出面最短路径界面。 2.在起始点选择事先存储好的50个校园主要地点。 示例中,我们选择了教育超市;同理在终点选择伟长楼。 3.点击查询按钮,在最短路径显示框和路径显示框中分别显示最短路径方案和距离。 并且在地图界面上以红线延生的方式,动态的显示出具体路径。 示例中最短路径方案为: 教育超市—校内楼2—校内楼1—中间点4—中间点3—音乐学院——伟长楼。 最短路径为817m。 4.单机退出按钮,退出校园最短路径导航系统。 三、项目总结以及对于数据结构与算法课程的感悟 通过这次的项目设计,首先我们熟悉并基本掌握了visual studio的使用,了解了它的用途与功能。 其次,对编程语言: C++语言的理解也有了进一步的提升。 另外,通过解读算法和代码,又能将上课时老师所讲的内容与实践结合起来,让我们对迪杰斯特拉算法和数据结构这门科目有了更深入的理解。 在完成这个项目的过程中,我们碰到了如下问题。 1.由于部分组员电脑问题,MicrosoftVisualStudio2013软件只能由个别同学下载,导致代码调试编写不能所有人都参与其中。 2.软件从未接触过,所以做项目之前我们网查阅找了很多关于VS使用的指导书,也常常跟着教程练习软件,并且找到了一个和项目有关的《中国地质大学最短路径》的模板。 3.初期,由于使用电脑VS版本与编写模板代码VS版本的不同,电脑无法打开exe文件,并提示“无法找到组件,缺少没有找到 MSVCP100.dll”。 后来,又陆续出现此类问题。 4.代码中所使用的地图定位方法较麻烦,我们需要先测出相应距离,然后根据所花路径的时间长短求出。 所以在地图上定位50个点复杂繁琐,消耗我们一定的时间,最后我们发现百度地图能很好地用来测量距离。 5.在模板代码的基础上编写相应代码时,经常会出现各种bug,和提示没有相应插件,需要反复补充修改,并在MSCN网站上下载对应的应用程序补丁。 6.在插入校园地图时,需要先把.jpg后缀名的图片改为.bmp,并且一开始所存入的图片太大,导致运行时地图无法出现。 每当遇到这些问题时,我们通常会先聚在一起,相互讨论,检查和修改代码。 如果还是无法解决问题,那么我们会上网查找资料或者请教一下其他小组的同学。 虽然我们每个组员都有详细的分工,但是一旦出现问题,大家就会一同去解决。 就这样,我们小组在磕磕绊绊中不断的学习,成长,也最终完成了这次的项目,实现了大部分功能,达成了大部分要求。 尽管最终的项目本没有做到非常完美,很多功能还无法实现。 但是我们已经迈出了每个人的第一步,我们相信,无论今后是否还会用到Visual studio。 我们在做项目过程中科学,积极的方法以及坚持,耐心的精神会让我们在今后的道路上走得更远。 五、源程序代码 //MyCampusDlg.cpp: 实现文件 // #include"stdafx.h"#include"MyCampus.h"#include"MyCampusDlg.h" #include"AdjacencyWDigragh.h" #ifdef_DEBUG #definenewDEBUG_NEW#endif CPointzuobiao[52]; //用于应用程序“关于”菜单项的CAboutDlg对话框 //========================================================================== AdjacencyWDigraph //========================================================================== classCAboutDlg: publicCDialog //继承系统类函数,用户的窗口交互函数 { public: CAboutDlg(); //函数重载,初始化 //对话框数据 enum{IDD=IDD_ABOUTBOX}; // protected: virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDV支持用来在里面添加控件或者控件属性对应的成员变量的.实现了数据交换的功能. //实现 protected: DECLARE_MESSAGE_MAP() //向类中添加消息映射必要的结构体和函数声明,位置不重要 public: afx_msgvoidOnBnClickedOk(); }; CAboutDlg: : CAboutDlg(): CDialog(CAboutDlg: : IDD) { } voidCAboutDlg: : DoDataExchange(CDataExchange*pDX) { CDialog: : DoDataExchange(pDX); //消息和消息处理函数有机的联系起来 } BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) //参数1为该类的类名,参数2为该类基类的类名。 ON_BN_CLICKED(IDOK,&CAboutDlg: : OnBnClickedOk) END_MESSAGE_MAP() //CMyCampusDlg对话框 CMyCampusDlg: : CMyCampusDlg(CWnd*pParent/*=NULL*/) : CDialog(CMyCampusDlg: : IDD,pParent) m_ShowRoad(_T("")) m_FirstLast(_T("")) { m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); //============================================================== m_bitmap.LoadBitmap(IDB_BITMAP2); //把图片加载进来m_ShowJingDian=0; //给控制变量赋值,要求就是输出每个景点的介 //============================================================== //AdjacencyWDigraph m_AdjacencyWDigraph.Add(1,3,50).Add(1,2,90); //AJ //A //CJ //C m_AdjacencyWDigraph.Add(2,1,90).Add(2,4,55).Add(2,22,130);m_AdjacencyWDigraph.Add(3,5,50).Add(3,1,50).Add(3,4,90); //BJ m_AdjacencyWDigraph.Add(4,3,90).Add(4,6,55).Add(4,41,130).Add(4,2,55);//B m_AdjacencyWDigraph.Add(5,7,55).Add(5,3,50).Add(5,6,90); m_AdjacencyWDigraph.Add(6,5,90).Add(6,8,55).Add(6,4,55); //D m_AdjacencyWDigraph.Add(7,9,100).Add(7,24,90).Add(7,5,55).Add(7,8,90);//DJ m_AdjacencyWDigraph.Add(8,7,90).Add(8,15,55).Add(8,6,55); m_AdjacencyWDigraph.Add(9,11,55).Add(9,24,60).Add(9,7,100); //EJ m_AdjacencyWDigraph.Add(10,9,90).Add(10,12,55).Add(10,28,60); //E m_AdjacencyWDigraph.Add(11,13,55).Add(11,9,55).Add(11,12,90); //FJ m_AdjacencyWDigraph.Add(12,11,90).Add(12,14,55).Add(12,26,100).Add(12,10, 55); //F m_AdjacencyWDigraph.Add(13,19,130).Add(13,11,55).Add(13,14,90); //GJ //G m_AdjacencyWDigraph.Add(14,13,90).Add(14,45,150).Add(14,12,55); m_AdjacencyWDigraph.Add(15,28,60).Add(15,8,55); m_AdjacencyWDigraph.Add(16,27,200); m_AdjacencyWDigraph.Add(17,44,170).Add(17,18,90); m_AdjacencyWDigraph.Add(18,17,90); m_AdjacencyWDigraph.Add(19,29,70).Add(19,32,50).Add(19,38,120); m_AdjacencyWDigraph.Add(20,22,160).Add(20,41,105).Add(20,49,95); m_AdjacencyWDigraph.Add(21,42,130); m_AdjacencyWDigraph.Add(22,20,160).Add(22,2,130); m_AdjacencyWDigraph.Add(23,47,60); m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法基础 82 组终期 报告 数据结构 算法 基础 要点