数据结构超市选址问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告书
题目:学校超市选址问题
目录
1.需求分析 (3)
2.概要设计 (3)
3.详细设计 (3)
4.调试分析 (9)
5.用户使用说明 (9)
6.测试结果 (9)
7.参考文献 (15)
1.需求分析
输入数据:
各单位编号;
各单位到超市的距离;
各单位人去超市的频度;
按照以上输入数据创建图;
为超市选址实现总体最优
1、该程序可以读取文件中相邻两地点的距离信息,在程序中用邻接矩阵构造一个有向网,并计算网中任意节点到其它节点的最短路径并输出。
2、在磁盘中新建一个文件存储两个地点的距离信息,要求先输入起点,以空格间隔,然后输入终点,再以空格间隔,然后输入这两个地点间的距离,如此法,依次输入各路径间的起点,终点和距离。
3、根据界面所给的提示信息首先输入保存交通网的文件名,然后输入要求哪一个节点到其它节点的最短路径。
4、程序运行后,在屏幕上将输出所求节点经过某些中转站到达它所能达到的节点及最短路径的值,并将各节点与其对应的编号保存到文件“编号与地名对照表”中,以便它用。
5、程序执行的命令包括:(1)求place数组中的记录在顶点向量中的坐标、(2)采用邻接矩阵存储结构,构造有向网
6.输出最优解。
2.概要设计
本程序主要采用带权图来实现超市选址实现总体最优的一些功能。
1.刚开始我们用频度(即人流量)X距离作为权值,算权值最小的,但当距离一定
时,人流量大的反而不被选择
如果用距离/频度(即人流量)作为权值,比如一个离1M频度为1人的单位,和离100M频度为100人的单位就出现问题了
2.最后我们想还是人流量最重要了,但网上都说要用在main函数中通过子函
数sistant()来求出各单位到超市的距离的平方和,之后求出距离平方和与人
数的关系,最后算出相对的最短距离从而确定超市的最优地址。
基本操作:
CreatGraph(MGraph &G)
操作结果:采用邻接矩阵存储结构,构造有向网G
LocateVex(MGraph &G,char * place)
初始条件:用邻接矩阵存储的有向网G已存在
操作结果:返回place数组中的记录在顶点向量中的坐标
3.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);可采用流程图N –S 图或PAD图进行描述,画出函数和过程的调用关系图。(1)元素类型:typedef int VRType;
typedef struct VRType
{
float Adj;
int Adjnum;
int Adjfrequency;
}VRType;//存储距离和频度作为权值,权值类型
typedef char * VertexType;
typedef char PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef int * ShortPathTable;
(2)结点类型:typedef struct AreCell
{
VRType adj;//权值
InfoType * info;//附加信息
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;//邻接矩阵
int vexnum,arcnum;//顶点个数,弧的条数
}MGraph;
(3)主程序模块:
void main()
{
MGraph G;
int v,Adjcountminvexnum;//Adjcountmin记录当前总权值的最小值
double Adjcountmin;//Adjcountminvexnum记录当前总权值的最小值对应的起点顶点编号
PrintProMember();//输出程序编程组员
//从文本中输入数据并且创建图
CreatGraph(G);//创建带权有向图
//计算最优解
Adjcountmin=sistant(G,0);//第一轮计算以编号0为起点的相对最短路径的总权值,并将之作为当前相对总权值的最小值记录
for(v=1;v { if(sistant(G,v) { Adjcountmin=sistant(G,v); Adjcountminvexnum=v; } } //输出最优解 Print(G,v,Adjcountminvexnum,Adjcountmin); system("pause"); } (4)输出程序编程组员函数模块 void PrintProMember() { printf("************************************************************\n") ; printf("* 海南师范大学*\n"); printf("* 计本二班数据结构课程设计*\n"); printf("* 小组成员:杨振平(组长)、唐田、章捷*\n"); printf("************************************************************\n") ; } (5)构造有向网的模块: void CreatGraph(MGraph &G) { FILE *fp; int i,j; char filename[20],place1[10],place2[10],num[10],c; //初始化邻接矩阵 G.vexnum=0; G.arcnum=0; for(i=0;i for(j=0;j { G.arcs[i][j].adj=INFINITY; G.arcs[i][j].info=NULL; } for(i=0;i G.vexs[i]=NULL; printf("请输入保存交通网的文档名\n"); gets(filename);