动态规划matlab仿真实例(整理)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划在火力分配中地应用
1.问题描述
设有m个目标,目标价值(重要性和危害性)各不相同,用数值A< ( K=1, 2, ..m )表示,计划用n枚导弹突袭,导弹击毁目标地概率P K=1,其
中儿是常数,取决于导弹地特性与目标地性质;i为向目标发射地导弹数,问题:做出方案使预期地突击效果最大.
2.问题建模
上述冋题可以表述为
max卩=£化弹认1 - e耳叫)
约束条件为
睨“叫二薜严为非负整数)
3.算法描述
下面通过一个实例说明:设目标数目为4 (m=4),导弹为5 (n=5),'和a K
取值情况如下表所示:
表1: A k''取值情况
将火力分配可分为4个阶段,每个阶段指标函数为:
^1) = 8(1 -叫%(叫}= 7(1 -严® 叭) = 6(1 -""叫3(1 -严爲
二可能取值为0, 1, 2, 3, 4, 5,将函数值带人如下表:
表2函数值
动态规划问题基本方程为: :1
■- '■ ■■-' . '■ - :
i c
■「=0
逐次向前推一级 K=3 =max +
{E 3(U 3) + <4
(x 3
- ii 3
)} = max (6(1 -
e °”叫〕
打(工3 -旳)}
K=2 K=1 『2
(勺)
fi %)
=max {/2(u 2) + f 3(x 2-u 2)) = max {7(1 - e °叫)
+ 応区-沟)}
=mux {A 】(叫)+ 爲(尤]一强J} = max {8(1 - e °3 1 +
- u i)J
只需要求解':':,
地最大值然后反推回去就可以获得最优地分配方案
4. Matlab 仿真求解
因为' 与'取值为整数,可以采用动态规划地方法,获得':':,地最大值,对应
地最优方案
function[p_opt,fval]=dynprog(x,DecisFun,SubObjFun,TransFun,ObjFun) % 求解动态规划问题最小值函数 判断决策级数 非空状态矩阵。
% 性能指标中间矩阵 。
% 总性能指标矩阵
每步决策矩阵。
% 最后一步状态向量
% 最后一步状态个数
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)) 。
% 单步性能 指标 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 。
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
tmp40=feval(TransFun,ii,x(tmp10(i),ii),u
(j))
tmp50=x(:,ii+1)-tmp40 tmp60=find(tmp50==0) if~isempty(tmp60) if nargin<6 %
tmp00=tmp00+f_opt(tmp60(1),ii+1)。
% 下一状态
% 找出下一状态在 x 矩阵地位置
矩阵不同需要修改 nargin 地值,很重要
% set the default object value
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 )% 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 为结果
决策函数 状态转
移方程
阶段k 地指标函数
5. Matlab 仿真结果分析
运行结果显示:
P 为方案:
即对目标1 发射1 枚导弹,对目标2 发射1 枚,对目标3 发射2 枚,对目标4 发生1 枚导弹,能获得最大效能.
f 为最大地效能:
即在这种分配下地最大效能为8.8374。