动态规划简介

动态规划是求解多阶段决策问题的一种最优化方法。多阶段决策过程是指这样一类特殊的决策问题:由问题的特性可将整个决策过程按时间、空间等标志划分为若干相互关联又相互区别的阶段。在它的每一个阶段都需要做出决策,从而使整个过程达到最好的效果。由于各阶段决策间有机地联系,本阶段的决策会影响到下一段的决策。所以在作决策时不仅要考虑本阶段最优,还要考虑对最终目标的影响。

递归算法

算法描述:
首先要明确的是问题可以分为几个阶段,分阶段的依据可以是时间,空间或者逻辑关系,例如将10枚金币分给4个商人这个过程,可以先把金币分给商人Tony,再在剩下的钱里面分一部分给Steven,再依次给Bruce和Jimmy,这样就构造出了简单的逻辑关系。阶段确定之后再看每个阶段所有可能的状态,用k表示阶段的序号,sk表示该阶段的状态,Sk表示阶段k所有可能状态的集合。决策就是对于阶段k所处的状态sk进行的操作,记作uk(sk),对应的Dk(sk)是该阶段所能采取的策略集合。策略则是该过程依次进行的所有决策的集合p1n{u1(s1),u2(s2),…un(sn)},所有可选的策略集合为P1n.
状态转移方程:动态规划中本阶段的状态是上一阶段状态和上一阶段的决策结果。如果给定了第k阶段的状态 ,本阶段决策 ,则第k+1阶段的状态 也完全确定,关系为 sk+1=Tk(sk,uk)称为状态转移方程。
指标函数:
用于衡量所选定策略优劣的数量指标称为指标函数,它分为阶段指标函数和过程指标函数两种。阶段指标是指k阶段 从状态sk 出发,采用决策uk 时的效益,用 d(sk,uk)表示。对于任意一个给定的k,从第k阶段到第n阶段的过程称为一个原过程的后部子过程。V1n(s1,p1n)表示初始状态为 采用策略p1n时原过程的指标函数值。
最优指标函数
记为 fk(sk),它表示从第k阶段状态 采用最优策略pkn 到过程终止时的最佳效益值。当k=1时,是从初始状态到全过程结束时整体最优函数。
核心算法可用以下公式描述:
举例如下:

这是动态规划的经典例题:求A->E最短路径,而且形式十分简单,阶段也比较明显:5个阶段A->B->C->D->E。接下来用递推算法加以实现:

clear;clc;
%决策集合利用三维矩阵存储
Data=zeros(5,5,4);
Data(1,1:3,1)=[3 2 1];
Data(1:3,1:2,2)=[4 3;1 3;3 5];
Data(1:2,1:3,3)=[2 5 3;1 4 2];
Data(1:3,1,4)=[3;1;5];
Len=zeros(4,4);%路径长度
Route=zeros(5,5,4);%路径记录
choice=[1 3 2 3];%每个阶段可选操作数量
%开始
for i=4:-1:1if i==4for j=1:choice(i)Len(i,j)=Data(j,1,4);Route(j,1,i)=1;endelsefor j=1:choice(i)Len(i,j)=min(Data(j,1:choice(i+1),i)+Len(i+1,1:choice(i+1)));ind=find((Data(j,1:choice(i+1),i)+Len(i+1,1:choice(i+1)))==Len(i,j));Route(j,ind,i)=ones(size(ind));endend
end
way=[];
ind=2;
way(end+1)=ind;
%从路径记录中读出路径
for i=2:4ind=find(Route(ind,1:choice(i),i)==1);way(end+1)=ind;
end

结果

Len =8     0     0     07     6     8     05     4     0     03     1     5     0
way =2     1     1     1

从A开始的最短路径为8,从B1开始的最短路径为7,从B2开始的最短路径为6,依此类推。具体路径为A->B2->C1->D1->E。分的阶段再多一些,每个阶段的可能状态在多一些,枚举算法将会计算所有可能路径的长度,每条路径的节点数量为阶段数k,然后从中取最小。该算法虽然计算路径的数量,但每条路径的节点数量都是2。而且当走到B1点的时候不必再向下一一探索,直接选择已经求出的最短路径即可。
从上面的算法描述可以很快判断出这就是递归算法,针对下面一道更经典,更容易的例题,分别用递归与递推来实现:

递归:

