动态规划matlab仿真实例

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

1.问题描述

设有m个目标,目标价值(重要性和危害性)各不相同,用数值A K( K=1, 2, ..m )表示,计划用n枚导弹突袭,导弹击毁目标的概率P= ,其中是常数,取决于导弹的

特性与目标的性质;为向目标发射的导弹数,问题:做出方案使预期的突击效果最大。

2.问题建模

上述问题可以表述为

约束条件为

( 为非负整数)

3.算法描述

下面通过一个实例说明:设目标数目为4 (m=4),导弹为5 (n=5), 和a K取值情况如下表所示:表1:A k,取值情况

将火力分配可分为4个阶段,每个阶段指标函数为:

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

表2函数值

k=le ngth(x(1,:)) %

x_is nan=~is nan( x); %

t_vubm=i nf*on

es(size(x)); % 判断决策级数

非空状态矩阵

性能指标中间矩阵

动态规划问题基本方程为:

c

=0

逐次向前推一级

K=4

K=3

K=2

K=1

(

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

可取等号) 4. Matlab仿真求解

因为与取值为整数,可以采用动态规划的方法,获得的最大值,

fun cti on[ p_opt,fval]=d yn prog(x,DecisFu n,SubObjFu n, Tra nsFu

n,ObjFun) %

规划问题最小值函数对应的最优方

求解动态

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 % 矩阵不同需要修改

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=[];

单步性能指标

下一状态

矩阵的位置

nargin 的值,很重要

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 为结果

5. Matlab 仿真结果分析

运行结果显示:

P 为方案:

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

即在这种分配下的最大效能为 决策函数

状态转移方程

阶段k 的指标函数

基本方程中的函数

8.8374

相关文档
最新文档