%免疫pso算法
clear all;
close all;
global rin yout timef
Size=30;
D=3;
MaxIter=50;
c1=2;
c2=2;
wmax=0.9;
wmin=0.4;
vmax=[20 1 1];
MinX(1)=zeros(1);
MaxX(1)=20*ones(1);
MinX(2)=zeros(1);
MaxX(2)=1.0*ones(1);
MinX(3)=zeros(1);
MaxX(3)=1.0*ones(1);
BsJ=0;
BsJr=0;
%*****************************初始化粒子群**********************************
Kpid(:,1)=(MaxX(1)-MinX(1))*rand(Size,1)+MinX(1);
Kpid(:,2)=(MaxX(2)-MinX(2))*rand(Size,1)+MinX(2);
Kpid(:,3)=(MaxX(3)-MinX(3))*rand(Size,1)+MinX(3);
for i=1:Size
for j=D+1:2*D
Kpid(i,j)=0.5*rand;
end
end
%***********************初始化个体极值和全局极值*****************************
for i=1:1:Size
Kpidi=Kpid(i,1:D);
[Kpidi,BsJ]=psopidf(Kpidi,BsJ);
pbestf(i)=BsJ;
end
pbest=Kpid;
[gbestf r]=min(pbestf);
gbest=pbest(r,1:D);
for i=1:Size
Kpid(i,D+1:2*D)=wmax*Kpid(i,D+1:2*D)...
+c1*rand*(pbest(i,1:D)-Kpid(i,1:D))+c2*rand*(gbest-Kpid(i,1:D));
for j=D+1:2*D
if Kpid(i,j)>vmax(1,j-D)
Kpid(i,j)=vmax(1,j-D);
elseif Kpid(i,j)<-vmax(1,j-D)
Kpid(i,j)=-vmax(1,j-D);
end
end
Kpid(i,1:D)=Kpid(i,1:D)+Kpid(i,D+1:2*D);
end
%******************************迭代开始*************************************
for Iter=1:1:MaxIter
time(Iter)=Iter;
w(Iter)=wmax+(wmax-wmin)*(MaxIter-Iter)/MaxIter;
a=0.8*(cos(pi*Iter/(2*MaxIter)))^20;
%******************************输出最优*************************************
pg(Iter)=gbestf;
Iter
gbest
gbestf
%*****************************计算适应度************************************
[OderJi,IndexJi]=sort(pbestf);
Ji=pbestf+1e-10;
fi=1./Ji;
[Oderfi,Indexfi]=sort(fi);
Bestfi=Oderfi(Size);
BestS=Kpid(Indexfi(Size),:);
%***************************免疫记忆细胞(1)*********************************
if Iter==1
for i=30:-1:16 %应该从30到16。
bestm_hold((31-i),:)=Kpid(Indexfi(i),:);
bestc_hold(31-i)=Oderfi(i);
end
end
%************************更新全局极值和个体极值******************************
for i=1:Size
Kpidi=Kpid(i,1:D);
[Kpidi,BsJ]=psopidf(Kpidi,BsJ);
if BsJ<pbestf(i)
pbestf(i)=BsJ;
pbest(i,:)=Kpid(i,:);
end
end
[gbestf r]=min(pbestf);
gbest=pbest(r,1:D);
%*************************更新粒子位置及速度*********************************
for i=1:Size
Kpid(i,D+1:2*D)=wmax*Kpid(i,D+1:2*D)...
+c1*rand*(pbest(i,1:D)-Kpid(i,1:D))+c2*rand*(gbest-Kpid(i,1:D));
for j=D+1:2*D
if Kpid(i,j)>vmax(1,j-D)
Kpid(i,j)=vmax(1,j-D);
elseif Kpid(i,j)<-vmax(1,j-D)
Kpid(i,j)=-vmax(1,j-D);
end
end
Kpid(i,1:D)=Kpid(i,1:D)+Kpid(i,D+1:2*D);
end
%********************************选择复制***********************************
fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size;
fi_S=floor(fi_Size);
s=Size-sum(fi_S);
Rest=fi_Size-fi_S;
[RestValue,Index]=sort(Rest);
for i=Size:-1:Size-s+1
fi_S(Index(i))=fi_S(Index(i))+1;
end
k=1;
for i=Size:-1:1
for j=1:1:fi_S(i)
TempE(k,:)=Kpid(Indexfi(i),:);
k=k+1;
end
end
%******************************交叉操作*************************************
pc=0.90;
for i=1:2:(Size-1)
temp=rand;
if pc>temp
alfa=rand;
TempE(i,:)=alfa*Kpid(i+1,:)+(1-alfa)*Kpid(i,:);
TempE(i+1,:)=alfa*Kpid(i,:)+(1-alfa)*Kpid(i+1,:);
end
end
TempE(Size,:)=BestS;
Kpid=TempE;
%******************************变异操作*************************************
pm=0.10-[1:1:Size]*(0.01)/Size;
pm_rand=rand(Size,D);
Mean=(MaxX+MinX)/2;
Dif=(MaxX-MinX);
for i=1:1:Size
for j=1:1:D
if pm(i)>pm_rand(i,j)
TempE(i,j)=Mean(j)+Dif(j)*(rand-0.5);
end
end
end
TempE(Size,:)=BestS;
Kpid=TempE;
%*******************免疫记忆细胞(2)************************
group=[bestm_hold;Kpid];
for s=1:1:45 %计算适应度
Kpidi=group(s,1:D);
[Kpidi,BsJr]=psopidf(Kpidi,BsJr);
BsJir(s)=BsJr;
end
Jir=BsJir+1e-10;
fir=1./Jir;
for i=1:45 %排序适应度和抗体,从大到小。
for j=(i+1):45
if fir(j)>fir(i)
t=fir(i);
fir(i)=fir(j);
fir(j)=t;
l1=group(i,:);
group(i,:)=group(j,:);
group(j,:)=l1;
end
end
end
for m=1:1:15
bestm_hold(m,:)=group(m,:);
bestc_hold(m)=fi(m);
end
for n=1:1:30
Kpid(n,:)=group(n,:); %将group中的适应度高的前三十个赋给E。
end
%**************************************************************************
end
%*******************************输出结果************************************
gbest
gbestf
figure(1);
plot(time,pg);
xlabel('Times');ylabel('Best J');
grid;
figure(2);
plot(timef,rin,'r',timef,yout,'b');
xlabel('Time(s)');ylabel('rin,yout');
grid;
评论3