ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:82.74KB ,
资源ID:7484954      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

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

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

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(学校超市选址问题.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

学校超市选址问题.docx

1、学校超市选址问题 数据结构课程设计报告 题目: 学校超市选址问题 第 1 章 需求分析我的课程设计题目为学校超市选址问题。对于某一学校超市,其他各单位到其的距离不同,同时各单位人员去超市的频度也不同,根据以上这两个条件,确定学校的超市要建在什么地方,才能使得方案达到最优。该程序要能够确定超市的最优地址。而这个最有地址只能在所有单位所在地中选择。通过这个课程设计,真正理解弗洛伊德算法的思想,锻炼自主学习能力和程序编写能力,以及能够处理现实生活中类似的问题。第 2 章 总体设计2.1 文字描述首先,建立图的邻接矩阵。输入相关基本数据信息,以单位作为图的顶点,以单位之间的距离与各个单位去超市的频率之

2、积作为图的权值,建立邻接矩阵。然后,调用弗洛伊德算法。单位i与j之间,加入过渡点k,若i、k间距离与k、j间距离之和小于i、j间的距离,修改矩阵。如此反复执行下去。完成后,得到i到j得最短距离。最后,确定最优地点。根据某单位到各个单位的最短距离之和最短,该单位所在地即为最优地址。2.2 程序流程图 N Y 第 3 章 详细设计3.1数据结构定义一个Graph类来存储图的基本信息,代码如下:#define n 4 /定义顶点数#define e 8 /定义边数#define $ 32767 /用$表示无穷大template class Graphpublic: Graph(int a5); vo

3、id value(int index); /获得一个点到各个点的权值(提取dist数组中的数据) void choice(); /计算路径之和 选择最佳位置 void print(int index); /打印路径 void all_point(); /多次调用迪杰斯特拉 以实现求多源点路径的最小路径 void shortest(int index);/核心算法private: T pathn+1; /路径 int distn+1; /权值 T sn+1; /集合s 保存已求出最短路径的顶点 int arcsn+1n+1; /邻接矩阵 T vn+1; /保存顶点 int timesn+1n+1

4、; /保存一个顶点到其他顶点的频度(也包括到自身的频度为0) int valn+1n+1; /保存一个顶点到其他顶点的权值(也包括到自身的距离为0);3.2 功能实现的算法及思路3.2.1 建立图的邻接矩阵 主要是通过多次调用迪杰斯特拉算法来完成对每个点求出最短路径。定义数组distn+1n+1存储单位间距离,数组timesn+1存储各单位去超市的频率,数组arcsn+1n+1表示单位间相通情况,数组pathn+1 保存路径,数组valn+1依次存储个点的dist数据。如果两单位i、j相通,则令arcsij=相应的权值,不相通则为$表示无穷大,自身到自身的权值为0。 3.2.2 迪杰斯特拉德算

5、法 首先,引进一个辅助向量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的弧上的权值,或者是

6、Dj和从vj到vk的弧上的权值之和。 一般情况下,假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。因此,下一条长度次短的最短路径的长度必是Dj=MinD | viV-S 其中,D或者是弧(v,vi)上的权值,或者是Dk(vkS)和弧(vk,vi)上的权值之和。 迪杰斯特拉算法描述如下: 1)arcs表示弧上的权值。若不存在,则置arcs为(在本程序中为MAXCOST)。S为已找到从v出发的最短路径的终点的集合,初始状态为空集。那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=ar

7、csLocate Vex(G,v),i viV 2)选择vj,使得Dj=MinD | viV-S 3)修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。3.2.3 确定最优地址将数组aij中每行值之和放入每行的首地址中,即ai1+=aij。然后比较每行首地址中的值。令k=1,若ak1ai1,则将i赋给k.。如此循环n次。最后,输出unitnamek,即为所求的地址。第 4 章 实现部分4.1实现代码/* 迪杰斯特拉算法 单源点最短路径 有向图利用邻接 矩阵进行存储*/#ifndef _DIJKSTRA_H_#define _DIJKSTRA_H_#define n 4 /定义顶点数#d

8、efine e 8 /定义边数#define $ 32767 /用$表示无穷大template class Graphpublic: Graph(int a5); void value(int index); /获得一个点到各个点的权值(提取dist数组中的数据) void choice(); /计算路径之和 选择最佳位置 void print(int index); /打印路径 void all_point(); /多次调用迪杰斯特拉 以实现求多源点路径的最小路径 void shortest(int index);/核心算法private: T pathn+1; /路径 int distn+

