超市选址课程设计报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学与技术学院课程设计成绩单

优秀:90分~100分良好:80分~89分中等:70~79分及格:60~69分不及格0分~59分

武汉科技大学计算机科学与技术学院制表

计算机科学与技术学院

课程设计报告

课程名称:数据结构课程设计专业:计算机科学与技术班级:2011级03班

学号:201113137131

姓名:彭伟华

指导老师:李顺新

2013年9月20日

计算机科学与技术专业课程设计任务书

便利店选址

摘要:

该课题是为小区内的某一便利店选址,要求实现总体最优,这是带权的最小生成树的问题,小区平面图采用邻接矩阵表示,设计小区的平面图是一有向网,边表示各单位到便利店的路径,边上的权值表示路径的长度。

关键词:权邻接矩阵有向网

1 引言

1.1课题背景

便利店的选址问题是一个很复杂的决策过程,既需要定性分析,又需要定量计算。选址问题主要取决于店铺位置的地形特点及其周围的人口状况、城市设施状况、交通条件、地租成本和竞争环境等,正确的选址决策能在减少投资运行成本的同时提高经济效益。近几年,由于选址数据的愈加复杂以及计算机技术的迅速发展,人们开始利用计算机的强大计算能力对选址数据进行分析计算,从而决定最佳的选址方案。

1.2课程设计目的

数据结构是计算机学科实践性很强的一门核心课程。课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。

1.3 课程设计任务

对于某一小区便利店,其他各栋楼到其的距离不同,同时各栋楼的居民数也各不相同,不考虑各居民去超市的频率,请为便利店选址,要求实现总体最优,方便更多的住户购物。

【提示】

1)便利店无论选址何处,八栋楼的居民均可直接到达,即八栋楼与便利店均相邻,且距离为直线距离;

2)八栋楼的居民人数为权重,应该方便大多数人,实现总体最优。

通过该题目的设计过程,可以加深理解图数据结构,掌握某些基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。

1.4 系统开发平台

1、题目:便利店选址

2、开发工具: Microsoft Visual C++6.0

3、操作系统:Windows 7

2 系统结构分析

2.1需求分析

核心问题: 求最短路径(选址的要求就是便利店到各单位权值之和最少)

数据模型(逻辑结构): 带权有向图 (权值计算: 距离*人数)

存储结构: typedef struct

{

string vexs[MAX_VERTEX_SIZE];

int arcs[MAX_VERTEX_SIZE][MAX_VERTEX_SIZE];

int vexnum;// ,arcnum;

}MGraph;

核心算法: Floyd算法(弗洛伊德算法-每一对顶点之间的最短路径)

输入数据: 单位个数、各单位地址、各单位人数

输出数据: 便利店地址值

总体思路: 如果便利店所选地址为(x,y),那么先求出各单位到该地址的含参直线距离,在保证总体最优(权值最小)的情况下计算出便利店地址的精确值。

2.2方案选择

1)直角距离选址模型

使总体最优的的便利店选址问题可表述为:minZ=∑CjQj(|X-Xa|+|Y-Ya|)

可将问题分解成两个单独最小化问题:minZ= minZ1+ minZ2

minZ1=min∑CjQj|X-Xa|

minZ2=min∑CjQj|Y-Ya|

2)欧式距离选址模型

两点之间的欧式距离定义如下:Dj=√[(X-Xa)*(X-Xa)+(Y-Ya)*(Y-Ya)]

使总体最优的便利店选址问题可表述为:minZ=∑CjQj√[(X-Xa)* (X-Xa)+(Y-Ya)* (Y-Ya)]

分别求Z对Xa和Ya的偏导数,令所得方程等于零,求Xa和Ya的值:

Xa=(∑CjQjXj/Dj)/ (∑CjQj/Dj)

Ya=(∑CjQjYj/Dj)/ (∑CjQj/Dj)

3)修正距离选址模型

在方案2)所得结果的基础上,采用迭代法求解更精确的结果。

Dj=k√[(X-Xa)* (X-Xa)+(Y-Ya)* (Y-Ya)]

minZ=∑kCjQj√[(X-Xa)* (X-Xa)+(Y-Ya)* (Y-Ya)] 由于本课题所给数据比较简单,通过综合比较分析,本课题决定采用方案1)。

3 应用程序设计3.1流程图设计

3.2源程序

#include

#include

using namespace std;

struct building

{

double x;

double y;

double value;

};

building bd[1000];

int n;//n栋楼

double minx,maxx,miny,maxy;//记录各栋楼的区域

double midx,mmidx,midy,mmidy;

double result_x,result_y,sum = 100000;//最后结果

double dis(double x,double y)//计算距离

{

double sum= 0;

for(int i = 0;i < n;i++)

{

sum += sqrt((x - bd[i].x)*(x - bd[i].x) + (y - bd[i].y)*(y - bd[i].y))*bd[i].value;

}

return sum;

}

void D_Divide()//三分法求位置

{

midx = (minx + maxx)/2;

mmidx = (midx + maxx)/2;

midy = (miny + maxy)/2;

mmidy = (midy + maxy)/2;

while((maxx-minx) > 0.01)

{

while((maxy-miny)>0.01)

{

if(dis(midx,midy) > dis(midx,mmidy))

miny = midy;

相关文档
最新文档