当前位置:文档之家› 稀疏天线阵的GA优化 (MATLAB程序)

稀疏天线阵的GA优化 (MATLAB程序)

本程序运行需一个小时左右。优化准则是旁瓣电平最小。取栅格间距为lemda/2,阵元间距为栅格间距的整数倍。放阵元的位置放1,否则放0
initpop.m 种群初始化
function pop=initpop(popsize,indivlength,atennum)
pop=zeros(popsize,indivlength);
for i=1:popsize
pop(i,1)=1;
pop(i,indivlength)=1;
a=randperm(indivlength-2)+1;%产生2--indivlength-1之间任意两个不相等的向量
for j=1:atennum-2
pop(i,a(j))=1;%每行对应的位置置1
end
end

calfitval.m计算适应度值
%popsize染色体个数,indivlength染色体长度,pop种群
function [fitvalue]=calfitval(popsize,indivlength,pop)
%d取lemda/2,k*d等于pi
m=0;%标志位
global atennum;
array=zeros(popsize,3);
array(:,1)=atennum;
array(:,3)=atennum;
fitvalue=ones(popsize,1);
for theta=0:pi/1800:pi/2
for i=1:popsize
a=0;
for k=1:indivlength
a=a+pop(i,k)*exp(j*pi*(k-1)*sin(theta));
end
a=abs(a);
if a>array(i,3)&&m==0
array(i,2)=array(i,3);
m=1;
end
array(i,3)=a;
%if a<0.5
% m=1;
%end
%存储0~pi之间最大的前两个方向性函数值
if m==1&&a>array(i,2)
array(i,2)=a;
end
end
end
%disp(array);
for i=1:popsize
fitvalue(i,1) = array(i,1)/array(i,2);%适应度值等于主瓣最大值除以副瓣最大值;
end

best.m
%保留每代的最优适应值和最优染色体
function [bestindivdual,bestfit]=best(pop,fitvalue)
[Maxvalue,index]=max(fitvalue);%将当前种群中最优解保存在MaxValue
bestfit=Maxvalue;
bestindivdual=pop(index,:);


select.m选择
%选择复制
function [selection]=select(fitvalue,pop)
[m,n]=size(pop);
selection=zeros(m-1,n);
[Minvalue,index1]=min(fitvalue);%将当前种群中最次解保存在MinValue
[Maxvalue,index2]=max(fitvalue);%将当前种群中最优解保存在MaxValue
bestchrom = pop(index2,:);%最佳染色体保存
pop(index1,:)=bestchrom;
index=[1:m];
index(index1)=0;
index=nonzeros(index);%使最优染色体坐在的位置为零,便于清空,使最优的染色体的原来位置不参与本次的选择、交叉、变异
newpop=pop(index,:);%参与选择交叉,变异的种群
fitvalue=fitvalue(index,:);%参与选择、交叉、变异的适应度函数值
%evo_popsize=m-1;%参与选择、交叉、变异的种群大小
fitvalue=cumsum(fitvalue)/sum(fitvalue);
rndpos=sort(rand(m-1,1));%产生随即概率
j=1;
for i=1:m-1
while rndpos(i)>fitvalue(j)
j=j+1;
end
selection(i,:)=pop(j,:);
end



