粒子群算法(PSO,gbest与lbest)

版权声明:分享才能获得最大的价值 https://blog.csdn.net/qq_32252957/article/details/83479994

github: 智能算法的课件和参考资料以及实验代码

粒子群算法的原理:

粒子群算法是一种群体智能算法,通过追随当前搜索到的最优值来寻找全局最优。该算法实现容易、精度高、收敛快,在解决实际问题中具有很大的优越性。主要步骤可描述如下:

1、初始化粒子群位置和速度。

2、计算每个粒子的适应度,确定全局最优粒子gbest和个体最优粒子pbest。

3、判断算法收敛准则是否满足,若满足,则输出搜索结果;否则执行以下步骤。

4、根据gbest和pbest更新速度分量。

5、根据更新的速度分量更新粒子位置。

6、更新全局最优粒子和个体最优粒子。

7、返回步骤③。

 

下面我们举了两个函数最小值优化问题,实际上是参数拟合,但是转化成了最小化问题(具体下载第三次实验课件)

f.m

function y = f( x )

% 矩阵按照元素的平方是X.^2 A*B 是矩阵的乘法,而A.*B是两个矩阵对应元素相乘,其他情况下效果一样
% X=[1,3,4,5,6,7,8,9,10]; 
% Y=[10,5,4,2,1,1,2,3,4];
% Y1=x(1)*X.^2+x(2)*X+x(3);

t=1:15;
Y=[352	211	197	160	142	106	104	60	56	38	36	32	21	19	15];
Y1=x(1)*exp(x(2).*t);

y=norm(Y-Y1); % 向量的欧几里得距离

end

gbestpso.m

clear
clc
%*********初始化
M=20;  %种群规模
x1=rand(M,1); % 初始化粒子位置
x2=rand(M,1);
%x3=rand(M,1);
%X=[x1,x2,x3]
X=[x1,x2];
c1=2; % c1和c2是学习因子
c2=2;
wmax=0.9; % 最大最小惯性权重
wmin=0.4; % 线性减小惯性权重
Tmax=50; % 迭代次数
%v=zeros(M,3);
v=zeros(M,2); % 初始化速度
% v1m=0.1;  % 速度1约束
% v2m=1;% 速度2约束
%******* 全局最优粒子位置初始化
fmin=1000; 
for i=1:M
    fx = f(X(i,:));
    if fx<fmin
        fmin=fx;
        gb=X(i,:);
    end
end
%********粒子个体历史最优位置初始化
pb=X; 
%********算法迭代
for t=1:Tmax
    t % w是每代对应的惯性权重,正在逐渐减小
    w=wmax-(wmax-wmin)*t/Tmax;  % 线性下降惯性权重
    for i=1:M
       %******更新每个粒子的当前速度
       v(i,:)=w*v(i,:)+c1*rand(1)*(pb(i,:)-X(i,:))+c2*rand(1)*(gb-X(i,:));
       %******速度约束
%        if v(i,1)>v1m; v(i,1)=v1m;end
%        if v(i,2)>v2m; v(i,2)=v2m; end  
%        if v(i,1)<-v1m;v(i,1)=-v1m;end
%        if v(i,2)<-v2m;v(i,2)=-v1m;end
       %*******更新每个粒子的当前位置
       X(i,:)=X(i,:)+v(i,:);
    end
    % 更新所有粒子的速度和位置之后更新pbest和gbest
    for i=1:M
        if f(X(i,:))<f(pb(i,:))
            pb(i,:)=X(i,:);
        end
        if f(X(i,:))<f(gb)
            gb=X(i,:);
        end
    end
    % 保存最佳适应度
    re(t)=f(gb);
end
figure(1)
plot(re)
xlabel('迭代次数')
ylabel('适应度函数')
gb
re(end)
figure(2)
% X=[1,3,4,5,6,7,8,9,10]; 
% Y=[10,5,4,2,1,1,2,3,4];
% Y1=gb(1)*X.^2+gb(2)*X+gb(3);
X=1:15;
Y=[352  211 197 160 142 106 104 60  56  38  36  32  21  19  15];
Y1=gb(1)*exp(gb(2).*X);

t=16;
y16=gb(1)*exp(gb(2).*t)
plot(X,Y,'o',X,Y1,':');
hold on
plot(t,y16,'ro')

% gb = [400.2029 -0.2241] 最好适应度61.2758 

lbestpso.m

clear
clc
%*********初始化
M=20;  % 种群规模
x1=rand(M,1); % 初始化例子位置
x2=rand(M,1);
%x3=rand(M,1);
%X=[x1,x2,x3]
X=[x1,x2];
c1=2;  % 学习因子
c2=2;
wmax=0.9; % 最大最小惯性权重
wmin=0.4;
Tmax=50; % 迭代次数
v=zeros(M,2); % 初始化速度
%*******全局最优粒子位置初始化
fmin=1000;
gb=X;
k=2; % 邻域规模
for i=1:M
    for in=i-k:i+k
        if in<1;
            in=in+M;%越界处理
        elseif in>M
            in=in-M;%越界处理
        else
            in=in;
        end
        if f(X(in,:))<f(gb(i,:))
            gb(i,:)=X(in,:);%个体的邻域最优
        end
    end
end
%********粒子个体历史最优位置初始化
pb=X; 
%********算法迭代
for t=1:Tmax
    t
    w=wmax-(wmax-wmin)*t/Tmax;  %线性下降惯性权重
    for i=1:M
       %******更新粒子速度 终于是局部最优
       v(i,:)=w*v(i,:)+c1*rand(1)*(pb(i,:)-X(i,:))+c2*rand(1)*(gb(i,:)-X(i,:));
       %*******更新粒子位置
       X(i,:)=X(i,:)+v(i,:);
    end
    %更新pbest和gbest
    for i=1:M
        if f(X(i,:))<f(pb(i,:))
            pb(i,:)=X(i,:);
        end
        for in=i-k:i+k
            if in<1;
                in=in+M;
            elseif in>M
                in=in-M;
            else
                in=in;
            end
            if f(X(in,:))<f(gb(i,:))
                gb(i,:)=X(in,:);%更新邻域最优
            end
        end
    end
    %保存最佳适应度
    ffmin=1000;
    for i=1:M
        if f(gb(i,:))<ffmin;
            ffmin=f(gb(i,:))
            re(t)=ffmin;
            ggb=gb(i,:);
        end
    end
end
figure(1)
plot(re)
xlabel('迭代次数')
ylabel('适应度函数')
ggb
figure(2)
%X=[1,3,4,5,6,7,8,9,10]; 
%Y=[10,5,4,2,1,1,2,3,4];
%Y1=gb(1)*X.^2+gb(2)*X+gb(3);
X=1:15;
Y=[352 211  197 160 142 106 104 60  56  38  36  32  21  19  15];
Y1=ggb(1)*exp(ggb(2).*X);
t=16;
y16=ggb(1)*exp(ggb(2).*t)
plot(X,Y,'o',X,Y1,':');
hold on
plot(t,y16,'ro')
hold off
 
% 最好适应度61.2860 指数函数参数a,b分别是400.0875 -0.2234 
% 二次函数参数拟合问题 a = -0.0963 b = 0.7585 c = 3.2129 最小适应度函数为8.5722

下面是在matlab上运行的截图:

lbest二元函数参数拟合图:

lbest指数函数参数拟合:

gbest指数函数参数问题:

 

猜你喜欢

转载自blog.csdn.net/qq_32252957/article/details/83479994