Floyd算法实现实际问题——18个城市间最优路线规划

这篇具有很好参考价值的文章主要介绍了Floyd算法实现实际问题——18个城市间最优路线规划。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

离散数学大作业 

——利用Floyd算法计算两城市间最优路径及距离 

代码在最下面

一.提出问题

在交通网络非常发达、交通工具和交通方式不断更新的今天,人们在出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需要的时间等问题也感兴趣。对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。图中的顶点表示城市,边表示城市之间的交通关系。这个交通系统可以回答出行旅客提出的各种路径选择问题。例如,问题之一:“一位旅客要从 A 城到 B 城,他希望选择一条路径最短。设计一个程序实现对两个城市最短路径的查询

二.模型化

精力有限顾及不到所有城市在地图上选取了18个城市作为图的结点

 

代码实现过程用汉字比较繁琐,所以在此将18个城市标号0-17进行路径问题的计算

Floyd算法实现实际问题——18个城市间最优路线规划

 

为了尽量体现Floyd算法的计算过程在次假定只有结点周围的且不超过1000km的城市有有向边边的长度设为百度地图所搜索到的最短路程剩余的城市间距离设置为最大值5000km即不可直接到达

例如合肥的有向边链接了郑州南京武汉南昌虽然合肥离上海杭州也很近但在此为了突出Floyd算法不赋予该两座城市之间的边而是借助南京这个结点到达

Floyd算法实现实际问题——18个城市间最优路线规划

(人手搜索,按序号找,手敲的,真的累死我了啊啊啊啊啊啊啊) 

之后通过Floyd算法计算各个城市间最短距离并且记录路径最后格式化输出

三.  编程实现

1、城市代号与名字匹配结构体构建

Floyd算法实现实际问题——18个城市间最优路线规划

 

结构体Vnode,用于存储城市名字字符串,之后再通过城市代号,达到输出汉字的效果,使呈现更明确

2、静态变量

Floyd算法实现实际问题——18个城市间最优路线规划

(啃了之前写noj数据结构实验11题的老本)

int lu[maxnum][maxnum][maxnum]:第一个值设为a,第二个值设为b,第三个值设为c,a,b用于定位某个节点到某个节点,c用于记录路线,即,数组用于记录某个节点到各个节点最短路径的途经节点。
wei[maxnum][maxnum]:用于记录lu[maxnum][maxnum][maxnum]数组的路径最前端此时位于第几个位置,便于更新途径节点

3、主函数模块

Floyd算法实现实际问题——18个城市间最优路线规划

 

函数调用关系如图

4、城市名初始化函数模块

Floyd算法实现实际问题——18个城市间最优路线规划

(没选到的城市无意冒犯,全部省会弄下来我会死的😂😂,随便选了18个城市)

标号与城市名对应如图

5、路径距离初始化代码

 

Floyd算法实现实际问题——18个城市间最优路线规划

(5000即不可直达)

6、路径初始化函数模块

Floyd算法实现实际问题——18个城市间最优路线规划

路径初始都设为出发结点和到达结点,暂且不考虑不可达情况,不影响后续结果。

7、Floyd算法函数模块

Floyd算法实现实际问题——18个城市间最优路线规划

for循环最里层在完成路径长度的更新同时,完成了路径途经结点的更新,是Floyd函数的进化版本。

8、检测输入结点并输出路径长度及路径模块

Floyd算法实现实际问题——18个城市间最优路线规划

m记录需要求多少条路径。

temp1[maxnum],temp2[maxnum]分别记录初末结点。

格式化输出。

9、输入输出测试

先输入整数n,表示要求多少组路径

然后n行输入a b表示要求从a -> b的路径

Floyd算法实现实际问题——18个城市间最优路线规划

四. 形成结论文章来源地址https://www.toymoban.com/news/detail-499675.html

  1. 成功利用Floyd算法、c语言程序实现了对18个城市之间最短路径及长度的计算以及格式化输出。
  2. 缺点:初始的输入因本人时间有限,没能完成将输入也改成汉字输入,所以要求两城市路径要先看城市对应代号然后输入。
  3. 通过这次大作业,我更加深刻地理解了离散课上所教授的Floyd算法,实现了教学合一,而不是单纯的听老师讲课或是机械地写书上的习题,老师与别的班的不同教学任务富含特色,着实令我印象深刻,感谢老师栽培。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define maxnum 20
