大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
数学建模(7)动态规划以及matlab实现
概念
运筹学分支,求解多阶段决策过程最优化问题的数学方法
思路将复杂的多阶段决策问题分解为一系列的简单,离散的单阶段决策问题,顺序求解法
在考虑本阶段最优的情况下兼顾整体最优的解决方法
主要处理离散连续型问题
特点没有特定的算法,需要具体问题具体分析
无后效性马尔科夫性,系统从某个阶段后的发展仅与本阶段所处的状态和以后的决策所做的决策所决定,与之前的状态无关。
具体问题企业管理,资源分配,路径优化,排序问题,最优控制
步骤思路
1.将问题转化为动态规划类型的问题
2.划分阶段
3.确定状态(若干状态)
4.决策,决策变量(描述决策变化的量),允许决策集合(决策变量的一定允许取值范围,由约束条件决定)
5.策略和允许策略集合(决策序列)全过程策略,k部子策略
6.状态转移方式,从一个状态转移到另一个状态的转移的方式
7.状态转移方程,描述状态转移过程由状态转移方程描述
8.指标函数,描述决策效果的函数
阶段指标函数(阶段效应):描述第k步处于某状态且做出某策略时的指标
过程指标函数(目标函数):描述第k步处于某状态且做出某策略时,目前状态距离目标状态的多少
动态规划的最优性原理
无论过去的状态跟决策如何,对前面的决策所形成的状态而言,后续决策必须构成最优策略。
对于动态规划而言,重要的并不是所谓的模板,比较重要的是在动态规划中,推导的思维方式。在个人看来动态规划实际就是编程解决大量数据的决策问题的一种重要编程理念和编程思路。
在动态规划的思路即是反向确立后三次状态改变的两次决策量的最优决策,确定了该最优决策之后每次反向推导一步,穷举倒数第三次的不同决策所带来的状态变化量,与之前所得到的的最优决策量进行加成处理(可能加和也可能相减或相乘相除,具体视情况而定),将所得后三次决策的总决策量对比选取最优值,作为后四步的最优状态变化值。先前重复推导,最终得到该问题的最优策略。
最好还是通过例题来理解:
例:
首先本文将如上问题转换为动态规划问题,首先确定本文所解决问题总共要对三个公司进行设备分配,共分为两个求最优决策的阶段。其次确定指标函数:给每个厂分配相应数量所得到的的收益。
状态变量:每个厂分配到的设备的数量,
决策变量:每一阶段进行决策改变时该厂所分配到设备
由此可以首先推导出每次做出决策后的状态转移方程,
求设备收益的最大化即是求在两个阶段的中做出的所有决策,进而得到各阶段最优的目标函数,最后得到最优策略和最优值。据此本文成功将原本的问题转换为动态规划问题。针对该问题本文决定采用倒推穷举法,利用matlab编程得到最优策略与最优解
在matlab求解中本文首先利用嵌套循环语句筛选出第一阶段和第二阶段的最优决策,并利用选择语句得到此时的对应状态变量。
(1)当可分配设备数为4时,最终得到最优决策为(0,1,3)即1分厂不分配设备,2分厂分配1个设备,3分厂分配3个设备,得到最优解为13万元
(2)当可分配设备数为5时,最终得到最优决策为(1,1,3)即1分厂分配1台设备,2分厂分配1台设备,3分厂分配3个设备,得到最优解为16万元
(3)当可分配设备数为6时,最终得到最优决策为(1,2,3)或者(2,1,3)即1分厂分配1台设备,2分厂分配2台设备,3分厂分配3个设备或者1分厂分配2台设备,2分厂分配1台设备,3分厂分配3个设备,得到最优解为18万元
Matlab代码:
a = zeros(1,5); %建立一个1*5的空矩阵用于储存f1(x)+g2(4-x)的结果
f1=[0 3 5 6 7 6 5]
f2=[0 4 6 7 8 9 10]
f3=[0 2 5 9 8 8 7] %输入
s1 = zeros(1,5);
s2 = zeros(1,5); %分别建立两个1*5空矩阵储存f2(x)+f3(x)以及min(g2)
i = 0;
s = 0;
z = 0;
s3=[0,0,0]; %建立一个1*3空矩阵用于记录每一状态的最佳决策
while (i<=4) %利用两个循环语句分别计算出min(g2)再与f1(x)相加
j=4-i;
while(j>=0)
k=4-i-j;
s1(j+1)=f2(j+1)+f3(k+1)
if s1(j+1)>z %利用if语句找到g2最小时对应的给2,3厂分配的设备数
z=s1(j+1)
s3(2)=j
s3(3)=k
end
j=j-1;
end
s2(i+1)=max(s1)
if s2(i+1)>s %同理利用if语句找到f1(x)的最佳决策
s=s2(i+1);
s3(1)=i;
end
s1=zeros(1,5); %将s1置零记录下一次的g2的值
a(i+1) = f1(i+1)+s2(i+1)
i=i+1;
end
a
s3
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/226807.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...