学校超市选址问题
设计内容
设计内容:对于某一学校超市,其他各单位到其的距离不同,同时各单位人员去超市的频度也不同。请为超市选址,要求实现总体最优。
设计要求
- 设计该问题的核心算法;
- 设计可视化的界面,界面中能有效显示学校超市可设立的地点和各单位的位置以及它们之间的有效路径;
- 程序能自动计算出最优设立点,并最好以图示化方式演示。
设计核心
在我做这个算法题的时候,看了网上各种的文档设计。有人是将到各个地点到其他地点的最短距离之和求出,然后以到各个地点最短距离的地点为超市选址。我后面跟老师讨论后,我认为超市应该跟上面那个人的相反。应该是被到距离最短的地点作为超市,并且,由于这个题目涉及到路径和频率还有各个地点到其他地点的频率不一样,所以,意味着两个地点之间是有两条路线,路径是一样的,但是频率不一样。
涉及知识
佛洛依德算法,大家可以参考这个网站或者B站上看视频
https://www.cnblogs.com/wangyuliang/p/9216365.html
课程设计,大家可以看看这个
https://wenku.baidu.com/view/b3815caa0029bd64783e2c5e.html
然后,我做课设喜欢用头文件封装一下,所以大家可以看看下面这个链接,学一下怎么封装头文件
https://blog.csdn.net/weixin_44811417/article/details/90405819
我们课设要有可视化,然后,我之前也没有学过可视化,再加上期末考试,我原本想用Qt,但是时间紧迫就使用了轻量级别的可视化软件Graphviz,可以参考的链接
graphviz的官网
http://www.graphviz.org/
graphviz的安装
https://www.cnblogs.com/shuodehaoa/p/8667045.html
简书——如何使用graphviz
https://www.jianshu.com/p/6d9bbbbf38b1
相关代码
由于我忙着完成课设就去准备期末考试了,所以代码只是粗略地封装了。没有再仔细地封装,大家一定要仔细封装,要是不急的话,大家尽量仔细思考如何封装
然后我是习惯从文件中读取数据,这样也方便我多次测试。
弗洛伊德算法
int Graph::Floyed()
{
int i,j,k;
for(i =0; i<Vexnum; i++)
{
for(j = 0; j<Vexnum; j++)
{
if((i!=j)&&(ArcsDis[i][j]!=-2))
Arcs[i][j] = j;
}
}
for(k = 0; k<Vexnum; k++)
{
for(i =0; i<Vexnum; i++)
{
for(j = 0; j<Vexnum; j++)
{
if(ArcsDis[i][j]>(ArcsDis[i][k]+ArcsDis[k][j]))
{
if((ArcsDis[i][k]!=-1)&&(ArcsDis[i][k]!=-2)&&(ArcsDis[k][j]!=-1)&&(ArcsDis[k][j]!=-2))
{
ArcsDis[i][j] = ArcsDis[i][k]+ArcsDis[k][j];
Arcs[i][j] = k;
}
}
}
}
}
for(i =0; i<Vexnum; i++)
{
for(j = 0; j<Vexnum; j++)
{
if ((i != j)&&(ArcsDis[i][j]!=-2))
{
cout << Vex[i] << "到" << Vex[j] << "最短路径权值为:"<<ArcsDis[i][j]<<"\t路径为:";
int next = Arcs[i][j];
cout<<Vex[i];
while(next!=j)
{
cout<<"->"<<Vex[next];
next = Arcs[next][j];
}
cout<<"->"<<Vex[j]<<endl;
}
}
}
return 0;
}
计算路径总和
int Graph::Compute(void)
{
int i,j;
for(i = 0; i<Vexnum; i++)
sum[i] = 0;
for(i = 0; i<Vexnum; i++)
{
for(j = 0; j<Vexnum; j++)
{
if((i!=j)&&(Arcs[i][j]!=-2))
sum[i] += ArcsDis