#define maxlu 5000

typedef struct Vnode{
	char name[10];
}AdjList[maxnum];

AdjList cheng;

int lu[maxnum][maxnum][maxnum];
int wei[maxnum][maxnum];

void chu()
{
    strcpy(cheng[0].name,"北京");
    strcpy(cheng[1].name,"天津");
    strcpy(cheng[2].name,"太原");
    strcpy(cheng[3].name,"西宁");
    strcpy(cheng[4].name,"兰州");
    strcpy(cheng[5].name,"西安");
    strcpy(cheng[6].name,"郑州");
    strcpy(cheng[7].name,"成都");
    strcpy(cheng[8].name,"武汉");
    strcpy(cheng[9].name,"合肥");
    strcpy(cheng[10].name,"南京");
    strcpy(cheng[11].name,"上海");
    strcpy(cheng[12].name,"杭州");
    strcpy(cheng[13].name,"重庆");
    strcpy(cheng[14].name,"长沙");
    strcpy(cheng[15].name,"南昌");
    strcpy(cheng[16].name,"昆明");
    strcpy(cheng[17].name,"广州");
}
  //  北,天,太,西,兰,西,郑,成,武,合,南,上,杭,重,长,南,昆,广
int ans[18][18]=
{//  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
    {0,137,519,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {134,0,540,5000,5000,5000,694,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {502,519,0,5000,601,433,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,0,222,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,218,0,626,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,600,5000,643,0,481,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {5000,709,433,5000,5000,479,0,5000,510,566,662,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,5000,873,746,5000,0,5000,5000,5000,5000,5000,304,5000,5000,815,5000},
    {5000,5000,5000,5000,5000,5000,513,5000,0,377,533,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,5000,5000,5000,569,5000,385,0,170,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,5000,169,0,305,280,5000,5000,5000,5000,5000},//南京
    {5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,308,0,178,5000,5000,5000,5000,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,279,177,0,5000,5000,531,5000,5000},
    {5000,5000,5000,5000,5000,5000,5000,301,5000,5000,5000,5000,5000,0,888,5000,843,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,333,5000,5000,5000,5000,905,0,337,5000,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,342,437,5000,5000,523,5000,337,0,5000,780},
    {5000,5000,5000,5000,5000,5000,5000,815,5000,5000,5000,5000,5000,836,5000,5000,0,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,676,780,5000,0},
    };

void luchu()
{
    for(int i=0;i<18;i++)
    for(int j=0;j<18;j++)
        wei[i][j]=1;
    for(int i = 0;i < 18;i++)
    {
        for(int j = 0;j < 18;j++)
        {
            lu[i][j][wei[i][j]]=i;
            wei[i][j]++;
            lu[i][j][wei[i][j]]=j;
            wei[i][j]++;
        }
    }
}
void floyd()
{
    int i,j,k;
    for(k = 0;k < 18;k++)
    {
        for(i = 0;i < 18;i++)
        {
            for(j = 0;j < 18;j++)
            {
                if(ans[i][j]>ans[i][k]+ans[k][j] )
                {
                    ans[i][j]=ans[i][k]+ans[k][j];
                    int w;
                    for(w=1;w<wei[i][k];w++)
                    {
                        lu[i][j][w]=lu[i][k][w];     
                    }
                    for(w=2;w<wei[k][j];w++)
                    {
                        lu[i][j][wei[i][k]+w-2]=lu[k][j][w];     
                    }
                    wei[i][j]=wei[i][k]+wei[k][j]-2;
                }
            }
        }
    }
}
 
void print(int m)               //待改
{
    int i;
    int x,y;
    scanf("%d",&m);
    int temp1[maxnum];
    int temp2[maxnum];
    for(i = 0;i < m;i++)
    {
        scanf("%d %d",&temp1[i],&temp2[i]);
    }
    printf("--------------------------------------------\n");
    for(i = 0;i < m;i++)
    {
        printf("%s -> %s 的最优路径长%dkm,最优路径为:\n",cheng[temp1[i]].name,cheng[temp2[i]].name,ans[temp1[i]][temp2[i]]);
        for(int j=1;j<maxnum;j++)
        {
            if(lu[temp1[i]][temp2[i]][j]!=temp2[i])
            printf("%s\n",cheng[lu[temp1[i]][temp2[i]][j]].name);
            else
            {
            printf("%s\n",cheng[lu[temp1[i]][temp2[i]][j]].name);
            printf("--------------------------------------------\n");
            break;
            }
        }
    }
}
int main()
{
    chu();
    int m;
    luchu();
    floyd();
    print(m);
    return 0;
}

到了这里,关于Floyd算法实现实际问题——18个城市间最优路线规划的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 集货运输优化:数学建模步骤,Python实现蚁群算法(解决最短路径问题), 蚁群算法解决旅行商问题(最优路径问题),节约里程算法

    目录 数学建模步骤 Python实现蚁群算法(解决最短路径问题)  蚁群算法解决旅行商问题(最优路径问题)

    2024年02月09日
    浏览(52)
  • Floyd算法求解各顶点之间最短路径问题

    一、Floyd算法 概述 Floyd算法,也称为Floyd-Warshall算法,是一种用于求解图中所有节点之间最短路径的算法。Floyd算法可以处理负权边的情况,但是不能处理负权环。 Floyd算法基于动态规划思想,通过一个二维数组记录从一个节点到另一个节点的最短路径长度。算法的核心思想是

    2024年02月05日
    浏览(39)
  • 弗洛伊德(Floyd)算法求个顶点之间最短路径问题(详解+图解)

    具体来说,弗洛伊德算法通过求解所有点对之间的最短路径来实现。在算法开始时,我们假设图中的所有节点之间都是不联通的,即它们之间的距离为无穷大。然后,我们对图进行“松弛”操作,即尝试更新每个节点之间的距离估计值,以寻找更短的路径。具体来说,对于图

    2024年02月08日
    浏览(41)
  • 最优传输问题与Sinkhorn算法

    最近看到一篇特征匹配相关的论文,思想是将特征匹配问题转化为最优传输问题求解,于是我去学习了一下最优传输问题。 本文主要是对博文 Notes on Optimal Transport 的学习做一个记录总结,该博文写的不错,推荐阅读。 文章作者以一个简单的甜点分配例子引入了最优传输问题

    2024年02月03日
    浏览(38)
  • Floyd_Warshall算法详解及实现(多源最短路径)

    小明要去这样的城市旅游(城市交通图如下),为了减轻经济负担,小明想知道任意两个城市之间的最短路径。 从图中,可以得到:小明打算去4个城市(节点数)旅游,而这4个城市之间有8条公路(边数)连通,公路上的数字(权重)表示这条公路的长短。 现在需要设计一

    2023年04月17日
    浏览(36)
  • 最优化:建模、算法与理论(典型优化问题

    4.1.1 基本形式和应用背景 再次说明一下,其实这本书很多的内容之前肯定大家都学过,但是我觉得这本书和我们之前学的东西的出发角度不一样,他更偏向数学,也多一个角度让我们去理解 线性规划问题的一般形式如下: min ⁡ x ∈ R n c T x s . t . A x = b G x ≤ e (4.1.1) min_{x{

    2024年02月09日
    浏览(250)
  • 计算机算法分析与设计(14)---贪心算法(会场安排问题和最优服务次序问题)

     假设在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。 数据输入: 第 1 1 1 行中有一个整数 n n n ,表示有 n n n 个待安排的活动。接下来的 n n n 行中,每行有 2 2 2 个正整数,分别表示 n n n 个待安排的活动的开始时间和结束

    2024年02月02日
    浏览(43)
  • 深度学习求解稀疏最优控制问题的并行化算法

    问题改编自论文An FE-Inexact Heterogeneous ADMM for Elliptic Optimal Control Problems with L1-Control Cost { min ⁡ y ( μ ) , u ( μ )

    2024年02月07日
    浏览(44)
  • 【算法设计与分析】C++独立任务最优调度问题

    一、问题描述:   用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有aibi,而对于某些j,j≠i,有ajbj。既不能将一个作业分开由2台机器处理,也没有一台机器能同

    2024年02月11日
    浏览(41)
  • Java使用遗传算法,寻找十滴水问题的最优解

    近期某手游出了个活动,经确认发现本质为十滴水游戏。 简单说一下规则,棋盘大小通常为6x6,在游戏开始时,棋盘随机有若干水珠,其大小范围为1-4。点击棋盘内的一格,会消耗玩家持有的1个小水滴,同时使得该单元格的水珠大小+1。如果水珠大小超过4,则水珠发生爆炸

    2024年02月20日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包