什么是动态规划
1、动态规划的定义
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。 20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题逐个求解,创立了解决这类过程优化问题的新方法——动态规划。2、动态规划的特性
动态规划是求解某类问题的一种方法,是考察问题的一种途径,它不是一种特定的算法。类似于蒙特卡罗,是一种思想方法,不是一种固定的算法。 二动态规划问题
1、问题示例
(1)最短路径问题
(2)生产计算问题
(3)背包问题
2、动态规划解决问题一般思路
一个动态规划模型主要包含以下要素:阶段、状态、决策、策略、状态转移方程、指标函数和最优值函数、最优策略和最优轨线、递归方程。
动态规划的解题思路是把多阶段问题进行变换,变换之后为一系列相互联系的单阶段问题,再逐个解决各阶段问题,从而解决整个问题。
一问题示例种最短路径为例,从A到B可以分为一个阶段考虑,从B到C可以分为一个阶段考虑,最后即可考虑到。
3、动态规划与静态规划的异同
动态规划与 静态规划(线性和非线性规划等)研究的对象本质上都是在若干约束条件下的函数极值问题。两种规划在很多情况下原则上可以相互转换。动态规划可以看作求决策U1,U2,……,Un使指标函数 V1n(x1,u1,u2,……,un)达到最优(最大或最小)的 极值问题,状态转移方程、端点条件以及允许状态集、允许决策集等是约束条件,原则上可以用 非线性规划方法求解。一些静态规划只要适当 引入阶段变量、状态、决策等就可以用动态规划方法求解。 三动态规划问题解决示例
以问题示例三种背包问题为例(问题求解参考网络博客,参考文献详见文末)
假设五种金银物品以a,b,c,d,e的顺序排放好,那我们可以以金银物品的顺序作为系统的阶段,即第一个物品
(a)作为第一阶段、第二个物品;
(b)作为第二阶段、第三个物品;
(c)作为第三阶段段、… ,那么这个题就划分为了5个阶段了。那系统的状态x(k)为背包当前重量,则
状态转移方程为 x(k+1) = x(k) + u(k);
阶段指标为 v(x(k), u(k)) = x(k);
总目标函数f(x(k))为从第k段的状态x(k)出发到过程终结的背包所装下的金银总价值最大,即f(x(k)) = max(v(x(k), u(k)) + f(x(k+1)))。
符号说明:
符号 | 意义 |
x(k) | 第k阶段的状态,状态就是第k阶段时的背包的重量 |
u(k) | 第k阶段的决策,决策取1表示将第k个物品放入背包,取0则相反 |
v(x(k), u(k)) | 第k阶段的阶段指标,也就是决策的取到的第k个物品的价值 |
f(x(k)) | 总目标函数,即背包承重的范围内要能装走最大价值的金银财宝 |
代码展示:
%此代码来源于网络博客
clear,clc
a = [1 2 3 4 5; % 第一行是金银类型,用来表示系统的状态
2 2 6 5 4; % 第二行是金银重量
6 3 5 4 6]; % 第三行是金银价值
b = perms(a(1, :));
v = [];
for i = 1:size(a,2)-1
c = b;
id1 = find(c <= i);
id2 = find(c > i);
c(id1) = 0;
c(id2) = 1;
c = unique(c,'rows');
v = [v; c]; % 用0、1变量表示第k状态的决策
end
v = [ones(1,5); v; zeros(1,5)]; % 所有阶段的所有状态都存放在v中
F = [];
for i = 1:size(v,1)
if (a(2,:) * v(i,:)') <= 10 % 约束条件(背包的承重范围内)
f = (a(3,:) * v(i,:)'); % 阶段指标
F = [F, f]; % 指标函数
end
end
best_value = max(F) % 指标函数最优值
计算结果:
best_value =15
下面是一些写的比较好的博客,希望对大家有用
知乎对于动态规划的博客:https://www.zhihu.com/question/23995189
彻底学会动态规划:https://blog.csdn.net/baidu_28312631/article/details/47418773
动态规划解题框架:https://blog.csdn.net/ryontang/article/details/107745991
动态规划套路详解:https://juejin.im/post/6844903916908331015
动态规划从菜鸟到老鸟:https://blog.csdn.net/u013309870/article/details/75193592
文中部分示例来源于网络,只用于学习交流!由于能力有限,部分地方难免出现错误,请大家批评指正!
关于MATLAB的学习:
大家可以关注我们的知乎专栏–数据可视化和数据分析中matlab的使用:https://zhuanlan.zhihu.com/c_1131568134137692160
欢迎大家加入我们的MATLAB学习交流群:
953314432
扫码关注我们更多精彩等待你发现 出品: Asoul水云天课堂工作室