粒子群算法(PSO)

时间:2022-12-11 07:42:57

算法基于群鸟觅食的模型。(最佳决策寻找最优)适合无约束非线性函数优化

每只鸟看做一个粒子,则一群鸟可看做一个粒子群。每只鸟课根据自己的经验招呼最优觅食路径(局部最优),如果一群鸟的话(全局最优)

但是如果速度过快,可能看不到最优解就跳过去了,如果速度过慢,就不足以支撑到找到全局最优的时候。

粒子更新位置公式:粒子群算法(PSO)(c1c2为加速常数,需要自己设置,但是如果为0的话呢,可能粒子群之间的信息就无法交换,也就是说,只能得到每只鸟找到的局部最优信息。所以一般不为0)其中w是惯性因子,可以是定值也可以是变化的值(通常刚开始设置较大,在不断迭代过程中逐步缩小)pi局部最优pg全局最优

算法流程如下:

粒子群算法(PSO)


MATLAB代码如下:目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))

clc;clear all;close all;

tic;                              %程序运行计时
E0=0.001;                        %允许误差
MaxNum=100;                    %粒子最大迭代次数
narvs=1;                         %目标函数的自变量个数
particlesize=30;                    %粒子群规模
c1=2;                            %每个粒子的个体学习因子,也称为加速常数
c2=2;                            %每个粒子的社会学习因子,也称为加速常数
w=0.6;                           %惯性因子
vmax=0.8;                        %粒子的最大飞翔速度
x=-5+10*rand(particlesize,narvs);     %粒子所在的位置
v=2*rand(particlesize,narvs);         %粒子的飞翔速度
%用inline定义适应度函数以便将子函数文件与主程序文件放在一起,
%inline命令定义适应度函数如下:
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');
%inline定义的适应度函数会使程序运行速度大大降低
for i=1:particlesize
    for j=1:narvs
        f(i)=fitness(x(i,j));
    end
end
personalbest_x=x;
personalbest_faval=f;
[globalbest_faval i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
k=1;
while k<=MaxNum
    for i=1:particlesize
        for j=1:narvs
            f(i)=fitness(x(i,j));
        end
        if f(i)<personalbest_faval(i) %判断当前位置是否是历史上最佳位置
            personalbest_faval(i)=f(i);
            personalbest_x(i,:)=x(i,:);
        end
    end
    [globalbest_faval i]=min(personalbest_faval);
    globalbest_x=personalbest_x(i,:);
    for i=1:particlesize %更新粒子群里每个个体的最新位置
        v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))...
            +c2*rand*(globalbest_x-x(i,:));
        for j=1:narvs    %判断粒子的飞翔速度是否超过了最大飞翔速度有方向
            if v(i,j)>vmax;
                v(i,j)=vmax;
            elseif v(i,j)<-vmax;
                v(i,j)=-vmax;
            end
        end
        x(i,:)=x(i,:)+v(i,:);
    end
    if abs(globalbest_faval)<E0,break,end
    k=k+1;
end
Value1=1/globalbest_faval-1; Value1=num2str(Value1);
% strcat指令可以实现字符的组合输出
disp(strcat('the maximum value','=',Value1));
%输出最大值所在的横坐标位置
Value2=globalbest_x; Value2=num2str(Value2);
disp(strcat('the corresponding coordinate','=',Value2));
x=-5:0.01:5;
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);
plot(x,y,'m-','linewidth',3);
hold on;
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);

legend('目标函数','搜索到的最大值');xlabel('x');ylabel('y');grid on;toc;


结果:

粒子群算法(PSO)

粒子群算法(PSO)