自动驾驶-决策规划算法十二:动态规划算法(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