预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

动态规划matlab仿真实例 动态规划matlab仿真实例 动态规划matlab仿真实例 动态规划在火力分配中的应用。 问题描述 设有m个目标,目标价值(重要性和危害性)各不相同,用数值AK(K=1,2,。。m)表示,计划用n枚导弹突袭,导弹击毁目标的概率PK=,其中是常数,取决于导弹的特性与目标的性质;为向目标发射的导弹数,问题:做出方案使预期的突击效果最大。 问题建模 上述问题可以表述为 约束条件为 (为非负整数) 算法描述 下面通过一个实例说明:设目标数目为4(m=4),导弹为5(n=5),和aK取值情况如下表所示: 表1:Ak取值情况 目标K123487630.20。30.50.9将火力分配可分为4个阶段,每个阶段指标函数为: 可能取值为0,1,2,3,4,5,将函数值带人如下表: 表2函数值 u0000011。451.812.361。7922.643.163。792。5133.614.154。662。8144.414.895.192.9355.065.445.512.97动态规划问题基本方程为: c =0 逐次向前推一级 K=4 K=3 K=2 K=1() 只需要求解的最大值然后反推回去就可以获得最优的分配方案 Matlab仿真求解 因为与取值为整数,可以采用动态规划的方法,获得的最大值,对应的最优方案 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);%最后一步状态个数 fori=1:tmp2 u=feval(DecisFun,k,x(tmp1(i),k)); tmp3=length(u);%决策变量 forj=1:tmp3%求出当前状态下所有决策的最小性能指标 tmp=feval(SubObjFun,k,x(tmp1(i),k),u(j)); iftmp〈=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 forii=k-1:-1:1 tmp10=find(x_isnan(:,ii)); tmp20=length(tmp10); fori=1:tmp20%求出当前状态下所有可能的决策 u=feval(DecisFun,ii,x(tmp10(i),ii)); tmp30=length(u); forj=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) ifnargin<6%矩阵不同需要修改nargin的值,很重要 tmp00=tmp00+f_opt(tmp60(1),ii+1);%setthedefaultobjectvalue else tmp00=feval(ObjFun,tmp00,f_opt(tmp60(1),ii+1)); end%当前状态的性能指标 iftmp00<=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); fori=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)]; forii=2:k tmpx(i)=feva