算法课程设计——超市选址问题

设计内容

设计内容:对于某一学校超市,其他各单位到其的距离不同,同时各单位人员去超市的频度也不同。请为超市选址,要求实现总体最优。

设计要求

  1. 设计该问题的核心算法;
  2. 设计可视化的界面,界面中能有效显示学校超市可设立的地点和各单位的位置以及它们之间的有效路径;
  3. 程序能自动计算出最优设立点,并最好以图示化方式演示。

设计核心

在我做这个算法题的时候,看了网上各种的文档设计。有人是将到各个地点到其他地点的最短距离之和求出,然后以到各个地点最短距离的地点为超市选址。我后面跟老师讨论后,我认为超市应该跟上面那个人的相反。应该是被到距离最短的地点作为超市,并且,由于这个题目涉及到路径和频率还有各个地点到其他地点的频率不一样,所以,意味着两个地点之间是有两条路线,路径是一样的,但是频率不一样。

涉及知识

佛洛依德算法,大家可以参考这个网站或者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
  • 7
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
哦,这是一个有趣的问题,需要考虑许多因素来确定最佳的选址。我们可以使用C语言编写一个程序,来解决这个问题。下面是一个可能的解决方案: 首先,我们需要定义一些变量,包括:学校位置,超市位置,超市数量,以及超市名称等等。例如: ``` int school_x, school_y; // 学校位置 int market_x[MAX_MARKET], market_y[MAX_MARKET]; // 超市位置 int num_market; // 超市数量 char market_name[MAX_MARKET][MAX_NAME_LEN]; // 超市名称 ``` 然后,我们需要编写一个函数来计算学校和超市之间的距离。这可以使用勾股定理来计算: ``` double distance(int x1, int y1, int x2, int y2) { return sqrt(pow(x1-x2, 2) + pow(y1-y2, 2)); } ``` 接下来,我们需要编写一个函数来计算每个超市到学校的距离,并选择最短的距离。这可以使用一个循环来实现: ``` int find_best_market() { double best_distance = INFINITY; int best_market = -1; for (int i = 0; i < num_market; i++) { double d = distance(school_x, school_y, market_x[i], market_y[i]); if (d < best_distance) { best_distance = d; best_market = i; } } return best_market; } ``` 最后,我们可以在主函数中调用这些函数,并输出结果: ``` int main() { // 输入学校位置,超市数量,超市名称和位置等信息 // ... // 找到最佳超市 int best_market = find_best_market(); // 输出结果 printf("最佳超市是%s,距离学校%.2lf米。\n", market_name[best_market], distance(school_x, school_y, market_x[best_market], market_y[best_market])); return 0; } ``` 当然,这只是一个简单的示例程序,实际情况可能更加复杂。例如,我们可能需要考虑超市的规模、竞争对手、租金等因素来确定最佳的选址。但是,这个程序可以作为一个基础框架,帮助我们开始解决这个问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值