DYNPROG.M
上传用户:xmmingye
上传日期:2019-08-09
资源大小:2k
文件大小:3k
源码类别:

matlab例程

开发平台:

Matlab

  1. function [p_opt,fval]=dynprog(x,DecisFun,ObjFun,TransFun)       
  2. % [p_opt,fval]=dynprog(x,DecisFun,ObjFun,TransFun)
  3. % 自由始端和终端的动态规划,求指标函数最小值的逆序算法递归
  4. % 计算程序。x是状态变量,一列代表一个阶段状态;M-函数
  5. % DecisFun(k,x)由阶段k的状态变量x求出相应的允许决策变量;
  6. % M-函数ObjFun(k,x,u)是阶段指标函数,M-函数TransFun(k,x,u)
  7. % 是状态转移函数,其中x是阶段k的某状态变量,u是相应的决策变量;
  8. % 输出p_opt由4列构成,p_opt=[序号组;最优策略组;最优轨线组;
  9. % 指标函数值组];fval是一个列向量,各元素分别表示p_opt各
  10. % 最优策略组对应始端状态x的最优函数值;
  11. %
  12. %例(参看胡良剑等编《数学实验--使用MATLAB》P180
  13. %先写3个函数
  14. %                 eg13f1_2.m
  15. %    function u=DecisF_1(k,x)
  16. %    在阶段k由状态变量x的值求出其相应的决策变量所有的取值
  17. %    c=[70,72,80,76];q=10*[6,7,12,6];
  18. %    if q(k)-x<0,u=0:100;       %决策变量不能取为负值
  19. %    else,u=q(k)-x:100;end;     %产量满足需求且不超过100
  20. %    u=u(:);
  21. %                 eg13f2_2.m
  22. %    function v=ObjF_1(k,x,u)
  23. %    阶段k的指标函数
  24. %    c=[70,72,80,76];v=c(k)*u+2*x;
  25. %                 eg13f3_2.m
  26. %    function y=TransF_1(k,x,u)
  27. %     状态转移方程
  28. %     q=10*[6,7,12,6];y=x+u-q(k);
  29. %调用DynProg.m计算如下:
  30. %    clear;x=nan*ones(14,4);% x是10的倍数,最大范围0≤x≤130,
  31. %       %因此x=0,1,...13,所以x初始化取14行,nan表示无意义元素
  32. %    x(1:7,1)=10*(0:6)';     % 按月定义x的可能取值
  33. %    x(1:11,2)=10*(0:10)';x(1:12,3)=10*(2:13)';
  34. %    x(1:7,4)=10*(0:6)';
  35. %    [p,f]=dynprog(x,'eg13f1_2','eg13f2_2','eg13f3_2')
  36. % By X.D. Ding June 2000
  37. k=length(x(1,:));f_opt=nan*ones(size(x));d_opt=f_opt;
  38. t_vubm=inf*ones(size(x));x_isnan=~isnan(x);t_vub=inf;
  39. % 计算终端相关值
  40. tmp1=find(x_isnan(:,k));tmp2=length(tmp1);
  41. for i=1:tmp2
  42.    u=feval(DecisFun,k,x(i,k));tmp3=length(u);
  43.    for j=1:tmp3
  44.          tmp=feval(ObjFun,k,x(tmp1(i),k),u(j));
  45.          if tmp<=t_vub, 
  46.             f_opt(i,k)=tmp;d_opt(i,k)=u(j);t_vub=tmp; 
  47. end;end;end
  48. % 逆推计算各阶段的递归调用程序
  49. for ii=k-1:-1:1
  50.    tmp10=find(x_isnan(:,ii));tmp20=length(tmp10);
  51.    for i=1:tmp20
  52.       u=feval(DecisFun,ii,x(i,ii));tmp30=length(u);
  53.       for j=1:tmp30
  54.          tmp00=feval(ObjFun,ii,x(tmp10(i),ii),u(j));
  55.          tmp40=feval(TransFun,ii,x(tmp10(i),ii),u(j));
  56.          tmp50=x(:,ii+1)-tmp40;
  57.          tmp60=find(tmp50==0);
  58.          if ~isempty(tmp60),
  59.             tmp00=tmp00+f_opt(tmp60(1),ii+1);    
  60.             if tmp00<=t_vubm(i,ii)
  61.                f_opt(i,ii)=tmp00;d_opt(i,ii)=u(j);
  62.                t_vubm(i,ii)=tmp00;
  63. end;end;end;end;end;
  64. fval=f_opt(tmp1,1);
  65. % 记录最优决策、最优轨线和相应指标函数值
  66. p_opt=[];tmpx=[];tmpd=[];tmpf=[];
  67. tmp0=find(x_isnan(:,1));tmp01=length(tmp0);
  68. for i=1:tmp01,
  69.   tmpd(i)=d_opt(tmp0(i),1); 
  70.   tmpx(i)=x(tmp0(i),1);
  71.   tmpf(i)=feval(ObjFun,1,tmpx(i),tmpd(i));
  72.   p_opt(k*(i-1)+1,[1,2,3,4])=[1,tmpx(i),...
  73. tmpd(i),tmpf(i)];
  74.   for ii=2:k
  75.      tmpx(i)=feval(TransFun,ii-1,tmpx(i),tmpd(i));
  76.      tmp1=x(:,ii)-tmpx(i);tmp2=find(tmp1==0);
  77.      if ~isempty(tmp2)
  78.         tmpd(i)=d_opt(tmp2(1),ii);
  79.      end;
  80.      tmpf(i)=feval(ObjFun,ii,tmpx(i),tmpd(i));
  81.      p_opt(k*(i-1)+ii,[1,2,3,4])=[ii,tmpx(i),...
  82. tmpd(i),tmpf(i)];
  83. end;end;