路径规划与轨迹跟踪 3 —— 全局路径规划_动态规划算法


动态规划算法

算法思想

  • 适用于多阶段决策,即每一个阶段决定什么状态,把每个阶段的状态确定了之后,再连起来,就是多阶段决策的最优解。划分为多个阶段,求每个阶段的最优值。

  • 第 1 阶段

在这里插入图片描述

  • 第 2 阶段
    在这里插入图片描述
  • 第 3 阶段
    在这里插入图片描述
  • 第 4 阶段
    在这里插入图片描述

算法讲解

% 动态规划DP算法

clc
clear
close all

%% 阶段 - 状态定义(定义图的连接方式)
stages = 5; % A、B、C、D、E 一共5个阶段
nodes_dist = cell(stages, 3); % 定义节点和距离的 4 * 3 元胞数组
% 视频里 nodes_dist = cell(stages,3) 5 * 3的元胞数组 

%1 阶段
%1 阶段到第 2 阶段有 3 条路可选
nodes_dist{1,1} = 1;%1 个阶段有 1 个状态值,按行定义
nodes_dist{1,2} = [1,2,3];%2 个阶段有 3 个状态值,按列定义 1,2,3,一共有 1 * 3个值
nodes_dist{1,3} = [2,5,1];% 3个状态值对应的距离值分别是 2,5,1

%2 阶段
%2 阶段到第 3 阶段有 9 条路可选
nodes_dist{2,1} = [1;2;3];%2 阶段有 3 个状态值,按行定义
nodes_dist{2,2} = [1,2,3];%3 阶段有 3 个状态值,按列定义,一共有 3 * 3 = 9 个值
nodes_dist{2,3} = [12, 14, 10; 6, 10, 4; 13, 12, 11];% 9 个状态值对应的距离值

%3 阶段
%3 阶段到第 4 阶段有 6 条路可选
nodes_dist{3,1} = [1;2;3];%3 阶段有 3 个状态值,按行定义
nodes_dist{3,2} = [1,2];%4 阶段有 2 个状态值,按行定义,一共有 3 * 2 = 6 个值 
nodes_dist{3,3} = [3, 9; 6, 5; 8, 10];% 6 个状态值对应的距离值

%4 阶段
%4 阶段到第 5 阶段有 2 条路可选
nodes_dist{4,1} = [1;2];%4 阶段有 2 个状态值,按行定义
nodes_dist{4,2} = 1;%5 阶段有 1 个状态值,按行定义,一共有 2 * 1 = 2 个值
nodes_dist{4,3} = [5; 2];

%5 阶段
nodes_dist{5,1} = 1;
nodes_dist{5,2} = 1;
nodes_dist{5,3} = 0;

% 最优路径及其距离值定义
path = cell(stages, 1);% 5*1的元胞数组
dist = cell(stages, 1);
for i = 1:stages-1 % nodes_dist 是 cell(4,3)
    dist{i, 1} = nodes_dist{i,1};
    % length(a),求的是二维数组最大维度的元素个数,length * 1的inf矩阵
    dist{i, 2} = inf(length(dist{i, 1}), 1);% 初始化均设置为inf
    path{i, 1} = nodes_dist{i,1};% 路径
end
% 初始化第 5 阶段
dist{stages, 1} = 1; % (5,1)的元胞数组 设为1
dist{stages, 2} = 0;  
path{stages, 1} = 1;
path{stages, 2} = 1;

% 根据最后一个阶段,直接初始化

%% 逆向寻优
% num_states_f 表示前面一个状态数目,num_states_r 表示后面一个状态数目
% 当 i = 4时,num_states_f = 2,num_states_r = 1,第4阶段有2个状态,第5阶段有1个状态

% 第一层循环:逆向遍历每一个阶段( 这里阶段理解为箭头,4个阶段)
for i = stages-1:-1:1 % 4,3,2,1
    num_states_f = length(nodes_dist{i, 1}); % i=4, f=2(4阶段状态数目); i=3, f=3, f表示前面   

    % 第二层循环:遍历第i阶段的每一个状态
    for j = 1:num_states_f 
        num_states_r = length(nodes_dist{i+1, 1}); % f=2,j=1:2,r=1(5阶段状态数目)       
        
        % 第三层循环:遍历第i阶段的第j个状态到第i+1阶段的每一条路径
        for k = 1:num_states_r % 初始时,i=4(第i阶段),j=1(第i阶段状态),k=1(第i+1阶段状态)
% 表示 第i+1阶段第k个状态的值 + 第i阶段的第j个状态的值到第i+1阶段第k个状态的值 < 第i阶段当前的第j个状态的值
            if  nodes_dist{i,3}(j,k) + dist{i+1,2}(k,1) < dist{i,2}(j,1)
                dist{i,2}(j,1) = nodes_dist{i,3}(j,k) + dist{i+1,2}(k,1);
                path{i, 2}(j,:) = [j, path{i+1, 2}(k,:)];
            end
        end
    end
end
            
%% 正向求解
path_opt =  path(1,:);    
dist_opt =  dist{1,2};            
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021 Nqq

你的鼓励是我学习的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值