Floyd算法求解最短路径问题(C++实现)(源码见链接))

Floyd算法求解最短路径问题(C++实现)(源码见链接)


Floyd(弗洛伊德)算法也可称其为插点算法,是一种基于动态规划思想的最短路径算法。动态规划算法将求解的分体分成若干个阶段,按顺序求解子阶段并且动态规划算法所处理的问题无后效性,即在当前情况下,一个阶段的结果常常影响到下一阶段的决策,但下一阶段的结果不会影响前一状态的决策,因此适用于求解最短路径规划问题。Floyd算法编码较为简单,容易理解和应用。

Floyd 算法的基本思想是建立两个矩阵存放数据,以领接矩阵D的形式存储路径数据,同时使用另外一个矩阵P存储中间点数据,最终求得任意两点间最短路径:

在这里插入图片描述
在这里插入图片描述

其中,a表示顶点之间的路径值,v表示各顶点。若路径规划中顶点个数为N,则需要对矩阵D和矩阵P进行N次更新。初始时,从第一个点开始检索,接下来开始,对矩阵D进行N次更新。原理为以下迭代公式:
在这里插入图片描述

每次迭代都会计算出顶点i,j以顶点k为节点的最短路径。
三、问题描述
本文以6个顶点的拓扑图(如图1 所示)为例子,求解ROS服务机器人从点A1到点A6的最短路径方案。
在这里插入图片描述

图1 拓扑图
四、算法设计与步骤
(1)问题数学模型构建(采用数组的数据结构类型):
6个顶点的无向图(图1)
顶点之间的距离:dis[i][j],即顶点i到顶点j间的权重(也可以理解为距离),若i,j不相邻或i=j的话题,则dis[i][j]=∞。
顶点之间的中间点:path[i,j]。path[i][j],表示顶点i到顶点j经过了p[i][j]记录的值所表示的顶点,即每个节点有对应的一个值,如果从i到j是某个点为节点,则path[i][j]即为相应的值。
初始化邻接矩阵D有:
在这里插入图片描述
初始化矩阵P有:
(隔了一阵时间再看,好像忘了,所以在这记录一下:P矩阵就是用来输出最短路线的矩阵,列表从A1-A6指的是起点,行表是终点。初始化的数字含义是指每个点的坐标的列数。比如要计算A1到A6的最短路径,那么初始化就是让A1直达A6,也就是A6下的数字为5(因为坐标是数组,从0开始,所以减一。)以此类推。在计算更新后,例如A1-A6。A6下的数字变成了1,也就是A1要先到A2,然后看A2行所对应的A6下的值,以此类推,直到A6下的值是5,计算结束,最短路径得出。)
在这里插入图片描述

(2)计算第一次迭代值(以A1为节点的最短路径)
Floyd算法最核心的的程序段为:

int temp = 0;
int min_value = 0;
	for (temp = 0; temp < this->vexnum; temp++) 
	{
   
		
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值