学习笔记:动态规划算法

一、算法简介

1、动态规划是运筹学的一个分支,是求解多阶段决策控制最优化问题的数学方法。

2、各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展。当各个阶段的决策确定后,就组成了一个决策序列,因而也就决定了整个过程的一条活动路线,这样的一个前后关联具有链状结构的多阶段过程称为多阶段决策问题。

3、动态规划在车辆工程技术领域有着广泛的应用,如“两档变速器最优换挡规律”、”混合动力汽车最优能量管理策略“、”栅格地图最优路径搜索“等。

二、算法思想

 1、美国数学家Bellman等人在20世纪50年代初提出了著名的最优化原理,把多阶段决策问题转化为一系列单阶段最优化问题。

2、对最佳路径(最佳决策过程)所经过的各个阶段,其中每个阶段始点到全过程终点的路径,必定是该阶段开始点到全过程终点的一切可能路径的最有路径,即最优决策,这个就是Bellman提出的著名的最优化原理。

3、简而言之,一个最优的策略的子策略也是最优的

三、算法过程

1、逆向寻优,正向求解

2、DP算法本质由三层循环组成

3、第一层遍历每一个阶段

4、第二层遍历第i个阶段的每一个状态

5、第三层循环遍历第i+1个阶段的每一个状态

 以上图为例。

3.1、逆向求解

1、第四阶段

从E到D

 f右下角的4代表第四阶段,总式代表D1到达E的最小距离为5,D2到达E的最小距离为2

2、第三阶段

从C到D,共有6条路线。第三阶段的C有3个状态值,分别讨论经过该状态值到达E点的最优路径。

 3、第二阶段

从B到C,共有9条路线。第二阶段的B有3个状态值,分别讨论经过该状态值到达E点的最优路径。

 4、第一阶段

从A到B,共有三条路线。

 

% Dijkstra算法
% 作者:Ally
% 日期:2021/1/1
clc
clear
close all

%% 阶段-状态定义
stages = 5;
nodes_dist = cell(stages-1,3);

% 第1阶段
nodes_dist{1,1} = 1;
nodes_dist{1,2} = [1,2,3];
nodes_dist{1,3} = [2,5,1];

% 第2阶段
nodes_dist{2,1} = [1;2;3];
nodes_dist{2,2} = [1,2,3];
nodes_dist{2,3} = [12, 14, 10; 6, 10, 4; 13, 12, 11];

% 第3阶段
nodes_dist{3,1} = [1;2;3];
nodes_dist{3,2} = [1,2];
nodes_dist{3,3} = [3, 9; 6, 5; 8, 10];

% 第4阶段
nodes_dist{4,1} = [1;2];
nodes_dist{4,2} = 1;
nodes_dist{4,3} = [5; 2];

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

% 最优路径及其距离值定义
path = cell(stages, 1);
dist = cell(stages, 1);
for i = 1:stages-1
    dist{i, 1} = nodes_dist{i,1};
    dist{i, 2} = inf(length(dist{i, 1}), 1);
    path{i, 1} = nodes_dist{i,1};
end
dist{stages, 1} = 1;  
dist{stages, 2} = 0;  
path{stages, 1} = 1;
path{stages, 2} = 1;
% 根据最后一个阶段,直接初始化

%% 逆向寻优

% 第一层循环:逆向遍历每一个阶段
for i = stages-1:-1:1
    num_states_f = length(nodes_dist{i, 1});    

    % 第二层循环:遍历第i阶段的每一个状态
    for j = 1:num_states_f
        num_states_r = length(nodes_dist{i+1, 1});        
        
        % 第三层循环:遍历第i阶段的第j个状态到第i+1阶段的每一条路径
        for k = 1:num_states_r
            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};            

学习自B站:小黎的Ally

视频链接:路径规划与轨迹跟踪系列算法学习_第3讲_动态规划算法_哔哩哔哩_bilibili

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值