24学校超市选址问题.docx
- 文档编号:10505202
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:15
- 大小:132.28KB
24学校超市选址问题.docx
《24学校超市选址问题.docx》由会员分享,可在线阅读,更多相关《24学校超市选址问题.docx(15页珍藏版)》请在冰豆网上搜索。
24学校超市选址问题
数学与计算机学院
课程设计说明书
课程名称:
算法设计与分析-课程设计
课程代码:
7106620
题目:
超市选址问题
年级/专业/班:
学生姓名:
学 号:
开始时间:
2010年12月27日
完成时间:
2011年01月07日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总分(100)
指导教师签名:
年月日
摘要
学校超市的选址问题,一般需要考虑各个单位到它的综合距离最近。
其实质是找一个综合权数最小的地点,但手工求解会造成很大的麻烦。
随着计算机科学的不断进步,为我们找到了机算的途径,大大地节约了劳动资源。
其中计算机图形学的发展,为我们提供了很多科学有效地算法。
使得计算快速,方便。
关键词:
超市选址、计算机、图形学
1引言
1.1问题的提出
对于某一学校超市,其他各单位到其的距离不同,同时各单位人员去超市的频度也不同。
请为超市选址,要求实现总体最优。
2.设计要求:
(1)设计该问题的核心算法;
(2)设计程序能有效指出学校超市可设立的地点和各单位的位置以及它们之间的有效路径;
(3)程序能自动计算出最优设立点,并显示出最优设立点。
1.2国内外研究的现状
不仅超市选址,其他诸多重要设施在建立前都需要对其地点,作出最优的抉择。
该问题归根到底,就是要我们运用图的原理对其找到一个离各个单位综合最近的地点。
随着数学方法。
当今,数学的图理论,已经较为完善。
这为我们运用计算机解决该类问题提供了条件。
1.3任务与分析
说到求解一个地点,实现总体最优。
就需要找到一个度量优、劣的标准。
由于一个学校的单位数量不会超过两位数,所以用蛮力法是可行的。
我们将各个单位到选址地的距离与该单位人员去超市频度的乘积作为单位的权数,再把各单位总权数相加所得的和作为该选址的一个优、劣度量标准。
当然,权数和最小的为最优选址
2程序的主要功能
2.1输入功能
输入学校的单位总数;
输入学校各单位名称;
输入学校各单位员工去超市频度;
输入学校各单位间的距离(用矩阵表示)。
2.2求权值功能
求出将超市设在各个单位时,所得总的权值,返回用数组存储。
2.3求最优功能
从上述的各个权值中,选出最小值为最优。
并将最优值和对应的选址储存在链表中,返回头指针。
2.4显示功能
显示最优选址的地点、总权数以及各单位到它的距离。
3程序运行平台
Windows操作系统
VisualC++
4总体设计
图4.1总体流程图
5程序说明
structZY//定义链表结构体,储存最优信息
{
doublemin;
intn;
ZY*next;
};
voidinput(int&n,float**&a,float*&b,char**&DW)//输入信息
{
inti,j;
printf("请输入单位数量:
");
scanf("%d",&n);//输入单位数量
printf("\n");
a=(float**)malloc(n*sizeof(float*));//分配内存空间
for(i=0;i a[i]=(float*)malloc(n*sizeof(float));//分配内存空间 b=(float*)malloc(n*sizeof(float));//分配内存空间 DW=(char**)malloc(n*sizeof(char*));//分配内存空间 for(i=0;i DW[i]=(char*)malloc(20*sizeof(char));//分配内存空间 printf("请输入各单位的名称: \n"); for(i=0;i scanf("%s",DW[i]);//输入各单位名称 printf("请输入各单位去超市的频度: \n"); for(i=0;i scanf("%f",b+i);//输入各单位去超市频度 printf("请输入各单位间的距离矩阵: \n"); for(i=0;i for(j=0;j scanf("%f",a[i]+j); } double*work_sum(float**A,float*B,intN)//求各单位被选中后的总权值 { intn=N; float**a=A; float*b=B; inti,j; doubles,*sum; sum=(double*)malloc(n*sizeof(double));//分配内存空间 for(i=0;i { s=0.00; for(j=0;j s=s+a[j][i]*b[j]; sum[i]=s;//储存每个单位被选中后的权值 } returnsum;//返回sum } ZY*work_min(double*Sum,intN)//求最优选址 { double*sum=Sum; doublemin=sum[0]; inti; intn=N; ZY*head,*p; head=(ZY*)malloc(sizeof(structZY));//分配内存空间 head->next=NULL;//尾指针置空 for(i=0;i if(sum[i]<=min) min=sum[i]; head->min=min;//求最优权值 for(i=0;i if(sum[i]==min) { p=(ZY*)malloc(sizeof(structZY)); p->n=i;//记录最优选址点 p->next=head->next; head->next=p;//尾指针置空 } returnhead; } voidprint(ZY*Head,char**Dw,intN,float**A,float*B)//显示数据 { ZY*head=Head; ZY*p; char**DW=Dw; inti,k,n=N; float**a=A; float*b=B; doublemin; p=head->next; min=head->min; printf("最优选址如下: (总权重: %f)\n\n",min); while(p)//显示最优选址信息 { k=p->n; printf("超市设立地点: %s\n",DW[k]); for(i=0;i printf("%s到超市的有效路径为: %f权重为: %f\n\n",DW[i],a[i][k],a[i][k]*b[i]); p=p->next; } } 6模块分析 6.1输入功能 1.定义一个整型变量,储存输入的单位数,为矩阵等输入确定阶; 2.定义一个二维的字符指针,用来储存输入的各个单位的名称,其中行数等于单位数。 因为一个单位名称一般不超过20个字符,所以列数取定值20; 3.定义一个一维的浮点型指针,用来储存输入的各单位去超市的频度; 4.定义一个二维的浮点型指针,用来储存各单位间的距离,其中到自己的距离规定为0。 注: 各个单位的名称、去超市频度和它们间的距离输入顺序要一致。 6.2求权值功能 对于每各单位来说,它们被选中时,所得权数就等于各个单位到它的距离乘以各个单位去超市频度的积,再分别相加便是总权数。 需要传入的参数是: 指向单位间的距离矩阵的指针、指向单位去超是频度的指针、单位数量。 需要返回的是: 指向求得的权数的指针值。 6.3求最优功能 在各个总权值中,最小的就是最优权值,我们将最优权值保留在第一个链表节点。 由于输入是按统一的顺序,所以最优权值在数组中的位置对应的单位就是最优选址。 我们把与最优值相等的权值在数组中的位置(即下标)保留在后续节点中。 6.4显示功能 由于上述,最优权值在数组中的位置对应的单位就是最优选址,我们假设它在数组中的位置是i,那么单位名称数组中的第i个字符串就是最优选址的名称。 距离矩阵中第i列元素是各个单位到选址超市的距离,距离矩阵中第i列各元素与频度数组中与该元素所在行的下标相同的值相乘就是相应单位到选址超市的权数。 掌握了这各规律,一一计算后输出便是需要的结果。 7系统测试 数据输入: 图7.1输入数据窗口 显示数据: 图7.2显示最优信息窗口 8结论 通过测试发现,当选址在临江苑和图书馆时,对应的总权值分别不大于九舍。 说明选址符合要求 致谢 首先,感谢老师的细心知道,没有老师的不求目的地教导,不可能这么快,这么准确地完成设计, 其次要感谢同学的帮助,使我能够准确、快速地获取信息帮助。 参考文献 [1]严蔚敏吴伟民著.《数据结构》(C语言版)(第三版).北京: 清华大学出版社2007.4 [2]谭浩强著.《C程序设计》(第三版).北京: 清华大学出版社;2006.9 [3]AnanyLevitin著.潘彦译《算法设计与分析基础》(第二版).北京: 清华大学出版社;2010.1 [4][美]S巴斯著.计算机算法: 设计和分析引论.朱洪等译上海: 复旦大学出版社;1985.1 附录 #include #include structZY//定义链表结构体,储存最优信息 { doublemin; intn; ZY*next; }; double*work_sum(float**A,float*B,intN)//求各单位被选中后的总权值 { intn=N; float**a=A; float*b=B; inti,j; doubles,*sum; sum=(double*)malloc(n*sizeof(double));//分配内存空间 for(i=0;i { s=0.00; for(j=0;j s=s+a[j][i]*b[j]; sum[i]=s;//储存每个单位被选中后的权值 } returnsum;//返回sum } ZY*work_min(double*Sum,intN)//求最优选址 { double*sum=Sum; doublemin=sum[0]; inti; intn=N; ZY*head,*p; head=(ZY*)malloc(sizeof(structZY));//分配内存空间 head->next=NULL;//尾指针置空 for(i=0;i if(sum[i]<=min) min=sum[i]; head->min=min;//求最优权值 for(i=0;i if(sum[i]==min) { p=(ZY*)malloc(sizeof(structZY)); p->n=i;//记录最优选址点 p->next=head->next; head->next=p;//尾指针置空 } returnhead; } voidprint(ZY*Head,char**Dw,intN,float**A,float*B)//显示数据 { ZY*head=Head; ZY*p; char**DW=Dw; inti,k,n=N; float**a=A; float*b=B; doublemin; p=head->next; min=head->min; printf("最优选址如下: (总权重: %f)\n\n",min); while(p)//显示最优选址信息 { k=p->n; printf("超市设立地点: %s\n",DW[k]); for(i=0;i printf("%s到超市的有效路径为: %f权重为: %f\n\n",DW[i],a[i][k],a[i][k]*b[i]); p=p->next; } } voidinput(int&n,float**&a,float*&b,char**&DW)//输入信息 { inti,j; printf("请输入单位数量: "); scanf("%d",&n);//输入单位数量 printf("\n"); a=(float**)malloc(n*sizeof(float*));//分配内存空间 for(i=0;i a[i]=(float*)malloc(n*sizeof(float));//分配内存空间 b=(float*)malloc(n*sizeof(float));//分配内存空间 DW=(char**)malloc(n*sizeof(char*));//分配内存空间 for(i=0;i DW[i]=(char*)malloc(20*sizeof(char));//分配内存空间 printf("请输入各单位的名称: \n"); for(i=0;i scanf("%s",DW[i]);//输入各单位名称 printf("请输入各单位去超市的频度: \n"); for(i=0;i scanf("%f",b+i);//输入各单位去超市频度 printf("请输入各单位间的距离矩阵: \n"); for(i=0;i for(j=0;j scanf("%f",a[i]+j); } voidmain() { float**a; float*b; double*sum; intn; ZY*head; char**DW; input(n,a,b,DW); sum=work_sum(a,b,n); head=work_min(sum,n); print(head,DW,n,a,b); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 24 学校 超市 选址 问题