global Route;%路线记录
global Data;%数据集
global Flag;%路径长度记录,同时也是是否再次需要计算的一个标志
global sum;%计算次数
sum=0;
Data=[13 0 0 0 0;11 8 0 0 0;12 7 26 0 0;6 14 15 8 0;12 7 13 24 11];
Route=zeros(size(Data));
Flag=zeros(size(Data));
pyramid(1,1);
for i=1:size(Data,1)Route(i,find(Flag(i,:)==max(Flag(i,:))))=1;
end
function Sum=pyramid(i,j)
global Data;
global Flag;
global sum;
if Flag(i,j)>0%如果已经计算过以该该点为起点的最短路程,直接赋值即可,避免重复计算Sum=Flag(i,j);return;
end
if i==size(Data,1)%递归返回Sum=Data(i,j);Flag(i,j)=Sum;sum=sum+1;return;
elseSum=Data(i,j)+max(pyramid(i+1,j),pyramid(i+1,j+1));Flag(i,j)=Sum;sum=sum+1;return;
end

结果(将金字塔都推到左面对齐):

Flag =86     0     0     0     057    73     0     0     039    46    65     0     018    27    39    32     012     7    13    24    11
Route =1     0     0     0     00     1     0     0     00     0     1     0     00     0     1     0     00     0     0     1     0

递推:

clear;clc;
Data=[13 0 0 0 0;11 8 0 0 0;12 7 26 0 0;6 14 15 8 0;12 7 13 24 11];
Route=zeros(size(Data));
Flag=zeros(size(Data));
n=size(Data,1);
sum=0;
for i=n:-1:1for j=1:iif i==nFlag(i,j)=Data(i,j);elseFlag(i,j)=Data(i,j)+max(Flag(i+1,j),Flag(i+1,j+1));sum=sum+1;endend
end
for i=1:size(Data,1)Route(i,find(Flag(i,:)==max(Flag(i,:))))=1;
end

最后一例:将拥有非连续目标函数的线性规划问题转为动态规划问题(思路和之前算法描述里面商人分金币的例子完全一致,不必赘述,直接递归实现)
资源分配问题
资源分配问题就是将数量一定的资源恰当地分配给若干个使用者,而使总的目标函数值为最优。资源分配问题本属于静态规划,但当我们认为引进时间因素后,可把它们看成是按阶段进行的多阶段决策问题。
例:某市电信局有4套通信设备,准备分给甲、乙、丙三个地区支局,事先调查了各支局的经营情况,并对各种分配方案作了经济效益的估计,如表所示其中设备数为0时的收益,指已有的经营收益,问应如何分配这四套设备,使总的收益为最大?

clear;clc;
num=[];
[num,out]=resource_distribution(1,num);
function [newnum,out]=resource_distribution(i,num)
if i==4out=0;newnum=num;return;
elsecompare=[];NEWNUM=zeros(1,3,length(0:4-sum(num)));for k=0:4-sum(num)temp=num;if i<3temp(end+1)=k;else temp(end+1)=4-sum(num);end[temp_num,value]=resource_distribution(i+1,temp);NEWNUM(:,:,k+1)=temp_num;compare(end+1)=value+profit(i,k+1);endind=find(compare==max(compare));newnum=NEWNUM(:,:,ind(1));out=max(compare);return
end
function profit=profit(index,num)
A=[38 41 48 60 66;40 42 50 60 66;48 64 68 78 78];
profit=A(index,num);

结果:

>> outout =164>> numnum =3     0     1

最优分配:给甲3个,给乙0丙

后记

这里是用matlab进行的算法实现,matlab完全不需要编程起点,直接上手就能用,以上全都是最简单的单一解,对于具有同样的最优指标,很可能有多个解,就竞赛而言,给出一种可行方案已经足够,但本着科学的精神,我无法允许自己将如此简单的题目还做的半吊子!在学习相关数据结构知识后,必将以上垃圾代码更新。最后想吐槽一下自己,高考不咋地,被分到了数学专业,每天各种定理,计算。前三个学期光顾着搞绩点,结果数学基础知识学了一堆,动手解决问题的能力却垃圾地不行,写以上这样的小程序还调了很久。自己的目前的目标就是往机器学习方面发展,可是没有人领着入门,只能马上独自啃书,门要靠自己打开,我大学不想再后悔一次了。嘴炮说再多也是废话,这是我第一次,也是最后一次在网络上表达自己真实的感受,今后只能用行为来证明自己。

