文件1 ds_main.m
clear all;close all;clc;
%%%%%%%%%% D_S算法设置 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
num_Sensor=3; %传感器数目
num_Object=6; %识别对象数目 四个目标(机载雷达: 火控 瞄准 导航 预警)+全集+空集
num_Period=3; %测量周期数
Info=zeros(num_Sensor,num_Object,num_Period); % 一次判决所需要的信息 3*6*3
%% Info 3*6
Info(:,:,1)=[0.30 0.40 0.15 0.00 0.15 0.00;0.30 0.50 0.10 0.00 0.10 0.00;0.30 0.30 0.20 0.00 0.20 0.00;];
Info(:,:,2)=[0.40 0.20 0.20 0.00 0.20 0.00;0.50 0.20 0.20 0.00 0.10 0.00;0.50 0.30 0.10 0.00 0.10 0.00;];
Info(:,:,3)=[0.50 0.20 0.15 0.00 0.15 0.00;0.40 0.30 0.10 0.00 0.20 0.00;.40 0.20 0.10 0.00 0.30 0.00;];
Info1=zeros(num_Period,num_Object); %% 3*6
%% 周期内各传感器间的数据融合
for i=1:num_Period
Info1(i,:)=Info(1,:,i); %%Info表示 第i个周期的第1行直接赋值给Info1(1*6)
for j=1:num_Sensor-1
Info1(i,:)=DS_fusion(Info1(i,:),Info(j+1,:,i));%% DS_fusion(1*6 , 第i个周期的j+1行(行向量))
%% DS_fusion(第i行,第i+1行)
end
end
%% 周期之间的数据融合
Result=Info1(1,:);
for i=1:num_Period-1
Result=DS_fusion(Result,Info1(i+1,:));
end
%% ****决策判断****************************
ec1=0.1; %% 门限值ec
ec2=0.1;
DS_judg(Result,ec1,ec2,num_Object)
文件2 ds_fusion.m
%% 功能:融合x,y两行向量(经典Dempster-Shafer组合公式)
% x,y的格式形如[m1 m2 m3, ... , mk, m(全集), m(空集)]
% 要求m1 m2 m3 ...之间互相无交集
% m(全集)可不为0,表示不确定度
% m(空集)肯定是0
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% (前一行,后一行)
function x=DS_fusion(x,y)%% DS_fusion(1*6 , 1*6)
%% 判断输入x、y为行向量;列数相等
[nx,mx]=size(x);
if 1~=nx
disp('x应为行向量');
return;
end
[ny,my]=size(y);
if 1~=ny
disp('y应为行向量');
return;
end
if mx~=my
disp('x,y列数应相等');
return;
end
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
temp=0;
for i=1:mx-1 %% nx=1 mx=6
if i==mx-1
x(1,i)=x(1,i)*y(1,i); %% 对全集的特殊处理
else
x(1,i)=x(1,i)*y(1,i)+x(1,i)*y(1,mx-1)+y(1,i)*x(1,mx-1);
end
temp=temp+x(1,i);
end
for i=1:mx-1
x(1,i)=x(1,i)/temp;
end
x(1,mx)=0;
文件3 ds_judg.m
function x=DS_judg(Result,ec1,ec2,num_Object)
res=zeros(1,num_Object);
a1=max(Result);
[c,r]=find(Result==a1);
res=Result;
res(c,r)=0;
a2=max(res);
if a1-a2>ec1 %% &&a1>Result(1,num_Object-1)&&Result(1,num_Object-1)Result(1,num_Object-1)
y3=1
x=[c,r,a1];
end
end
else x=[0,0,0];
end