%% 多种群遗传算法
% 这种方法果然好很多的
close all;clc;clear;
m=40; %阵元数
n=10; %快拍数
snr=30;
theta=[3.1,23.2,34.3,40.4,55.6];%波达方向
k=length(theta);%信源数
d=0.5;%阵列间距
X=generate_doa(k,m,n,theta,d);
y=awgn(X,snr,'measured');
%------------------------
NIND=100; %种群大小
MAXGEN=200; %最优个体最少保持代数
MP=5; %种群数目,因为这是多种群
%% 产生阵列流型,即字典
jd=0:0.1:90;
AA=exp(-j*2*pi*d*[0:m-1]'*sind(jd));
%% 初始化种群
tic
for i=1:MP
Chrom{i}=InitPop(NIND,k,AA); %创建初始种群
end
Pc=0.8+(0.9-0.7)*rand(MP,1); %在【0.7,0.9】范围内随机产生交叉概率
Pm=0.001+(0.05-0.001)*rand(MP,1); %在【0.001,0.05】范围内随机产生变异概率
gen=0; %初始遗传代数
minY=Inf; %最优值
for i=1:MP
ObjV{i}=PathLength(y,AA,Chrom{i}); %计算初始种群的目标函数值
end
MinObjV=Inf*ones(MP,1); %记录精华种群
MinChrom=zeros(MP,k); %记录精华种群的编码
while gen<=MAXGEN %gen0<=MAXGEN
gen=gen+1; %遗传代数加1
for i=1:MP
ObjV{i}=PathLength(y,AA,Chrom{i});
FitnV{i}=1./ObjV{i}; % 各种群的适应度
%% 选择
SelCh{i}=Select(Chrom{i},FitnV{i});
%% 交叉操作
SelCh{i}=crosspro(SelCh{i},Pc(i));
%% 变异
SelCh{i}=Mutate(SelCh{i},Pm(i),AA);
%% 重插入子代的新种群
Chrom{i}=Reins(Chrom{i},SelCh{i},ObjV{i});
end
[Chrom,ObjV]=immigrant(Chrom,ObjV); % 移民操作
[MinObjV,MinChrom]=EliteInduvidual(Chrom,ObjV,MinObjV,MinChrom); % 人工选择精华种群,把每个种群的最优个体找出来
%得到的结果就是MP条染色体以及MP个目标值
YY(gen)=min(MinObjV); %找出精华种群中最优的个体
if YY(gen)<minY %判断当前优化值是否与前一次优化值相同
minY=YY(gen); %更新最优值
% gen0=0;
% else
% gen0=gen0+1; %最优值保持次数加1
end
end
toc
%% 进化过程图
plot(1:gen,YY,'k')
xlabel('迭代次数')
ylabel('残差变化')
title('多种群遗传算法迭代优化曲线')
xlim([1,gen])
%% 输出最优解
[Y,I]=min(MinObjV); %找出精华种群中最优的个体
X=sort(jd(MinChrom(I,:))); %最优个体的解码解
% disp(['最优值为:',num2str(Y)])
% disp(['对应的DOA估计结果:',num2str(X)])
[theta;X]
评论11