clc;
clear;
%相关参数的设置
UB=600;%函数的上界
LB=300;%函数的下界
PopSize=40;%种群大小
Dim=10;%微粒的维数
c1=2;%学习因子
c2=2;%学习因子
w_start=0.9;%惯性权重的开始值
w_end=0.4;%惯性权重的结束值
Vmax=100;%微粒的最大速度
Maxiter=1500;%最大迭代次数
iter=0;%初始迭代次数
%Initialize Swarm and Velocity
X=rand(PopSize,Dim)*(UB-LB)+LB;%微粒位置随机初始化:
V=rand(PopSize,Dim);%微粒速度随机初始化:
% 测试函数:Griewank函数
ind=repmat(1:Dim,PopSize,1);
FX=sum(((X.^2)/4000)')'-prod(cos(X./sqrt(ind))')'+1;
%设定当前位置为粒子的最好位置,并记录其最好值
PBest=X;%当前粒子的最好位置
FPBest=FX;%当前粒子的最好值
%找到初始微粒群体的最好微粒
[Fgbest,r]=min(FX);
CF=Fgbest;%记录当前全局最优值
Best=X(r,:);%用于保存最优粒子的位置
FBest=Fgbest;
%循环
while(iter <=Maxiter)
iter=iter+1;
% 更新惯性权重的值
w_now=((w_start-w_end)*(Maxiter-iter)/Maxiter)+w_end;
A=repmat(X(r,:),PopSize,1);
%生成随机数
R1=rand(PopSize,Dim);
R2=rand(PopSize,Dim);
%速度更新
V=w_now*V+c1*R1.*(PBest-X)+c2*R2.*(A-X);
%对进化后速度小于最小速度的微粒进行处理
changeRows=V>Vmax;
V(find(changeRows))=Vmax;
%对进化后速度小于最小速度的微粒进行处理
changeRows=V
V(find(changeRows))=-Vmax;
%微粒位置进行更新
X=X+1.0*V;
%重新计算新位置的适应度值
ind=repmat(1:Dim,PopSize,1);
FX=sum(((X.^2)/4000)')'-prod(cos(X./sqrt(ind))')'+1;
%更新每个微粒的最好位置
P=FX
FPBest(P)=FX(find(P));%适应值更换
PBest(find(P),:)=X(find(P),:);%粒子位置更换
[Fgbest,g]=min(FPBest);%保存最好适应值
if Fgbest
[fBest,b]=min(FPBest);%最好适应值为fBest
Best=PBest(b,:);%最好适应值为Best
end
CF=Fgbest;% To be used to find Best 保留本次适应值准备与下一次比较
end %循环结束