自动驾驶-决策规划算法十二:动态规划算法(C++)

本文探讨了无人驾驶决策规划中的动态规划算法,用于全局路径规划中找到起点到终点的最短路径。文章介绍了算法的基本概念,并提供了C++实现的动态规划头文件和源代码。通过实例展示了动态规划在稠密图中的应用,并与Floyd算法进行了对比。最后,文章展示了求解结果和最短路径的可视化效果。
摘要由CSDN通过智能技术生成

自动驾驶-决策规划算法十二:动态规划算法(C++)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

附赠自动驾驶学习资料和量产经验:链接

摘要:

本文介绍无人驾驶决策规划算法中的动态规划算法,动态规划是一种很经典的算法思路,通常用于求解多阶段决策过程最优化问题,应用非常广泛,在无人驾驶中通常用于在全局规划时求解最短路径问题。值得注意的是,动态规划的规划和无人驾驶中的路径规划,不是一个概念,但后者可以应用前者的思路。

Floyd算法就是用的动态规划的思路,是求解一个给定图中任意两点间的最短路径,而本文的动态规划算法稍有区别,是用于求解一个给定图中,给定的起点和终点之间的最短路径,因为这更符合无人驾驶中全局路径规划的问题。

之前Floyd用的是C语言,而本文用的是C++。

如有错误或者遗漏之处,欢迎指出。


基本概念:

/*

动态规划:求解多阶段决策过程最优化问题;

这里的规划不是无人车中的路径规划,但无人车做全局规划时可以用路径规划;

一个最优策略的子策略也是最优的;

逆向寻优,正向求解,从右往左逐阶段寻找最短路径;

三层循环:

1,遍历邻接矩阵的列;

2,遍历邻接矩阵的行;

3,遍历图的每个元素,也就是中间数;

Floyd算法就是一种动态规划,是求任意两个点之间的最短路径,而本文要求解的是给定的起点和终点之间的最短路径;

稠密图效果较佳;

为了方便,本文的图用邻接矩阵表达;

*/

动态规划.h

#pragma once
#include<iostream>
#include<graphics.h>
#include<vector>
using namespace std;

#define VertexType int	//图中顶点的数据类型
#define VRType int //对于无权图,用 1 或 0 表示是否相邻;对于带权图,表示权值
constexpr auto INFIN = 9999; //定义无穷大的数值
constexpr auto MAX_VERTEX_NUM = 20;	//顶点的最大个数
constexpr auto Swidth = 1200;
constexpr auto Sheight = 800;

class MGraph //图的顺序存储结构
{
public:
	MGraph();
	VertexType vexs[MAX_VERTEX_NUM]; //一维数组,存储图中顶点数据
	VRType d[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //二维数组,记录顶点之间的权值
	int vexnum = 13;	//记录图的顶点数
	int arcnum = 0;//记录图的弧(或边)数

	int widthSide = 50;//两边留的距离
	int widthDis = (Swidth - widthSide * 2) / 5;//间隔
	int arr[MAX_VERTEX_NUM][2];//顶点的坐标
};

class DP
{
public:
	DP();//默认用给定的图,在这里初始化
	int LocateVex(VertexType v); //判断顶点在二维数组中的位置,手动建图时才会用到
	void CreateUDG();//构造有向带权图,默认用给定的图
	void PrintGrapth(); //打印整个图
	void DrawGrapth();//绘制整个图
	void DPshortest();//动态规划求最短路径
	void printMatrix();//打印矩阵
	void showResult();//显示结果

public:
	MGraph G;//创建图的对象
	TCHAR num[8] = { 0 };//文字变量
	RECT rX, rY;//顶点文字
	RECT aX, aY;//弧的文字
	int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//存储顶点间的最小路径
	int P[MAX_VE
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值