%------免疫粒子群优化算法(Artificial Immune - Particle Swarm Optimization)
function [x,y,Result]=PSO_AI(func)
% Example [x, y,minvalue] = PSO_AI('Foxhole')
clc;
subplot(2,2,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% plot 1
draw(func);
title([func, ' Function']);
tic
format long;
%------给定初始化条件----------------------------------------------
c1=1.4962; %学习因子1
c2=1.4962; %学习因子2
w=0.7298; %惯性权重
MaxDT=200; %最大迭代次数
D=2; %搜索空间维数(未知数个数)
N=100; %初始化群体个体数目
eps=10^(-20); %设置精度(在已知最小值时候用)
DS=10; %每隔DS次循环就检查最优个体是否变优
replaceP=0.6; %粒子的概率大于replaceP将被免疫替换
minD=1e-015; %粒子间的最小距离
Psum=0; %个体最佳的和
range=100;
count = 0;
%------初始化种群的个体------------
for i=1:N
for j=1:D
x(i,j)=-range+2*range*rand; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i=1:N
%p(i)=Foxhole(x(i,:),D); %fitness是计算各个粒子适应度的函数,见文件fitness.m %%%%%%%%*****************************************************
p(i)=feval(func,x(i,:));
y(i,:)=x(i,:);
end
pg=x(1,:); %Pg为全局最优
for i=2:N
if feval(func,x(i,:))<feval(func,pg) %%%%**********************************************************************************************
pg=x(i,:);
end
end
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
for t=1:MaxDT
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if feval(func,x(i,:))<p(i) %%%%%%%%%%%%%%**********************************************************************************************
p(i)=feval(func,x(i,:)); %%%%%%%%%%%%%%%**************************************************************************************
y(i,:)=x(i,:);
end
if p(i)<feval(func,pg) %%%%%%%%%%%%%%%%%%%%******************************************************************************************
pg=y(i,:);
subplot(2,2,2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 1
bar(pg,0.25);
axis([0 3 -40 40 ]) ;
title (['Iteration ', num2str(t)]); pause (0.1);
subplot(2,2,3); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 2
plot(pg(1,1),pg(1,2),'rs','MarkerFaceColor','r', 'MarkerSize',8)
hold on;
plot(x(:,1),x(:,2),'k.');
set(gca,'Color','g')
hold off;
grid on;
axis([-100 100 -100 100 ]) ;
title(['Global Min = ',num2str(p(i))]);
xlabel(['Min_x= ',num2str(pg(1,1)),' Min_y= ',num2str(pg(1,2))]);
end
end
Pbest(t)=feval(func,pg) ; %%%%%%%%************************************************************************************************************
% if Foxhole(pg,D)<eps %如果结果满足精度要求则跳出循环
% break;
% end
%-----------开始进行免疫----------------
if t>DS
if mod(t,DS)==0 && (Pbest(t-DS+1)-Pbest(t))<1e-020 %如果连续DS代数,群体中的最优没有明显变优,则进行免疫.
%在函数测试的过程中发现,经过一定代数的更新,个体最优不完全相等,但变化非常非常小,
%我认为这个时候也应用免疫了,所以我没有用“Pbest(t-DS+1)=Pbest(t)”作为判断条件,
%不过“(Pbest(t-DS+1)-Pbest(t))<1e-020”是否合理也值得探讨。
for i=1:N %先计算出个体最优的和
Psum=Psum+p(i);
end
for i=1:N %免疫程序
for j=1:N %计算每个个体与个体i的距离
distance(j)=abs(p(j)-p(i));
end
num=0;
for j=1:N %计算与第i个个体距离小于minD的个数
if distance(j)<minD
num=num+1;
end
end
PF(i)=p(N-i+1)/Psum; %计算适应度概率
PD(i)=num/N; %计算个体浓度
a=rand; %随机生成计算替换概率的因子
PR(i)=a*PF(i)+(1-a)*PD(i); %计算替换概率
end
for i=1:N
if PR(i)>replaceP
x(i,:)=-range+2*range*rand(1,D);
subplot(2,2,4); axi; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot 4
plot(x(i,1),x(i,2),'k*');
grid on;
axis([-100 100 -100 100 ]) ;
title(['New Min = ',num2str( feval(func,x(i,:)))]); %%%%%%%%%*******************************************************************************
xlabel(['Immune ',num2str(count)]); pause (0.2);
count=count+1;
end
end
end
end
end
%------最后给出计算结果
x=pg(1,1);
y=pg(1,2);
Result=feval(func,pg); %%%%%%%%%%%*****************************************************************************************************************
toc
%------算法结束-------------------------
function probabolity(N,i)
PF=p(N-i)/Psum;%适应度概率
disp(PF);
for jj=1:N
distance(jj)=abs(P(jj)-P(i));
end
num=0;
for ii=1:N
if distance(ii)<minD
num=num+1;
end
end
PD=num/N; %个体浓度
PR=a*PF+(1-a)*PD; %替换概率
% result=PR;
- 1
- 2
前往页