动态规划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
推荐访问:仿真 实例 规划