本程序运行需一个小时左右。优化准则是旁瓣电平最小。取栅格间距为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%y1y2=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(bestchro
m),-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);