粒子群算法应用——求解多峰函数

一、问题概述

  粒子群算法求解多峰函数:

  函数表达式:

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('适应度值');

  这是写文章写的最难受的一回了。明天就是美赛了,还有好多想实现的没实现,只能草草收尾。希望接下来几天不要太痛苦,大家都取得好成绩呀。
  最最想实现的是在函数图像的基础上,动态显示每一次全局最优解的位置变化

原创文章 35 获赞 17 访问量 7850

猜你喜欢

转载自blog.csdn.net/dear_jing/article/details/104274467