数学建模 最优化方法:动态规划 学习笔记相关推荐

  1. 数学建模之线性规划学习笔记

    前言 线性规划可能看起来很简单,但其中也不乏比较精妙的处理方法.上了数模选修课之后才知道自己原来对建模的理解太浅,只知道想一种方法算出一个结果,而没有仔细考虑结果的合理性与对结果的分析.接下来简单介绍 ...

  2. 数学建模各类算法学习笔记(附matlab代码)

    目录 插值和拟合 线性规划 综合评价1:层次分析法(Analytic Hierarchy Process)AHP 综合评价2:Topsis(优劣解距离法) 最优解问题1:遗传算法Genitic alg ...

  3. 数学建模——BP神经网络学习笔记

    一.BP神经网络简述 人工神经元概述 归纳一下生物神经元传递信息的过程:生物神经元是一个多输入.单输出单元.常用的人工神经元模型可用下图模拟. 当神经元j有多个输入xi(i=1,2,-,m)和单个输出 ...

  4. MOOC数学建模与实验---学习笔记---整理汇总表

  5. 数学建模图论算法学习总结

    数学建模图论算法学习总结 图论基本知识 B站视频: https://www.bilibili.com/video/av18374161/?p=35 https://www.bilibili.com/v ...

  6. 自适应动态规划学习笔记(3)

    @TOC 自适应动态规划学习笔记(3) 第三天(图全是偷的) 图1 ADP的三个部分 Model Network  书接上回,图(1)中所示的Model Network就是对于系统公式(1)xk+1= ...

  7. 数学建模 随机动态规划

    随机动态规划 运用随机动态规划的分析方法,求解随机动态规划模型的最优解是一种比较常见的数学建模问题.例如,在实际应用中,经常会遇到某些多阶段决策过程中出现随机因素的情况,而动态规划的方法也可以处理这种 ...

  8. 【数据挖掘】心跳信号分类预测 之 建模调参 —— 学习笔记(四)

    目录 四.建模调参 4.1 内容简介 4.2 模型原理与性质概述 4.2.1 分类模型 4.2.2 时间序列模型 4.2.3 推荐教材 4.3 模型对比与性能评估 4.3.1 逻辑回归 4.3.2 决 ...

  9. 数据挖掘训练营建模调参学习笔记

    本学习笔记为阿里云天池龙珠计划数据挖掘训练营的学习内容,学习链接为:-天池实验室-实时在线的数据分析协作工具,享受免费计算资源 (aliyun.com)https://tianchi.aliyun.c ...

  10. pands 画图 调整大小_关于数学建模的画图学习建议

    数学建模,PPT,visio, matlab就够用了,其他根据特点备选.学会PPT里面的形状操作,搭建常用的示意图,还有调色等. matlab二维画图,三维画图会几个命令就行. 其中二维画图用主要用p ...

最新文章

  1. 223. Rectangle Area
  2. TensorFlow中loss与val_loss、accuracy和val_accuracy含义
  3. OpenGL编程指南1:OpenGL简介
  4. 【机器视觉】 dev_update_var算子
  5. UnityShader之遮挡透明
  6. linux 中文输入鼠标跳动,解决wps for linux 中文输入法光标不跟随的问题
  7. Webshell实现与隐藏探究
  8. indexOf的用法
  9. 2021临泉一中高考成绩查询,临泉三所省级示范高中高考成绩揭晓!
  10. 三星nc10 装linux,三星NC10安装快捷键驱动
  11. php ldap 登陆验证,LDAP用户验证功能简介
  12. Unity中的宏定义
  13. matlab中的unique
  14. unique中译_unique是什么意思_ unique的翻译_音标_读音_用法_例句_爱词霸在线词典...
  15. 利用Adobe Acrobat 7.0 Professional 自带的导出图片的功能(转)
  16. 图片特征提取整理(持续更新....)
  17. linux触摸板设置密码程序6,Touchégg: Linux 上触摸板/屏的多指手势
  18. ALWAYSON删除可用性数据库,可用性副本
  19. 计算机课作业要求做一张简报,教案作业检查简报模板
  20. 【项目】---文档快速搜索工具

热门文章

  1. lammps教程:EAM势参数设置详解
  2. Mac里的airdrop传输文件
  3. 天猫京东618下单金额近万亿;中国 5G 毫米波芯片研发成功;阿里P8招聘私人助理被辞退 | EA周报...
  4. 数据结构课程设计——药店的药品销售统计系统(排序应用)
  5. 全面剖析《自己动手写操作系统》第五章---makefile文件
  6. 字体arial不支持样式regular的解决方法
  7. Unity在NGUI中默认动态字体Arial字体显示不完整解决方案
  8. 5行python代码帮你搞定百度文库复制问题
  9. 记一次jenkins构建无权限问题
  10. 高德地图:No implementation found for void com.autonavi.ae.gmap.GLMapEngine.nativeInitParam