数据结构课程设计学校超市选址问题.doc
《数据结构课程设计学校超市选址问题.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计学校超市选址问题.doc(16页珍藏版)》请在咨信网上搜索。
学校超市选址问题 学生姓名 专业班级 学号 题 目 学校超市选址问题 课题性质 工程设计 课题来源 自选课题 指导教师 同组姓名 无 主要内容 对于某一学校超市,其她各单位到其得距离不同, 同时各单位人员去超市得频度也不同。 请为超市选址,要求实现总体最优。 任务要求 1、实现公司到超市距离,频率最优. 2、 确定超市位置,要求实现总体最优. 参考文献 《C程序设计》第三版 谭浩强 著 清华大学出版社 《数据结构》(C语言版) 严蔚敏 著 清华大学出版社 《数据结构及应用》沈华 等编著 机械工业出版社 审查意见 指导教师签字: 教研室主任签字: 一、需求分析 1)核心问题: 求最短路径(选址得要求就就是超市到各单位权值之与最少) 2)数据模型(逻辑结构): 带权有向图 (权值计算: 距离*频度) 3)存储结构: typedef struct { string vexs[MAX_VERTEX_SIZE]; ﻩint arcs[MAX_VERTEX_SIZE][MAX_VERTEX_SIZE]; int vexnum;// ,arcnum; }MGraph; 核心算法: Floyd算法(弗洛伊德算法—每一对顶点之间得最短路径) 输入数据: 各单位名称,距离,频度,单位个数. 输出数据: 所选单位名称。 总体思路: 如果超市就是要选在某个单位,那么先用floyd算法得出各顶点间得最短距离/最小权值。 假设顶点个数有n个,那么就得到n*n得一张表格,arcs(i,j)表示i单位到j单位得最短距离/最小权值 , 这张表格中与最小得那一行(假设为第t行),那么超市选在t单位处就就是最优解. 2 运行环境 Visual Stdio C++6、0 ﻩWindows Vista/2003/XP 3 概要设计 Floyd算法利用动态规划思想,通过把问题分解为子问题来解决任意两点见得最短路径问题。设G=(V, E, w)就是一个带权有向图,其边V={v1, v2, …, vn}。对于k≤n,考虑其结点V得一个子集。对于V中任何两个结点vi、vj,考虑从vi到vj得中间结点都在vk中得所有路径,设该路径就是其中最短得,并设它得路径长度为最短路径长度.如果结点vk不在从vi到vj得最短路径上,则;反之则可以把分为两段,其中一段从vi到vk,另一段从vk到vj,这样便得到表达式.上述讨论可以归纳为如下递归式: 原问题转化为对每个i与j求,或者说求矩阵 开始 流程图 Main() 输入基本信息 GreatMgraph(Gh) 建立邻接矩阵得存储结构 Floyd算法 N Y A[i][j]==INF,i!=j i到j不存在路径 Floyed(Gh) 输出i->j得路径与路径长度 输出超市得最佳地址:i 结束 4 详细设计 第一步,让所有路径加上中间顶点1,取A[i][j]与A[i][1]+A[1][j]中较小得值作A[i][j]得新值,完成后得到A(1),如此进行下去,当第k步完成后,A(k)[i][j]表示从i到就且路径上得中间顶点得路径得序号小于或等于k得最短路径长度。当第n—1步完成后,得到A(n-1),A(n-1)即所求结果。A(n-1)[i][j]表示从i到j且路径上得中点顶点得序号小于或等于n-1得最短路径长度,即A(n-1)[i][j]表示从i到j得最短路径长度。 4、1头文件与变量设定 #include 〈string、h〉 #include 〈stdio、h〉 #include <stdlib、h> #include <time、h〉 #include "malloc、h" #include <iostream、h> #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define INF 32767 const int MAXVEX=100; typedef char Vextype; 4、2结构体得定义 typedef struct { ﻩVextype vexs[MAXVEX][MAXVEX]; //单位名称(顶点信息); int adj[MAXVEX][MAXVEX]; ﻩ //单位之间得相通情况(就是否有边); int dis[MAXVEX][MAXVEX];ﻩﻩﻩﻩ//单位间距离(边得长度); ﻩint f[MAXVEX];ﻩﻩﻩﻩﻩ ﻩ//各单位去超市得频率; int n; ﻩﻩ ﻩﻩﻩ//顶点数与边数; ﻩint e; }Mgraph; 4、3变量得输入 void CreatMgraph(Mgraph *G) { int i,j,k; printf(”请输入单位个数:\n"); ﻩ scanf("%d”,&(G-〉n)); printf(”请输入单位间得路径数:\n"); scanf(”%d",&(G-〉e)); ﻩprintf(”请输入单位名称:\n"); for(i=0;i<G->n;i++) { ﻩ printf("请输入第%d个单位名称:\n",i); scanf("%s",&G->vexs[i]); } ﻩfor(i=0;i〈G->n;i++)ﻩ ﻩ //结构体得初始化; ﻩﻩfor(j=0;j〈G-〉n;j++) ﻩﻩ{ ﻩﻩG->adj[i][j]=0; ﻩG-〉dis[i][j]=0; ﻩ G-〉f[i]=0; ﻩ} for(k=0;k〈G-〉e;k++) { ﻩ printf("请输入相通得两单位 (输入格式:i,j):\n”); ﻩﻩscanf("%d,%d",&i,&j);//在距离上体现为无向; ﻩﻩprintf("请输入相同两个单位间得距离(格式:dis):\n"); ﻩscanf(”%d",&(G-〉dis[i][j])); ﻩﻩG->adj[i][j]=1; ﻩ G-〉adj[j][i]=1; ﻩG->dis[j][i]=G->dis[i][j]; ﻩ} ﻩfor(k=0;k<G-〉n;k++) ﻩ{ ﻩ printf(”请输入第%d个单位去超市得相对频率:\n”,k); ﻩscanf(”%d”,&(G-〉f[k])); ﻩ} ﻩfor(i=0;i<G—>n;i++)ﻩﻩﻩ ﻩﻩ //以距离与频率之积作为权值; ﻩ for(j=0;j<G—〉n;j++) { G->dis[i][j]*=G-〉f[i]; //最终权值非完全无向; if(G—>adj[i][j]==0&&i!=j) ﻩ ﻩﻩG->dis[i][j]=INF; ﻩﻩ} } 4、4带权有向图求最短路径floyd算法 void Floyed(Mgraph *G) //带权有向图求最短路径floyd算法 { ﻩint A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX]; ﻩint i,j,k,pre; int count[MAXVEX]; for(i=0;i〈G->n;i++) //初始化A[][]与path[][]数组 for(j=0;j〈G—〉n;j++) //置初值; ﻩﻩ{ ﻩﻩA[i][j]=G—>dis[i][j]; ﻩﻩﻩpath[i][j]=-1; ﻩﻩﻩcount[i]=0; } ﻩfor(k=0;k<G—>n;k++) //k代表运算步骤 { ﻩ for(i=0;i<G->n;i++) for(j=0;j〈G->n;j++) ﻩ ﻩif(A[i][j]>(A[i][k]+A[k][j])) //从i经j到k得一条路径更短 ﻩﻩﻩﻩ{ ﻩﻩ ﻩA[i][j]=A[i][k]+A[k][j]; ﻩ path[i][j]=k; ﻩﻩﻩﻩ} ﻩ} cout<〈endl<<"Floyed算法求解如下:"〈<endl; ﻩfor(i=0;i<G—>n;i++) for(j=0;j<G-〉n;j++) ﻩ{ ﻩﻩﻩif(i!=j) ﻩ { ﻩﻩ cout<〈" "〈<i<〈”—>"〈〈j<<”;"; if(A[i][j]==INF) ﻩ ﻩ{ ﻩﻩ ﻩﻩif(i!=j) ﻩ cout〈<"不存在路径”<<”\n"<<endl; ﻩ } ﻩelse ﻩﻩﻩ { ﻩﻩﻩcout<〈"路径长度为:"<<A[i][j]〈<"\n"; ﻩﻩﻩ cout〈<"路径为:"<〈i〈〈”*"; ﻩﻩﻩﻩpre=path[i][j]; ﻩ while(pre!=—1) ﻩ ﻩ { ﻩ ﻩ ﻩcout<<pre<<”\n"; ﻩ ﻩﻩﻩpre=path[pre][j]; ﻩ ﻩ} ﻩ ﻩ ﻩcout〈〈j〈〈endl; ﻩ ﻩ} ﻩﻩﻩ} } //以下为选择总体最优过程,然后确址; ﻩfor(i=0;i<G->n;i++) ﻩ for(j=0;j〈G-〉n;j++) ﻩ{ ﻩ ﻩif(A[i][j]==INF) ﻩ count[i]=0; ﻩ else ﻩcount[i]=1; } ﻩfor(i=0;i<G-〉n;i++) ﻩif(count[i]) { ﻩ for(j=0;j<G-〉n;j++) ﻩif(i!=j)A[i][i]+=A[j][i]; } k=0; for(i=0;i〈G—>n;i++) ﻩ{ ﻩ if(count[i]) ﻩ ﻩif(A[k][k]>A[i][i]) ﻩ ﻩﻩk=i; } ﻩcout<<"超市得最佳地址为:”<<G-〉vexs[k]<<endl; } 4、5主函数模块 void main() { Mgraph *Gh=NULL; Gh=(Mgraph *)malloc(sizeof(Mgraph)); ﻩCreatMgraph(Gh); Floyed(Gh); ﻩsystem("pause"); } 5 调试分析 5、1本题目得关键点之一: 有两个权值:各单位到超市得距离及各单位人去超市得频度。这使得图得建立出现了困难,经过分析这两个值可以合并为一个权值即distance*frequency;这样就使得图得建立轻而易举。 5、2本题目得关键点之二: 利用floyd算法求出每一对顶点之间得最短路径. 5、3本题目得关键点之三: ﻩ 选出最短路径,即最佳地点应使其到其她单位权值最小.注意:每比较一次path应清0一次(Path=0)。 6 设计程序如下: #include <string、h〉 #include <stdio、h> #include <stdlib、h> #include <time、h〉 #include "malloc、h" #include 〈iostream、h〉 #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define INF 32767 const int MAXVEX=100; typedef char Vextype; typedef struct { Vextype vexs[MAXVEX][MAXVEX]; //单位名称(顶点信息); int adj[MAXVEX][MAXVEX]; //单位之间得相通情况(就是否有边); int dis[MAXVEX][MAXVEX]; //单位间距离(边得长度); ﻩint f[MAXVEX]; ﻩﻩ ﻩ//各单位去超市得频率; ﻩint n; ﻩﻩ ﻩ ﻩ //顶点数与边数; int e; }Mgraph; void CreatMgraph(Mgraph *G) { ﻩint i,j,k; printf("请输入单位个数:\n"); ﻩ scanf("%d",&(G->n)); printf("请输入单位间得路径数:\n"); ﻩscanf(”%d",&(G-〉e)); ﻩprintf("请输入单位名称:\n"); for(i=0;i<G—〉n;i++) ﻩ{ printf("请输入第%d个单位名称:\n",i); ﻩﻩscanf("%s",&G—〉vexs[i]); ﻩ} ﻩfor(i=0;i〈G->n;i++)ﻩﻩ ﻩﻩﻩ //结构体得初始化; ﻩﻩfor(j=0;j〈G—>n;j++) { ﻩ ﻩG-〉adj[i][j]=0; G->dis[i][j]=0; ﻩ ﻩG—〉f[i]=0; ﻩﻩ} ﻩfor(k=0;k<G—>e;k++) { ﻩﻩprintf("请输入相通得两单位 (输入格式:i,j):\n"); ﻩscanf("%d,%d”,&i,&j);//在距离上体现为无向; printf("请输入相同两个单位间得距离(格式:dis):\n”); ﻩﻩscanf(”%d",&(G->dis[i][j])); ﻩG—〉adj[i][j]=1; ﻩﻩG->adj[j][i]=1; G-〉dis[j][i]=G-〉dis[i][j]; } for(k=0;k〈G—>n;k++) { printf(”请输入第%d个单位去超市得相对频率:\n”,k); scanf(”%d",&(G—〉f[k])); ﻩ} for(i=0;i<G->n;i++) ﻩ ﻩ //以距离与频率之积作为权值; ﻩ for(j=0;j<G-〉n;j++) ﻩﻩ{ ﻩﻩG—〉dis[i][j]*=G-〉f[i]; //最终权值非完全无向; ﻩﻩif(G-〉adj[i][j]==0&&i!=j) ﻩ ﻩﻩG->dis[i][j]=INF; } } void Floyed(Mgraph *G) //带权有向图求最短路径floyd算法 { ﻩint A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX]; ﻩint i,j,k,pre; ﻩint count[MAXVEX]; ﻩfor(i=0;i〈G—>n;i++) //初始化A[][]与path[][]数组 ﻩﻩfor(j=0;j<G—〉n;j++) //置初值; { A[i][j]=G—>dis[i][j]; ﻩ path[i][j]=-1; ﻩ count[i]=0; } ﻩfor(k=0;k〈G->n;k++) //k代表运算步骤 ﻩ{ ﻩﻩfor(i=0;i〈G-〉n;i++) ﻩﻩfor(j=0;j<G-〉n;j++) ﻩ ﻩ if(A[i][j]>(A[i][k]+A[k][j])) //从i经j到k得一条路径更短 ﻩ{ ﻩ ﻩﻩﻩA[i][j]=A[i][k]+A[k][j]; ﻩﻩ path[i][j]=k; } } ﻩcout<<endl<〈"Floyed算法求解如下:"〈〈endl; for(i=0;i<G—>n;i++) ﻩ for(j=0;j<G->n;j++) { ﻩif(i!=j) ﻩ{ ﻩﻩﻩcout〈<” ”〈<i<<"->"<〈j<〈";”; ﻩﻩif(A[i][j]==INF) ﻩ ﻩ{ ﻩﻩﻩ if(i!=j) ﻩ cout〈〈"不存在路径"<〈”\n"〈<endl; ﻩﻩ ﻩ} ﻩ else { ﻩ ﻩﻩcout<<”路径长度为:"〈〈A[i][j]<〈”\n"; ﻩ ﻩﻩcout<<”路径为:”<〈i<<"*"; ﻩﻩﻩ ﻩpre=path[i][j]; ﻩﻩﻩ while(pre!=-1) ﻩﻩﻩ{ ﻩﻩ ﻩcout〈<pre<<"\n"; ﻩﻩ ﻩ pre=path[pre][j]; ﻩﻩﻩﻩ} ﻩﻩﻩﻩ cout<<j<<endl; ﻩ ﻩﻩ} ﻩ } ﻩﻩ} //以下为选择总体最优过程,然后确址; for(i=0;i〈G-〉n;i++) ﻩfor(j=0;j〈G-〉n;j++) ﻩﻩ{ ﻩif(A[i][j]==INF) ﻩ count[i]=0; ﻩﻩelse ﻩcount[i]=1; ﻩﻩ} for(i=0;i〈G-〉n;i++) ﻩ if(count[i]) ﻩﻩ{ ﻩ for(j=0;j<G—>n;j++) ﻩ ﻩif(i!=j)A[i][i]+=A[j][i]; } ﻩﻩk=0; for(i=0;i<G—〉n;i++) { if(count[i]) ﻩ if(A[k][k]>A[i][i]) ﻩ ﻩk=i; ﻩ} ﻩcout<<"超市得最佳地址为:”<<G—>vexs[k]<〈endl; } void main() { Mgraph *Gh=NULL; Gh=(Mgraph *)malloc(sizeof(Mgraph)); ﻩCreatMgraph(Gh); ﻩFloyed(Gh); ﻩsystem("pause”); } /*测试数据: 输入: 单位个数 4 单位间得路径数 6 第0个单位名称 A 第1个单位名称 B 第2个单位名称 C 第3个单位名称 D 相通两单位 之间得距离 0,1 2 1,2 3 2,3 4 0,3 1 0,2 2 1,3 3 第0个单位去超市得频率 2 第1个单位去超市得频率 4 第2个单位去超市得频率 3 第3个单位去超市得频率 1 */ 7 测试结果 7、1输入 7、2输出 参考文献: 1、《C程序设计》第三版 谭浩强 著 清华大学出版社 2、《数据结构》(C语言版) 严蔚敏 著 清华大学出版社 3、《数据结构及应用》沈华 等编著 机械工业出版社 总 结 终于完成了本次数据结构课程设计,对我来说这就是一项不小得挑战,它不仅检验了我得学习情况,也考验了我得意志力,让我有了很大得收获! 通过一学期得学习,我知道数据结构就是一门纯属于设计得科目,它需用把理论变为上机调试。在学习科目得第一节课起,老师就为我们阐述了它得重要性。它对我来说具有一定得难度。它就是其它编程语言得一门基本学科.ﻪ之前我刚学习数据结构时感觉很吃力,因为书上都只就是提供一些通用得结构算法,并没有具体得题目与完整得程序来让我体会数据结构在程序中所体现得作用。 但就是经过自己到图书馆借阅相应得书籍,并且在每次上机时大胆实践,我逐渐体会到数据结构就是计算机科学与技术专业得一门核心专业基础课程,在我们专业得课程体系中起着承上启下得作用,学好数据结构对于提高理论认知水平与实践能力有着极为重要得作用。学习数据结构得最终目得就是为了获得求解问题得能力。对于现实世界中得问题,应该能从中抽象出一个适当得数学模型,该数学模型在计算机内部用相应得数据结构来表示,然后设计一个解此数学模型得算法,再进行编程调试,最后获得问题得解答。 书本知识用于实际应用,才就是我得目标,这次课程设计给了我锻炼自我突破自己得机会. 通过这次数据结构课程实践,我对数据结构这门课程有了更深得认识与体会,同时实践得成功极大增强了我对继续学习相关知识得信心与兴趣!- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 学校 超市 选址 问题
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【人****来】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【人****来】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【人****来】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【人****来】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文