9、1; /权值 T sn+1; /集合s 保存已求出最短路径的顶点 int arcsn+1n+1; /邻接矩阵 T vn+1; /保存顶点 int timesn+1n+1; /保存一个顶点到其他顶点的频度(也包括到自身的频度为0) int valn+1n+1; /保存一个顶点到其他顶点的权值(也包括到自身的距离为0);#endif/dijkstra类的实现:#include#includedijkstra.husing namespace std;template Graph:Graph(int a5) for(int i=1; i=n; i+) for(int j=1; j=n; j+) ar

10、csij = aij; /赋值操作 valij = 0; for(int i=1; i=n; i+) coutvi; for(int i=1; i=n; i+) for(int j=1; j=n; j+) if(i != j) cout请输入vi到vjtimesij; else timesij = 0; /自己到自己的频度为0; coutendl; system(pause); system(cls);template void Graph:all_point() /多次调用算法 获得路径 for(int i=1; i=n; i+) shortest(i); print(i); value(i

11、); template void Graph:shortest(int index) for(int i=1; i=n; i+) /数据初始 disti = arcsindexi; si = 0; if(i!=index) & (disti$) pathi = vindex; else pathi = 0; sindex = vindex; /将源点并入S中 /distindex = 0; for(int i=1; in; i+) /扫描一行 获得权值 int min = $; int u = index; for(int j=1; j=n; j+) if(!sj) & (distjmin)

12、min = distj; /选取权值最小的路径 u = j; /并记录下该顶点号的位置 su = vu; /将求出的最短路径的顶点号并入S中 for(int w=1; w=n; w+) if(!sw) & (arcsuw$)& (distu+arcsuwdistw) /更新dist中的数据 distw = distu + arcsuw; /权值更新 pathw = vu; /路径更新 template void Graph:print(int index) /打印路径 for(int i=1; i=n; i+) if(i!=index) coutdisti:; coutvi; /输出终点 T

13、pre = pathi; while(pre != 0) coutpre; pre = pathpre; coutendl; cout*endl;template void Graph:value(int index) /获取权值 for(int i=1;i=n;i+) valindexi = disti; template void Graph:choice() /计算权值 for(int i=1; i=n; i+) vali0 = 0; /用零号单元保存路径之和,数据初始化 /*for(int i=1; i=n; i+) for(int j=1; j=n; j+) couttimesij

14、; coutendl; */ for(int i=1; i=n; i+) for(int j=1; j=n; j+) vali0 += (valij*timesij); /开始计算 权值与频度之积 int p=1; /记录最佳位置 int min = val10; for(int k=1; k=n; k+) if(valk0 min) /路径之和达到最小的 即是最佳位置 min = valk0; p+; coutvk的路径之和为:valk0endl; cout*endl; cout*endl; coutendl-vp的路径之和为:min达到最小endl; coutendl-超市的位置选择在:v

15、p为最佳方案!endl;/main()函数引用部分/*该程序在vs2010旗舰版中顺利编译并且运行结果正确如果因为vc6.0编译环境下造成无法运行,则应修改代码中的循环变量, 因为vc6.0对变量的作用域控制不够严谨导致程序无法运行。*注意建立工程时 应选择win32控制台,并且应对上述代码自行建立dijkstea.h ,dijkstra.cpp和main.cpp三个工程文件*/#include#includedijkstra.cppint main() /*int a66 = -1,-1,-1,-1,-1,-1, -1,0,10,$,30,100, -1,$,0,50,$,$, -1,$,$

16、,0,$,10, -1,$,$,20,0,60, -1,$,$,$,$,0;*/ int a55 = -1,-1,-1,-1,-1, -1,0,1,$,4, -1,$,0,9,2, -1,3,5,0,8, -1,$,$,6,0; Graph g1(a); g1.all_point(); g1.choice(); system(pause); return 0; 第 5 章 程序测试5.1 测试数据 (数据源)5.2 程序运行图 (数据录入) (运行结果)5.3结果分析路径之和 = (相应点的)权值 * (相应点的)频度路径之和达到最小的几位最佳方案。第 6 章 总结程序核心算法是迪杰斯特拉算法,该算法对求单源点最短路径有比较好的性能,对于多源点求最佳路径则在时间复杂度上有一定的缺陷。程序在结构上优化不够合理,类的封装不够严谨,数据共享比较冗余,模块化程度不够高。这些都是值得改进的地方。参考文献1 李根强等编数据结构 (C+版) (第二版)北京:中国水利水电出版社,20092 严蔚敏,吴伟民编数据结构北京:清华大学出版社,20013 郑莉,董渊,何江舟编C+语言程序设计(第4版)北京:清华大学出版社,2010

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1