1、学校超市选址问题 学生姓名 专业班级 学号 题 目 学校超市选址问题 课题性质 工程设计 课题来源 自选课题 指导教师 同组姓名 无 主要内容 对于某一学校超市,其她各单位到其得距离不同, 同时各单位人员去超市得频度也不同。 请为超市选址,要求实现总体最优。 任务要求 1、实现公司到超市距离,频率最优. 2、 确定超市位置,要求实现总体最优. 参考文献 《C程序设计》第三版 谭浩强 著 清华大学出版社 《数据结构》(C语言版) 严蔚敏 著 清华大学出版社 《数据结构及应用》沈华 等编著 机械工业出版社 审查
2、意见 指导教师签字: 教研室主任签字: 一、需求分析 1)核心问题: 求最短路径(选址得要求就就是超市到各单位权值之与最少) 2)数据模型(逻辑结构): 带权有向图 (权值计算: 距离*频度) 3)存储结构: typedef struct { string vexs[MAX_VERTEX_SIZE]; ﻩint arcs[MAX_VERTEX_SIZE][MAX_VERTEX_SIZE]; int vexnum;// ,arcnum; }MGraph; 核心算法: Floyd算法(弗洛伊德算法
3、—每一对顶点之间得最短路径) 输入数据: 各单位名称,距离,频度,单位个数. 输出数据: 所选单位名称。 总体思路: 如果超市就是要选在某个单位,那么先用floyd算法得出各顶点间得最短距离/最小权值。 假设顶点个数有n个,那么就得到n*n得一张表格,arcs(i,j)表示i单位到j单位得最短距离/最小权值 , 这张表格中与最小得那一行(假设为第t行),那么超市选在t单位处就就是最优解. 2 运行环境 Visual Stdio C++6、0 ﻩWindows Vista/2003/XP 3 概要设计 Floyd算法利用动态规划思想,通过把问题分解为子问题来解
4、决任意两点见得最短路径问题。设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) 建立邻
5、接矩阵得存储结构 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)
6、[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
7、ne 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; ﻩﻩ ﻩﻩﻩ//顶点数与边
8、数;
ﻩ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
9、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-
10、>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—
11、>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—〉
12、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
26、
ﻩ ﻩif(i!=j)A[i][i]+=A[j][i];
}
ﻩﻩk=0;
for(i=0;i
27、试数据: 输入: 单位个数 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个单位
28、去超市得频率 3 第3个单位去超市得频率 1 */ 7 测试结果 7、1输入 7、2输出 参考文献: 1、《C程序设计》第三版 谭浩强 著 清华大学出版社 2、《数据结构》(C语言版) 严蔚敏 著 清华大学出版社 3、《数据结构及应用》沈华 等编著 机械工业出版社 总 结 终于完成了本次数据结构课程设计,对我来说这就是一项不小得挑战,它不仅检验了我得学习情况,也考验了我得意志力,让我有了很大得收获! 通过一学期得学习,我知道数据结构就是一门纯属于设计
29、得科目,它需用把理论变为上机调试。在学习科目得第一节课起,老师就为我们阐述了它得重要性。它对我来说具有一定得难度。它就是其它编程语言得一门基本学科.ﻪ之前我刚学习数据结构时感觉很吃力,因为书上都只就是提供一些通用得结构算法,并没有具体得题目与完整得程序来让我体会数据结构在程序中所体现得作用。 但就是经过自己到图书馆借阅相应得书籍,并且在每次上机时大胆实践,我逐渐体会到数据结构就是计算机科学与技术专业得一门核心专业基础课程,在我们专业得课程体系中起着承上启下得作用,学好数据结构对于提高理论认知水平与实践能力有着极为重要得作用。学习数据结构得最终目得就是为了获得求解问题得能力。对于现实世界中得问题,应该能从中抽象出一个适当得数学模型,该数学模型在计算机内部用相应得数据结构来表示,然后设计一个解此数学模型得算法,再进行编程调试,最后获得问题得解答。 书本知识用于实际应用,才就是我得目标,这次课程设计给了我锻炼自我突破自己得机会. 通过这次数据结构课程实践,我对数据结构这门课程有了更深得认识与体会,同时实践得成功极大增强了我对继续学习相关知识得信心与兴趣!
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818