一、问题概述
粒子群算法求解多峰函数:
函数表达式:
z=((1*cos((1+1).*x+1))+(2*cos((2+1).*x+2))+(3*cos((3+1).*x+3))+...
(4*cos((4+1).*x+4))+(5*cos((5+1).*x+5))).*((1*cos((1+1).*y+1))+...
(2*cos((2+1).*y+2))+(3*cos((3+1).*y+3))+(4*cos((4+1).*y+4))+(5*cos((5+1).*y+5)));
函数图像:
二、问题解决
有个问题需要提前声明一下,也是困扰我好久的:
我尝试采用达到某一精度就停止迭代,但每次只进行了几次迭代就结束了,当然,结果肯定不是最优的。后来采用规定迭代次数的方法终止循环,并画出了迭代次数和适应度值的曲线,才发现每迭代几次就会出现一段滞留。我曾经怀疑是不是程序写错了,后来发现这种情况是确实存在的。所以下次再有迭代几次就停止的情况,就把迭代次数设的大一点,强制迭代,或许会有新的发现。
clc,clear,close all
%% 1.初始化参数
parameterN=2;%自变量个数
xa=-10;%第一个自变量下界
xb=10;%第一个自变量上界
ya=-10;%第二个自变量下界
yb=10;%第二个自变量上界
N=10;%初始群体粒子数,一般取20-60,复杂问题取100-200
VMin=-2;%最小速度。一般为每一维度变量变化范围的10%-30%。
VMax=2;%最大速度
c1=1.4;%认知常数,一般c1=c2=2,取0-4之间。
c2=1.4;%认知常数
iter=200;%迭代次数
gbestY=[];%存放每一次迭代的全局最优解
%% 1.初始化速度和位置信息
v=rand(N,parameterN);
pos=[xa+(xb-xa)*rand(N,1) ya+(yb-ya)*rand(N,1)];
%% 2.计算适应度值
fx=objectFun(pos(:,1),pos(:,2));
%寻找初始极值
[best_f, best_index] = min(fx);
gbestPos = pos(best_index,:);%全局最优解的坐标
gbest = best_f;%全局最优解
pbestPos = pos;%个体极值的坐标
pbest = fx;%个体极值
gbestY=[gbestY gbest];%存放每一次迭代的全局最优解
for count=1:iter
%% 3.更新速度和位置信息
for i=1:N
%速度更新公式
v(i,:)=v(i,:)+c1*rand*(pbest(i,:)-pos(1,:))+c2*rand*(gbest-pos(1,:));
v(i,v(i,:)>VMax) = VMax;%速度超出范围,定为边界值
v(i,v(i,:)<VMin) = VMin;
%位置更新公式
pos(i,:)=pos(i,:)+0.5*v(i,:);
pos(i,pos(i,1)>xb) = xb;
pos(i,pos(i,1)<xa) = xa;
pos(i,pos(i,2)>yb) = yb;
pos(i,pos(i,2)<ya) = ya;
end
%% 4.更新个体、群体极值
%计算适应度值
fx=objectFun(pos(:,1),pos(:,2));
%计算全局最优解
[best_f, best_index] = min(fx);
if best_f<gbest
gbestPos = pos(best_index,:);%群体极值位置
gbest = best_f;%群体极值适应度值
end
gbestY=[gbestY gbest];
%计算个体极值
for i=1:N
if fx(i)<pos(i)
pbestPos(i,:) = pos(i,:);
pbest(i) = fx(i);
end
end
end
%%
disp('最小值:')
gbestY(end)
disp('最小值位置:')
gbestPos
plot(1:iter,gbestY(1:(end-1)))
title('适应度值变化曲线');
xlabel('进化代数');
ylabel('适应度值');
这是写文章写的最难受的一回了。明天就是美赛了,还有好多想实现的没实现,只能草草收尾。希望接下来几天不要太痛苦,大家都取得好成绩呀。
最最想实现的是在函数图像的基础上,动态显示每一次全局最优解的位置变化