动态规划matlab仿真实例

来源:建筑师 发布时间:2020-09-14 点击:

 动态规划在火力分配中得应用。

 1. 问题描述 设有 m 个目标,目标价值(重要性与危害性)各不相同,用数值 A K (K=1,2,、、m)表示,计划用n枚导弹突袭,导弹击毁目标得概率 P K = ,其中 就是常数,取决于导弹得特性与目标得性质; 为向目标发射得导弹数,问题:做出方案使预期得突击效果最大. 2. 问题建模 上述问题可以表述为

  约束条件为

  ( 为非负整数)

 3. 算法描述 下面通过一个实例说明:设目标数目为4(m=4),导弹为 5(n=5), 与 a K 取值情况如下表所示:

 表1:A k 取值情况 目标 K 1 2 3 4

 8 7 6 3

 0、2 0、3 0、5 0、9 将火力分配可分为 4 个阶段,每个阶段指标函数为:

  可能取值为0,1,2,3,4,5,将函数值带人如下表: 表 2 函数值 u

  0 0 0 0 0 1 1、45 1、81 2、36 1、79 2 2、64 3、16 3、79 2、51 3 3、61 4、15 4、66 2、81 4 4、41 4、89 5、19 2、93 5 5、06 5、44 5、51 2、97 动态规划问题基本方程为:

 c =0 逐次向前推一级 K=4

 K=3

 K=2

 K=1

 ( ) 只需要求解 得最大值然后反推回去就可以获得最优得分配方案

 4. Ma atlab 仿真求解 因为 与 取值为整数,可以采用动态规划得方法,获得 得最大值,对应得最优方案 function[p_opt,fval]=dynprog(x,DecisFun,SubObjFun,TransFun,ObjFun)

  %求解动态规划问题最小值函数 k=length(x(1,:))

  %判断决策级数 x_isnan=~isnan(x);

  % 非空状态矩阵 t_vubm=inf*ones(size(x)); % 性能指标中间矩阵 f_opt=nan*ones(size(x));

 % 总性能指标矩阵 d_opt=f_opt;

 %每步决策矩阵 tmp1=find(x_isnan(:,k)); % 最后一步状态向量 tmp2=length(tmp1);

 % 最后一步状态个数 for i=1:tmp2

 u=feval(DecisFun,k,x(tmp1(i),k));

  tmp3=length(u);%决策变量

  for j=1:tmp3 % 求出当前状态下所有决策得最小性能指标

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

 if tmp <= t_vubm(i,k) %t_vub

  f_opt(i,k)=tmp;

  d_opt(i,k)=u(j);

  t_vubm(i,k)=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(tmp10(i),ii));

  tmp30=length(u) ;

  for j=1:tmp30 % 求出当前状态下所有决策得最小性能指标

  tmp00=feval(SubObjFun,ii,x(tmp10(i),ii),u(j)); % 单步性能指标

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

 % 下一状态

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

 % 找出下一状态在 x 矩阵得位置

  tmp60=find(tmp50==0) ;

  if~isempty(tmp60)

  if

 nargin<6

 % 矩阵不同需要修改nargin 得值, 很重要

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

 % set the default object

 value

 else

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

  end

 %当前状态得性能指标

  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(:,1); tmp0 = find(~isnan(fval)); fval=fval(tmp0,1); p_opt=[];tmpx=[];tmpd=[];tmpf=[];

 tmp01=length(tmp0);

 for i=1:tmp01

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

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

  tmpf(i)=feval(SubObjFun,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,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(SubObjFun,ii,tmpx(i),tmpd(i));

  p_opt(k*(i—1)+ii,[1,2,3,4])=[ii,tmpx(i),tmpd(i),tmpf(i)];

  end; end;

  下面编写四个函数: function u = DecisF1( k,x )

 %决策函数 if k==4

  u=x; else

  u=0:x; end function y = TransF1( k,x,u )

  %状态转移方程 y=x—u;

 function v = SubObjF1( k,x,u )

 %阶段k得指标函数 a=[0、2,0、3,0、5,0、9]; A=[8,7,6,3]; v=A(k)*(1—exp(—a(k)*u)); v=—v;

  %max变为min function y = ObjF1( v,f )

 %基本方程中得函数 y=v+f; y=—y;

 %max变为min 测试代码:

 clear; n=5; x1=[n;nan*ones(n,1)]; x2=0:n;x2=x2";x=[x1,x2,x2,x2]; [p,f]=dynprog(x,"DecisF1",'SubObjF1’,"TransF1",'ObjF1")

 %p为分配方案,f为结果 5. Matl la b仿真结果分析 运行结果显示:

 P 为方案:

 即对目标 1 发射1枚导弹,对目标 2 发射 1 枚,对目标3发射 2 枚,对目标 4 发生1枚导弹,能获得最大效能. f 为最大得效能:

 即在这种分配下得最大效能为8、8374

推荐访问:仿真 实例 规划
上一篇:尾矿库安全检查表
下一篇:建设工程计量与计价实务(土木建筑工程),试题与答案

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有