最近由于工作需要一直在研究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算法的更多相关文章

  1. Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】

    题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...

  2. Bellman - Ford 算法解决最短路径问题

    Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...

  3. Bellman—Ford算法思想

    ---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...

  4. poj1860 bellman—ford队列优化 Currency Exchange

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22123   Accepted: 799 ...

  5. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

  6. 算法笔记_070:BellmanFord算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 具体编码   1 问题描述 何为BellmanFord算法? BellmanFord算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶 ...

  7. 全局路径规划算法Dijkstra(迪杰斯特拉算法)- matlab

    参考博客链接:https://www.cnblogs.com/kex1n/p/4178782.html Dijkstra是常用的全局路径规划算法,其本质上是一个最短路径寻优算法.算法的详细介绍参考上述 ...

  8. [python] A*算法基于栅格地图的全局路径规划

    # 所有节点的g值并没有初始化为无穷大 # 当两个子节点的f值一样时,程序选择最先搜索到的一个作为父节点加入closed # 对相同数值的不同对待,导致不同版本的A*算法找到等长的不同路径 # 最后c ...

  9. RRT路径规划算法

    传统的路径规划算法有人工势场法.模糊规则法.遗传算法.神经网络.模拟退火算法.蚁群优化算法等.但这些方法都需要在一个确定的空间内对障碍物进行建模,计算复杂度与机器人自由度呈指数关系,不适合解决多自由度 ...

  10. PRM路径规划算法

    路径规划作为机器人完成各种任务的基础,一直是研究的热点.研究人员提出了许多规划方法:如人工势场法.单元分解法.随机路标图(PRM)法.快速搜索树(RRT)法等.传统的人工势场.单元分解法需要对空间中的 ...

随机推荐

  1. k8s部署dashboard:v1.5.1

    1.准备dashboard.yaml文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: # Keep the name in sy ...

  2. python3 员工信息表

    这是最后一条NLP了......来吧 十二,动机和情绪总不会错,只是行为没有效果而已 动机在潜意识里,总是正面的.潜意识从来不会伤害自己,只会误会的以为某行为可以满足该动机,而又不知道有其他做法的可能 ...

  3. Django教程01-全流程

    目录 1.Django简介 1.1. Django安装 2. 创建一个基础的Django项目 2.1. 初始化项目 2.2. 设计数据库 2.2.1. 设计目标表 2.2.1. 创建一个数据库 2.2 ...

  4. 如何在element-UI 组件的change事件中传递自定义参数

    以select为例,如果select写在循环里,触发change事件时可能不只需要传递被选中项的值,还要传递index过去,来改变同一循环中的其他标签的状态. 下面这样写是无效的: @change=& ...

  5. python从开始到放弃想标题的day12

    上次有说道函数的返回值,但是不是所有的数据类型都有返回值,一些常用的比如str基本都有返回值,list基本都没有返回值,dict基本都有返回值,还有就是函数和函数之间的数据是互不影响的,哪怕是一个函数 ...

  6. Linux命令之常用篇

    一.文件和目录 1. cd命令 它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径. 指令 说明 cd /home 进入‘home’目录 cd .. 返回上一级目录 ...

  7. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  8. Linux:Day18(上) dns服务基础进阶

    DNS:Domain Name Service,协议(C/S,53/udp,53/tcp):应用层协议. BIND:Bekerley Internat Name Domain,ISC(www.isc. ...

  9. Doctype知识点总结

    DOCTYPE是document type (文档类型) 的缩写.<!DOCTYPE >声明位于文档的最前面,处于标签之前,它不是html标签.主要作用是告诉浏览器的解析器使用哪种HTML ...

  10. Kubernetes 网络排错指南

    本文介绍各种常见的网络问题以及排错方法,包括 Pod 访问异常.Service 访问异常以及网络安全策略异常等. 说到 Kubernetes 的网络,其实无非就是以下三种情况之一 Pod 访问容器外部 ...