%___________________________________________________________________%
% Grey Wold Optimizer (GWO) source codes version 1.0 %
% %
% Developed in MATLAB R2011b(7.13) %
% %
% Author and programmer: Seyedali Mirjalili %
% %
% e-Mail: ali.mirjalili@gmail.com %
% seyedali.mirjalili@griffithuni.edu.au %
% %
% Homepage: http://www.alimirjalili.com %
% %
% Main paper: S. Mirjalili, S. M. Mirjalili, A. Lewis %
% Grey Wolf Optimizer, Advances in Engineering %
% Software , in press, %
% DOI: 10.1016/j.advengsoft.2013.12.007 %
% %
%___________________________________________________________________%
% Particle Swarm Optimization
function [cg_curve,gBestScore,gBest ] =PSO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj) ;% N对应的是SearchAgents_no,也就是种群的大小;Max_iteration为迭代的次数,在主函数中设置,
% lb,ub分别为各变量的上、下限,dim是变量的维数(或者是多少个变量),fobj 是目标函数的值
%PSO Infotmation
Vmax=6; % 速度的最大值
noP=SearchAgents_no; % 赋值,将种群大小赋给该变量
wMax=0.9; % wMax,设置的最大值,是一个改进的PSO算法,是W的最大值
wMin=0.2;
c1=2; %PSO算法的两个重要参数C1,C2
c2=2;
% Initializations
iter=Max_iteration; %最大迭代次数
vel=zeros(noP,dim); %生成一个noP行,dim列的0矩阵
pBestScore=zeros(noP,2); %每一个粒子,都有自己的最优解;先构造一个这样的矩阵,为后面赋值做准备
pBest=zeros(noP,dim); %取得最优值的向量值,比如X=[0 0 0 0 ~~0]时,取得了极小值,由于每个粒子都有自己经历的最优值,所以用(noP,dim)
gBest=zeros(1,dim); %gBest只有一个,最优的变量是dim维
cg_curve=zeros(1,iter); %用来记录每次迭代的最优值
% Random initialization for agents.
pos=initialization(noP,dim,ub,lb); %初始化种群
for i=1:noP
pBestScore(i,:)=[inf inf]; % 先对每一个粒子的最优解,赋一个特别大的值; 注:是假定值越小越优的
end
% Initialize gBestScore for a minimization problem
gBestScore=[inf inf]; % 先赋一个特别大的值; 注:是假定值越小越优的
for l=1:iter %注意:l是变量,1是数字(一)
%判断是否超出变量的界限,否则要进行限定, 开始
Boundary_no= size(ub,2); %判断变量各维上、下限是不是一样的,一样则为1;
if Boundary_no==1 %上、下限一样时
for i=1:noP
Flag4ub=pos(i,:)>ub; %判断是否超出变量的界限,否则要进行限定
Flag4lb=pos(i,:)<lb;
pos(i,:)=(pos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb; %没有超过上、下限,则 ub.*Flag4ub+lb.*Flag4lb=0 ;超过了下、上限,则(pos(i,:).*(~(Flag4ub+Flag4lb)))=0
end
end
% If each variable has a different lb and ub
if Boundary_no>1 %变量的各维 的上、下限不一样时
for i=1:noP
for j=1:dim
Flag4ub=pos(i,j)>ub(1,j); %判断是否超出变量的界限,否则要进行限定
Flag4lb=pos(i,j)<lb(1,j);
pos(i,j)=(pos(i,j).*(~(Flag4ub+Flag4lb)))+ub(1,j)*Flag4ub+lb(1,j)*Flag4lb;
end
end
end
%判断是否超出变量的界限,否则要进行限定, 结束
for i=1:size(pos,1)
%Calculate objective function for each particle
% fitness=fobj(pos(i,:)); % 求目标函数值,比如变量为[0 0 0 ~~0 ] ,这个变量组对应的目标函数值是多少?
fitness=fobj(pos(i,:)); f1=fitness(1,1); f2=fitness(1,2); % fitness由两部分构成
% 用于判断是不是比自己最优位置的更优,如果更优秀,
%情况1 ,都没违反约束 ;DEB规则1
if pBestScore(i,2)==0&&f2==0
if f1<pBestScore(i,1)
pBestScore(i,1)=f1; % Update alpha
pBestScore(i,2)=f2;
pBest(i,:)=pos(i,:);
end
end
%情况2 ,1个违反约束(原最优),一个没违反约束 ;DEB规则2
if pBestScore(i,2)>0&& f2==0
pBestScore(i,1)=f1; % Update alpha
pBestScore(i,2)=f2;
pBest(i,:)=pos(i,:);
end
%情况3 ,两个都违反约束
if pBestScore(i,2)>0&& f2>0 %原则是看哪个的约束违反最少 ;DEB规则3
if f2<pBestScore(i,2) % 小于
pBestScore(i,1)=f1; % Update alpha
pBestScore(i,2)=f2;
pBest(i,:)=pos(i,:);
end
if f2==pBestScore(i,2) %等于
if f1<pBestScore(i,1)
pBestScore(i,1)=f1; % Update alpha
pBestScore(i,2)=f2;
pBest(i,:)=pos(i,:);
end
end
end
%情况3 ,两个都违反约束, 结束
% 用于判断是不是比全局最优位置的更优,如果更优秀,
%情况1 ,都没违反约束
if gBestScore(1,2)==0&&f2==0
if f1<gBestScore(1,1)
gBestScore(1,1)=f1; % Update alpha
gBestScore(1,2)=f2;
gBest=pos(i,:);
end
end
%情况2 ,1个违反约束(原最优),一个没违反约束
if gBestScore(1,2)>0&& f2==0
gBestScore(1,1)=f1; % Update alpha
gBestScore(1,2)=f2;
gBest=pos(i,:);
end
%情况3 ,两个都违反约束
if gBestScore(1,2)>0&& f2>0 %原则是看哪个的约束违反最少
if f2<gBestScore(1,2) % 小于
gBestScore(1,1)=f1; % Update alpha
gBestScore(1,2)=f2;
gBest=pos(i,:);
end
if f2==gBestScore(1,2) %等于
if f1<gBestScore(1,1)
gBestScore(1,1)=f1; % Update alpha
gBestScore(1,2)=f2;
gBest=pos(i,:);
end
end
end
%情况3 ,两个都违反约束, 结束
end %for i=1:size(pos,1) end
%Update the W of PSO
w=wMax-l*((wMax-wMin)/iter); %随着迭代次数越来越大,则w会越来越接近wMax
%Update the Velocity and Position of particles
for i=1:size(pos,1)
for j=1:size(pos,2)
vel(i,j)=w*vel(i,j)+c1*rand()*(pBest(i,j)-pos(i,j))+c2*rand()*(gBest(j)-pos(i,j)); %对应PPT第8页的公式1
if(vel(i,j)>Vmax)
vel(i,j)=Vmax; %限定大小
end
if(vel(i,j)<-Vmax)
vel(i,j)=-Vmax;
end
pos(i,j)=pos(i,j)+vel(i,j); %对应PPT第8页的公式2
end
end%for i=1:size(pos,1) end
%cg_curve(l)=gBestScore; %注意:此外的l是个变量,是L的小写,而不是“一”的那个1; 即保存每一代的全局最优值,主要是用于观察寻优的过程
% 加 2
Convergence_curve(l)=gBestScore(1,1); %用f1做曲线,伍
if mod(l,50)==0
display(['At iteration ', num2str(l), ' the optimum is ', num2str(gBestScore)]); % 每50个输出一个寻优的结果,用于观察算法的寻优性能 (mod(l,50)==0)
en