一、算法简介
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