function [p_opt,fval]=dynprog(x,DecisFun,ObjFun,TransFun)

% [p_opt,fval]=dynprog(x,DecisFun,ObjFun,TransFun)

% 自由始端和终端的动态规划,求指标函数最小值的逆序算法递归

% 计算程序。x是状态变量,一列代表一个阶段状态;M-函数

% DecisFun(k,x)由阶段k的状态变量x求出相应的允许决策变量;

% M-函数ObjFun(k,x,u)是阶段指标函数,M-函数TransFun(k,x,u)

% 是状态转移函数,其中x是阶段k的某状态变量,u是相应的决策变量;

% 输出p_opt由4列构成,p_opt=[序号组;最优策略组;最优轨线组;

% 指标函数值组];fval是一个列向量,各元素分别表示p_opt各

% 最优策略组对应始端状态x的最优函数值;

%

%例(参看胡良剑等编《数学实验--使用MATLAB》P180

%先写3个函数

% eg13f1_2.m

% function u=DecisF_1(k,x)

% 在阶段k由状态变量x的值求出其相应的决策变量所有的取值

% c=[70,72,80,76];q=10*[6,7,12,6];

% if q(k)-x<0,u=0:100; %决策变量不能取为负值

% else,u=q(k)-x:100;end; %产量满足需求且不超过100

% u=u(:);

% eg13f2_2.m

% function v=ObjF_1(k,x,u)

% 阶段k的指标函数

% c=[70,72,80,76];v=c(k)*u+2*x;

% eg13f3_2.m

% function y=TransF_1(k,x,u)

% 状态转移方程

% q=10*[6,7,12,6];y=x+u-q(k);

%调用DynProg.m计算如下:

% clear;x=nan*ones(14,4);% x是10的倍数,最大范围0≤x≤130,

% %因此x=0,1,...13,所以x初始化取14行,nan表示无意义元素

% x(1:7,1)=10*(0:6)'; % 按月定义x的可能取值

% x(1:11,2)=10*(0:10)';x(1:12,3)=10*(2:13)';

% x(1:7,4)=10*(0:6)';

% [p,f]=dynprog(x,'eg13f1_2','eg13f2_2','eg13f3_2')

% By X.D. Ding June 2000

k=length(x(1,:));f_opt=nan*ones(size(x));d_opt=f_opt;

t_vubm=inf*ones(size(x));x_isnan=~isnan(x);t_vub=inf;

% 计算终端相关值

tmp1=find(x_isnan(:,k));tmp2=length(tmp1);

for i=1:tmp2

u=feval(DecisFun,k,x(i,k));tmp3=length(u);

for j=1:tmp3

tmp=feval(ObjFun,k,x(tmp1(i),k),u(j));

if tmp<=t_vub,

f_opt(i,k)=tmp;d_opt(i,k)=u(j);t_vub=tmp;

end;end;end

% 逆推计算各阶段的递归调用程序

for ii=k-1:-1:1

tmp10=find(x_isnan(:,ii));tmp20=length(tmp10);

for i=1:tmp20

u=feval(DecisFun,ii,x(i,ii));tmp30=length(u);

for j=1:tmp30

tmp00=feval(ObjFun,ii,x(tmp10(i),ii),u(j));

tmp40=feval(TransFun,ii,x(tmp10(i),ii),u(j));

tmp50=x(:,ii+1)-tmp40;

tmp60=find(tmp50==0);

if ~isempty(tmp60),

tmp00=tmp00+f_opt(tmp60(1),ii+1);

if tmp00<=t_vubm(i,ii)

f_opt(i,ii)=tmp00;d_opt(i,ii)=u(j);

t_vubm(i,ii)=tmp00;

end;end;end;end;end;

fval=f_opt(tmp1,1);

% 记录最优决策、最优轨线和相应指标函数值

p_opt=[];tmpx=[];tmpd=[];tmpf=[];

tmp0=find(x_isnan(:,1));tmp01=length(tmp0);

for i=1:tmp01,

tmpd(i)=d_opt(tmp0(i),1);

tmpx(i)=x(tmp0(i),1);

tmpf(i)=feval(ObjFun,1,tmpx(i),tmpd(i));

p_opt(k*(i-1)+1,[1,2,3,4])=[1,tmpx(i),...

tmpd(i),tmpf(i)];

for ii=2:k

tmpx(i)=feval(TransFun,ii-1,tmpx(i),tmpd(i));

tmp1=x(:,ii)-tmpx(i);tmp2=find(tmp1==0);

if ~isempty(tmp2)

tmpd(i)=d_opt(tmp2(1),ii);

end;

tmpf(i)=feval(ObjFun,ii,tmpx(i),tmpd(i));

p_opt(k*(i-1)+ii,[1,2,3,4])=[ii,tmpx(i),...

tmpd(i),tmpf(i)];

end;end;

matlab实现k-l算法,Matlab实现动态规划算法 (dynamic programming algorithm)相关推荐

  1. 数据结构与算法(C++)– 动态规划(Dynamic Programming)

    动态规划(Dynamic Programming) 理解动态规划的好文:https://www.sohu.com/a/153858619_466939 1.基础 **定义:**递归算法经常会有一些重复 ...

  2. 一道有关动态规划(Dynamic Programming)的网易面试题

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:机器学习算法实验室 最近遇到一道很经典的有关动态规划的网 ...

  3. 动态规划(Dynamic Programming)例题步骤详解

    文章目录 动态规划(Dynamic Programming)浅学 - 学习笔记 题目特点: 1.选择硬币组合问题:(Coin Change) 动态规划题四个核心步骤: 一.确定状态 二.转移方程 三. ...

  4. 动态规划(Dynamic Programming, DP)简介

    动态规划(Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最优子结 ...

  5. 强化学习(二)- 动态规划(Dynamic Programming)

    3.动态规划 3.1 介绍 术语动态规划(DP:Dynamic Programming) 指的是一个算法集合,可以用来计算最优策略,给定一个完美的环境模型,作为马尔可夫决策过程(MDP).经典的DP算 ...

  6. 动态规划(Dynamic Programming)

    我们清楚的知道使用分治算法来求解决斐波那契数列的效率惊人的低,其中的原因是,斐波那契数列分解成的两个子问题并不是独立的,它们之间有着非常多的交集,而在递归中,这些交集会被计算成百上千次,从而降低了算法 ...

  7. LeetCode 动态规划(Dynamic programming)系列题目--C++,Python解法

    LeetCode上有许多态规划(Dynamic programming)的题目,我在这里整合一下 本文章不再更新,请看LeetCode 所有题目总结 LeetCode 所有题目总结:LeetCode ...

  8. 卡塔兰数(Catalan Number)--动态规划(Dynamic Programming)

    -卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡特兰(1814–1894)命名.历史上,清朝数学家明安图(1692年-1763年)在其<割圜密率捷法> ...

  9. matlab中k均值程序代码,K-均值算法Matlab仿真

    代码: X=[35 35 41 49 35 17 55 45 55 20 15 30 25 30 20 50 10 43 55 60 30 60 20 65 50 35 30 25 15 10 30 ...

最新文章

  1. 深度学习目标检测算法综述(论文和代码)
  2. public 函数_UE4精品教程 | 渲染编程(C++篇)【第三卷:从仿函数到std::function再到虚幻4Delegate】...
  3. 输入年份和月份输出该月有多少天python_Python实现用户输入年月日,程序打印出这是这一年的第多少天...
  4. RHEL6上课笔记之background_process_command
  5. 信息学奥赛一本通 1844:【06NOIP提高组】金明的预算方案 | 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案
  6. 实验四+116+陈洁
  7. 读书笔记之深入理解Java虚拟机
  8. 深信服(SCSA)认证学习—基础知识点二
  9. 进销存软件定制开发怎么做?
  10. cmd查看所有数据库 db2_DB2常用命令
  11. 光学软件市场现状研究分析报告-
  12. 计算机电源烧保险,ATX电脑电源保险换了就烧怎么维修?
  13. 【Gym 100015B】Ball Painting(DP染色)
  14. sql如何查看数据库表的关联关系?
  15. ruby中的符号_Ruby中的凡人和不朽符号
  16. 载图工具snipaste
  17. php printer_open 用法_使用printer_write()函数直接从PHP打印
  18. 如何编写一个好的软件设计文档
  19. 数学物理方法 04 解析延拓
  20. mysql 从入门到精通之 Linux环境安装mysql数据库

热门文章

  1. GaussDB(DWS)中共享消息队列实现的三大功能
  2. 带你学会区分Scheduled Thread Pool Executor 与Timer
  3. 自从安上了“AI”,这些商务经理天天按时下班了
  4. Python进阶丨如何创建你的第一个Python元类?
  5. 算力用多少买多少,竞享实例太香了
  6. Memcached与Redis有什么区别
  7. cef如何隐藏html,CefSharp访问加密的HTML/JS/CSS文件
  8. SpringBoot自动装配探究
  9. 二叉树的创建与遍历(C++)
  10. Poisson方程五点差分格式例题及解答