路径规划算法之Bellman-Ford算法
最近由于工作需要一直在研究Bellman-Ford算法,这也是我第一次用C++编写代码。
1、Bellman-Ford算法总结
(1)Bellman-Ford算法计算从源点(起始点)到任意一点的最短路径的长度,初始化数组m_Dist[m_Segment[i].m_StartPoint] = m_Maxdouble , m_Dist[m_Source]=0。
(2)对每一个路径进行松弛运算
如果m_Dist[m_Segment[j].m_EndPoint]>m_Dist[m_Segment[j].m_StartPoint]+m_Segment[j].m_Weight,那么m_Dist[m_Segment[j].m_EndPoint]=m_Dist[m_Segment[j].m_StartPoint]+m_Segment[j].m_Weight进行松弛计算。若上述操作没有对m_Dist进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环。否则执行下次循环;
由于规定路径不存在负权重的情况,所以对有负权重的情况这里不进行说明。
注释:m_Source是一条有向边的起点,m_DestPoint是一条有向边的终点;m_Dist(m_StartPoint,m_EndPoint)为节点m_StartPoint和节点m_EndPoint之间边;m_Weight(m_StartPoint, m_EndPoint)为节点m_StartPoint和节点m_EndPoint之间的边的权值; m_Dist[m_Segment[i].m_StartPoint] 是指源节点到m_Segment[i].m_StartPoint节点的距离;
下面为本功能模块的代码,由于这只是车载系统中的一部分代码,与其他功能模块存在互相调用的情况,路径信息存在于SQLite数据库找中,读取数据库是一个完整的功能模块,我这里是直接调用就好了。由于这是本人第一次编写C++程序,哪位大神觉得代码有很可以优化的部分,欢迎提出,进行优化!!!
- #ifndef ROUTEPLAN_H
- #define ROUTEPLAN_H
- #include <qmap.h>
- #include <QVector>
- #include <QList>
- #include <iostream>
- using namespace std;
- typedef struct
- {
- int m_StartPoint; //线的起始点
- int m_EndPoint; //线的终点
- double m_Weight; //线的权重
- int m_SegmentNum; //有向边编号
- }PathPlaning_Segment;
- class RoutePlan:public QObject
- {
- Q_OBJECT
- public:
- const static int m_Maxnum = ; //最大边数
- const double m_Maxdouble = ; //源点和某点不可达时的距离
- int m_Nodenum; //节点的数目
- int m_Edgenum; //边的数目
- int m_Source; //起始点
- int m_DestPoint; //目的地
- int m_RecvNum = ;
- PathPlaning_Segment m_Segment[m_Maxnum]; //路径数组
- int m_RelaxNum[m_Maxnum]; //松弛的路径编号
- int m_Dist[m_Maxnum]; //距离数组
- RoutePlan();
- //初始化函数
- void Init(int srcPoint, int destPoint );
- //贝尔曼福特函数
- void Bellman_Ford();
- //返回路径函数
- QList<int> ReturnPath();
- };
- #endif // ROUTEPLAN_H
- #include "routeplan.h"
- RoutePlan::RoutePlan()
- {
- }
- /***********************************************************************
- Description:
- 初始化函数
- Arguments:
- int srcPoint 起始点
- int destPoint 目标点
- Returns:
- NULL
- Notes:
- 从“/home/map.zar”地图文件中读取地图信息,赋值到本地
- ************************************************************************/
- void RoutePlan::Init(int srcPoint,int destPoint)
- {
- m_RouteManager = new RouteManager();
- if(m_RouteManager->ReadRouteApplicationFile("/home/map.zar"))
- {
- m_Nodenum = m_RouteManager->ReturnSizeofPoint();
- m_Edgenum = m_RouteManager->ReturnSizeofSegment();
- m_Source = srcPoint;
- m_DestPoint = destPoint;
- int num = ;
- QMap<int,PathApplication_Segments>:: const_iterator iter;
- QMap<int,PathApplication_Segments> seg = m_RouteManager->ReturnSegment();
- for( iter=seg.constBegin(); iter!=seg.constEnd(); iter++)
- {
- m_Segment[num].m_StartPoint = iter.value().StartPointKey;
- m_Segment[num].m_EndPoint = iter.value().EndPointKey;
- m_Segment[num].m_Weight = iter.value().Length;
- m_Segment[num].m_SegmentNum = iter.key();
- num++;
- }
- for(int i = ;i<=m_Edgenum-;i++)
- {
- m_Dist[m_Segment[i].m_StartPoint]=m_Maxdouble;
- }
- m_Dist[m_Source]=;
- }
- Bellman_Ford();
- }
- /***********************************************************************
- Description:
- 贝尔曼福特函数
- Arguments:
- NULL
- Returns:
- NULL
- Notes:
- 松弛路径,记录松弛的路径编号,松弛后标记的路径数量
- ************************************************************************/
- void RoutePlan::Bellman_Ford()
- {
- for(int i=;i<=m_Nodenum-;i++)
- {
- for(int j=;j<=m_Edgenum-;j++)
- {
- //松弛路径
- if(m_Dist[m_Segment[j].m_EndPoint]>m_Dist[m_Segment[j].m_StartPoint]+m_Segment[j].m_Weight)
- {
- m_Dist[m_Segment[j].m_EndPoint]=m_Dist[m_Segment[j].m_StartPoint]+m_Segment[j].m_Weight;
- m_RelaxNum[m_RecvNum] = m_Segment[j].m_SegmentNum;
- m_RecvNum++;
- }
- }
- }
- }
- /***********************************************************************
- Description:
- 返回路径函数
- Arguments:
- NULL
- Returns:
- return lst 返回路径编号
- Notes:
- 松弛路径,记录松弛的路径编号,松弛后标记的路径数量
- ************************************************************************/
- QList<int> RoutePlan::ReturnPath()
- {
- QList<int> lst;
- for(int k = ; k<m_RecvNum;k++)
- {
- for(int i = ;i<m_RecvNum;i++)
- {
- for(int j=;j<=m_Edgenum;j++)
- {
- if(m_RelaxNum[i] == m_Segment[j].m_SegmentNum)
- {
- if(m_DestPoint == m_Segment[j].m_EndPoint)
- {
- lst.push_front(m_Segment[j].m_SegmentNum);
- cout<<"m_SegmentNum = "<<m_Segment[j].m_SegmentNum<<endl;
- m_DestPoint = m_Segment[j].m_StartPoint;
- if(m_Segment[j].m_StartPoint == m_Source)
- {
- return lst;
- }
- }
- }
- }
- }
- }
- cout<<"there is not path form "<<m_Source<<" to "<<m_DestP
路径规划算法之Bellman-Ford算法的更多相关文章
- Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】
题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- 算法笔记_070:BellmanFord算法简单介绍(Java)
目录 1 问题描述 2 解决方案 2.1 具体编码 1 问题描述 何为BellmanFord算法? BellmanFord算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶 ...
- 全局路径规划算法Dijkstra(迪杰斯特拉算法)- matlab
参考博客链接:https://www.cnblogs.com/kex1n/p/4178782.html Dijkstra是常用的全局路径规划算法,其本质上是一个最短路径寻优算法.算法的详细介绍参考上述 ...
- [python] A*算法基于栅格地图的全局路径规划
# 所有节点的g值并没有初始化为无穷大 # 当两个子节点的f值一样时,程序选择最先搜索到的一个作为父节点加入closed # 对相同数值的不同对待,导致不同版本的A*算法找到等长的不同路径 # 最后c ...
- RRT路径规划算法
传统的路径规划算法有人工势场法.模糊规则法.遗传算法.神经网络.模拟退火算法.蚁群优化算法等.但这些方法都需要在一个确定的空间内对障碍物进行建模,计算复杂度与机器人自由度呈指数关系,不适合解决多自由度 ...
- PRM路径规划算法
路径规划作为机器人完成各种任务的基础,一直是研究的热点.研究人员提出了许多规划方法:如人工势场法.单元分解法.随机路标图(PRM)法.快速搜索树(RRT)法等.传统的人工势场.单元分解法需要对空间中的 ...
随机推荐
- 在Windows上安装配置MongoDB
MongoDB下载 下载地址: https://www.mongodb.org/ 找到下载页面,选择对应的平台和版本,选择Package类型msi 安装 按默认或选择安装位置一步步到头 配置环境变量 ...
- WPF C# 命令的运行机制
1.概述 1.1 WPF C# 命令的本质 命令是 WPF 中的输入机制,它提供的输入处理比设备输入具有更高的语义级别. 例如,在许多应用程序中都能找到的“复制”.“剪切”和“粘贴”操作就是命令. W ...
- shell编程企业级实战
如何才能学好Shell编程 为什么要学习shell编程 Shell是Linux底层核心 Linux运维工作常用工具 自动化运维必备基础课程 学好shell编程所需Linux基础 熟练使用vim编辑器 ...
- apose和spire操作word
Apose public void doSaveAsword(Dictionary<string,string> dict) { //--------------------------- ...
- Colorful Bricks CodeForces - 1081C ( 组合数学 或 DP )
On his free time, Chouti likes doing some housework. He has got one new task, paint some bricks in t ...
- 浅析RPC远程过程调用基本原理
在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互联网公司就会发现,公司的系 ...
- git添加秘钥提示Key is already in use
种种原因,需要修改git账号的秘钥. 操作如下: 1.删除系统上.ssh下的known_hosts文件 (一般在这个路径下C:\Users\Administrator\.ssh)如果账号不是Admi ...
- Keil MDK5的ITM调试
https://blog.csdn.net/burgesskzg/article/details/77100453
- Git diff 统计代码更改数量
1. git diff HEAD~2 获取最近两次提交的具体不同 包括增删的文件以及行数以及每行具体的改动 2. git diff --stat 获取文件更改的个数 增加行数 删除行数 3. git ...
- JSON.stringify的三个参数(转载)
前段时间勾股有提到stringify是支持三个参数,刷新的了我的认知,后来查到文档才发现还真的是支持三个参数的. 参考资料: stringify stringify方法顾名思义,就是把JSON序列换, ...