采用粒子群算法程序完成Camel函数寻优。Camel函数描述为:
该函数有六个局部极小点,其中(-0.0898,0.7126)和(0.0898,0.7126)为全局最小点,最小值为-1.031628。
%粒子群优化函数算法
clear;
close;
clc;
M=20; %种群大小
N=2; %粒子的维度
NCmax=50; %最大迭代次数
%粒子每个维度位置的限制
Xmax=3;
Xmin=-3;
Ymax=2;
Ymin=-2;
%使用惯性权重法
Wmax=0.9;
Wmin=0.4;
%使用异步时变因子
C1i=2.5;
C1f=0.5;
C2i=0.5;
C2f=2.5;
Vmax=2; %最大飞行速度
Vmin=-2; %最小飞行速度
%初始化粒子的位置
popx=rand(M,N);
popx(:,1)=popx(:,1)*(Xmax-Xmin)+Xmin;
popx(:,2)=popx(:,2)*(Ymax-Ymin)+Ymin;
%初始化粒子的速度
popv=rand(M,N)*(Vmax-Vmin)+Vmin;
pBest=popx; %初始化粒子的局部最优点
%初始化全局最优点
F=ones(M,1); %初始化目标函数值
for i=1:M %计算目标函数值
F(i)=(4-2.1*popx(i,1)^2+popx(i,1)^4/3)*popx(i,1)^2+popx(i,1)*popx(i,2)...
+(-4+4*popx(i,2)^2)*popx(i,2)^2;
end
minvalue=min(F);
pos=find(minvalue==F); %寻找全局最优的位置
gBest=popx(pos(1),:); %记录全局最优点
GBest=ones(M,N); %记录每代的全局最优点
Fbest=inf*ones(NCmax,1); %每代最优的目标函数值
NC=1; %迭代计数器,记录迭代次数
while NC<=NCmax %停止条件之一:达到最大迭代次数,停止
W=Wmin+(Wmax-Wmin)*NC/NCmax; %更新权重系数
C1=C1i-(C1i-C1f)*NC/NCmax; %更新局部学习因子
C2=C2i+(C2f-C2i)*NC/NCmax; %更新全局学习因子
%使用异步更新的方法更新全局最优值
for i=1:M
for j=1:N %更新粒子的速度和位置
popv(i,j)=W*popv(i,j)+C1*rand*(pBest(i,j)-popx(i,j))...
+C2*rand*(gBest(j)-popx(i,j));
popx(i,j)=popx(i,j)+popv(i,j);
end
%计算第i个粒子当前所在位置的目标函数值
BV=(4-2.1*popx(i,1)^2+popx(i,1)^4/3)*popx(i,1)^2+popx(i,1)*popx(i,2)...
+(-4+4*popx(i,2)^2)*popx(i,2)^2;
%计算第i个粒子目前的局部最优目标函数值
PBV=(4-2.1*pBest(i,1)^2+pBest(i,1)^4/3)*pBest(i,1)^2+pBest(i,1)*pBest(i,2)...
+(-4+4*pBest(i,2)^2)*pBest(i,2)^2;
%如果当前位置为局部最优则保存下来
if BV<PBV
pBest(i,:)=popx(i,:);
end
%计算目前的全局最优目标函数值
GBV=(4-2.1*gBest(1)^2+gBest(1)^4/3)*gBest(1)^2+gBest(1)*gBest(2)...
+(-4+4*gBest(2)^2)*gBest(2)^2;
%如果该粒子的当前位置为全局最优则保存
if BV<GBV
gBest=popx(i,:);
end
end
GBest(NC,:)=gBest; %记录该次迭代的全局最优点
Fbest(NC)=GBV; %记录每代的最优目标函数值
NC=NC+1;
end
gBest
Fmin=Fbest(NCmax)
figure(1)
plot(Fbest);
xlabel('迭代次数') ;
ylabel('目标函数值') ;
title('适应度进化曲线') ;
figure(2)
plot3(GBest(:,1),GBest(:,2),1:NCmax,'r-o');
xlabel('X取值') ;
ylabel('Y取值') ;
zlabel('迭代次数') ;
title('每代最优位置');
grid on