cross.m交叉
%交叉
function [newpop]=cross(selection,pc)
[m,n]=size(selection);
newpop=ones(m,n);
s=rand(1,m);%随机产生与交叉概率相比较的概率
y1=find(s%y1
y2=find(s>=pc);%不参与交叉位
len1=length(y1);
if len1>2&&mod(len1,2)==1 %如

果用来进行交叉的染色体的条数为奇数,将其调整为偶数
y2(length(y2)+1)=y1(len1);
len1=len1-1;
end
%len1
if len1>=2
for p=1:len1/2
crosspos=round((n-2)*rand())+1;
a=selection(y1(2*p-1),crosspos:n);
b=selection(y1(2*p),crosspos:n);
while ~(length(find(a==1))==length(find(b==1)))
crosspos=round((n-2)*rand())+1;
a=selection(y1(2*p-1),crosspos:n);
b=selection(y1(2*p),crosspos:n);
end
%crosspos
newpop(y1(2*p-1),:)=[selection(y1(2*p-1),1:crosspos-1),selection(y1(2*p),crosspos:n)];
newpop(y1(2*p),:)=[selection(y1(2*p),1:crosspos-1),selection(y1(2*p-1),crosspos:n)];
end
end
newpop(y2,:)=selection(y2,:);


mutation.m变异
%变异
function [newpop]=mutation(newpop,pm)
[m,n]=size(newpop);
s=rand(1,m);%随机产生与变异概率相比较的概率
for i=1:m
if s(i)<=pm
mutapos=round((n-3)*rand())+2;%随即产生变异位置
if newpop(i,mutapos)==0
a=find(newpop(i,:)==1);
a0=round((length(a)-3)*rand())+2;%a(a0)随即找一个为1的位置
newpop(i,mutapos)=1;
newpop(i,a(a0))=0;
else
b=find(newpop(i,:)==0);
b0=round((length(b)-1)*rand())+1;%b(b0)随即找一个为0的位置
newpop(i,mutapos)=0;
newpop(i,b(b0))=1;
end
else
newpop(i,:)=newpop(i,:);
end
end

main.m主程序
%遗传算法优化稀疏天线阵问题
clear all
clc
format long e;
indivlength=1000; %个体串长度
popsize=50; %初始种群大小
global atennum;
atennum=500; %阵元个数
eranum=200; %最大迭代次数
pc=0.8; %交叉概率
pm=0.05; %变异概率
%pcmin=0.5;
%pmmin=0.03;
%deltapc=(pc-pcmin)*100/eranum;
%deltapm=(pm-pmmin)*100/eranum;
T1=clock;
s=sprintf('程序正在运行中,请稍等......');
disp(s);
%第一步,实数编码
%产生初始种群
trace=zeros(eranum,indivlength+1); %最优轨迹
pop=initpop(popsize,indivlength,atennum);
for i=1:eranum
[fitvalue]=calfitval(popsize,indivlength,pop);
[bestindivdual,bestfit]=best(pop,fitvalue);
[selection]=select(fitvalue,pop);
[newpop]=cross(selection,pc);
[newpop]=mutation(newpop,pm);
pop=[newpop;bestindivdual];
trace(i,1)=bestfit;
trace(i,2:indivlength+1)=bestindivdual;
%if mod(i,100)==0
% pc=pc-deltapc;
%pm=pc-deltapm;
%end
end
t=1:eranum;
plot(t,-20*log10(trace(:,1)));
xlabel('迭代次数');
ylabel('每代最优值dB');
figure;
%trace(:,1);
[bestfit,index]=max(trace(:,1));%最优适应度值
bestchrom=trace(index,2:indivlength+1);%最优染色体
str1=sprintf('进化到 %d 代,对应染色体为: %s,得本次求解的最优值%.5fdB\n',index,num2str(bestchrom),-20*log10(bestfit));
disp(str1);
str2=find(bestchrom==1);
str3

=sprintf('阵元放置位置为:%s\n',num2str(str2));%显示阵元位置
disp(str3);
i=1;
a=zeros(1,1801);%放置方向性函数值
for theta=-pi/2:pi/1800:pi/2
for k=1:indivlength
a(i)=a(i)+bestchrom(k)*exp(j*pi*(k-1)*sin(theta));
end
a(i)=20*log10(abs(a(i))/atennum);%取dB
i=i+1;
end
theta=-pi/2:pi/1800:pi/2;
plot(theta*180/pi,a);
xlabel('角度');
ylabel('辐射强度/dB');
T2=clock;
%计算运行时间
elapsed_time=T2-T1;
if elapsed_time(6)<0,
elapsed_time(6)=elapsed_time(6)+60; elapsed_time(5)=elapsed_time(5)-1;
end %秒
if elapsed_time(5)<0,
elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1;
end %分
if elapsed_time(4)<0,
elapsed_time(4)=elapsed_time(4)+24;elapsed_time(3)=elapsed_time(3)-1;
end %时
str2=sprintf('程序运行耗时 %d 小时 %d 分钟 %.4f 秒',elapsed_time(4),elapsed_time(5),elapsed_time(6));
disp(str2);

相关主题
文本预览
相关文档 最新文档