PSO算法及其对函数优化问题的处理+PSO算法改进

简介

  • 粒子群优化算法(PSO)是由Eberhart博士和Kennedy博士于1995年提出的,是一种基于迭代的优化算法。其是基于模拟鸟类捕食行为进行研究的。
  • PSO中,每个优化问题的解都是搜索空间中的一只鸟,我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值,每个粒子还有一个速度决定它们飞翔的方向和距离。粒子们追随当前的最优粒子在解空间中搜索。
  • PSO初始化为一群随机粒子,然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个“极值”来更新自己。其一:粒子本身所找到的最优解,称为个体极值pBest;其二:整个种群目前找到的最优解,称为全局极值gBest。(向自己学习和向他人学习来优化自己)

速度和位置的更新及对应参数介绍

速度和位置的更新
在这里插入图片描述
每个粒子的速度和位置都以随机方式进行初始化。而后粒子就朝着全局最优和个体最优的方向靠近。
参数解释:
在这里插入图片描述
有关c1,c2的补充:
1)低的值允许粒子在被拉回前可以在目标区域外徘徊,高的值则导致粒子突然冲向或超越目标区域;
2)若c1 = 0,则粒子没有认知能力,在粒子的相互作用下,容易陷入局部极值点;
3)若c2 = 0,粒子间没有社会信息共享,算法变成一个多起点的随机搜索;
4)若c1 = c2 = 0,粒子将一直以当前速度飞行,直到到达边界。通常c1,c2在[0,4]之间,一般取c1 = c2 = 2

算法流程图

在这里插入图片描述

用PSO优化算法求Rosenbrock函数的极值

Rosenbrock函数

在这里插入图片描述
x1,x2的范围均在[-2.048,2.048]之间

目标函数fun.m文件

function y = fun(x) 
y=100 * (x(1).^2 - x(2)).^2 + (1 - x(1)).^2;
end

主函数PSO.m文件

clc
clear
%%绘制目标函数曲线
figure(1);
[x,y] = meshgrid(-2.048:0.1:2.048,-2.048:0.1:2.048);
%输入平方时,要在“^”前加“.”,否则可能有错
z = 100 * (x.^2 - y).^2 + (1 - x).^2;
mesh(x,y,z);
xlabel('x');ylabel('y');zlabel('f(x,y)');
title('Rosenbrock函数');
hold on
%%参数初始化
c1 = 2;
c2 = 2;
maxgen=100; %进化次数
sizepop=10; %种群规模

Vmax=0.5;  %最大速度
Vmin=-0.5;  %最小速度
popmax=2;   %最大位置
popmin=-2;  %最小位置

%%产生初始粒子和速度
for i=1:sizepop
    %随机产生一个种群
    pop(i,:)=2*rands(1,2); %初始种群  rands中的参数2用来控制维度
    V(i,:)=0.5*rands(1,2); %初始化速度
    %计算适应度
    fitness(i)=fun(pop(i,:)); %染色体的适应度
end

%%个体极值和群体极值
[bestfitness,bestindex]=max(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值

%%迭代寻优
for i=1:maxgen 
    for j=1:sizepop
    %速度更新
    V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
    V(j,find(V(j,:)>Vmax))=Vmax;  %速度不能越界
    V(j,find(V(j,:)<Vmin))=Vmin;
    %种群更新
    pop(j,:)=pop(j,:)+V(j,:);
    pop(j,find(pop(j,:)>popmax))=popmax; %粒子位置不能越界
    pop(j,find(pop(j,:)<popmin))=popmin;
    %适应度值
    fitness(j)=fun(pop(j,:));
    end

    for j=1:sizepop
        %个体最优更新
        if fitness(j) > fitnessgbest(j)
            gbest(j,:) = pop(j,:);
            fitnessgbest(j) = fitness(j);
        end

        %群体最优更新
        if fitness(j) > fitnesszbest
            zbest = pop(j,:);
            fitnesszbest = fitness(j);
        end
    end
    yy(i)=fitnesszbest;
end
%%结果分析
figure(2);
plot(yy)
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

结果图示如下:
图一:Rosenbrock函数图像
在这里插入图片描述
图二:进化代数和适应度之间的关系
在这里插入图片描述
有关其他函数的画法及其优化与上述类似,不再赘述。

PSO算法的改进

加惯性权重PSO

在这里插入图片描述
对速度更新方程加惯性权重w。当粒子群到达局部最优附近时,粒子速度的更新主要由第一项来决定。由于固定参数的PSO算法的w通常小于1,粒子的速度将会越来越小,甚至停止运动,发生早熟收敛。
1)若w = 0,由于速度本身没有记忆性,只取决于粒子当前位置和其历史最好位置pbest和gbest,所以,粒子群将收缩到当前的全局最好位置,更像一个局部算法;
2)若w不为0,微粒有扩展搜索空间的趋势,即有全局搜索能力;
3)用惯性权重来控制前面的速度对当前速度的影响,较大的w可以加强PSO的全局搜索能力,较小的w能加强局部搜索能力。

故往往会在PSO算法前期将w设置的较大些,使其可以基本访问到解空间的所有解;当到算法后期,已经快接近最优解的时候,将w的值设置的较小一些,增加局部搜索能力,使之更快的逼近最优解。

加收缩因子PSO

加收缩因子k有助于确保PSO算法收敛。
在这里插入图片描述
通常
在这里插入图片描述
收缩因子控制系统行为最终收敛,且可以有效搜索不同的区域,该法能得到高质量的解。

注意:迭代次数、种群规模、初始速度和位置等参数都会影响算法的性能

发布了12 篇原创文章 · 获赞 2 · 访问量 7750

猜你喜欢

转载自blog.csdn.net/denglavender/article/details/103096313