算法笔记-粒子群优化算法(PSO)

一、算法概述

粒子群优化(PSO,particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早由Kennedy和Eberhart在1995年提出的,该算法源自对鸟类捕食问题的研究。

PSO算法首先在可行解空间中初始化一群粒子,每个粒子都代表极值优化问题的一个潜在最优解,用位置速度适应度三项指标表示该粒子特征。

粒子在解空间中运动,通过跟踪个体极值Pbest和群体极值Gbest更新个体位置,个体极值Pbest是指个体所经历位置中计算得到的适应度值最优位置,群体极值Gbest是指种群中的所有粒子搜索到的适应度最优位置。

粒子每更新一次位置,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度值更新个体极值Pbest和群体极值Gbest位置。

在每一次迭代过程中,粒子通过个体极值和群体极值更新自身的速度和位置,更新公式如下:

V_{id}^{k+1}=\omega *V_{id}^{k}+c_{1}*r_{1}*(P_{id}^{k}-X_{id}^{k})+c_{2}*r_{2}*(P_{gd}^{k}-X_{id}^{k})

X_{id}^{k+1}=X_{id}^{k}+V_{id}^{k+1}

其中,r_{1} and r_{2} is a random number between (0,1). c_{1} and c_{2} are learning factors. usually c_{1}= c_{2}= 2.
 

二、粒子群优化算法与遗传算法对比

相同点:

        种群随机初始化

        适应度函数值与目标最优解之间的映射

不同点:

        PSO算法没有选择、交叉、变异等操作算子

        PSO有记忆的功能

        信息共享机制不同,遗传算法是互相共享信息,整个种群的移动是比较均匀地向最优区域移动,而在PSO中,只有gBest和lBest给出信息给其他粒子,属于单向的信息流动,整个搜索更新过程是跟随当前最优解的过程。因此,在一般情况下,PSO的收敛速度更快

三、算法示例(matlab)

1.一元函数寻找最大值

test1.m

clc
clear all

%% 绘制目标函数曲线图,一元函数优化寻找最大值
x = 1:0.01:2;
y = sin(10*pi*x)./x;
figure
plot(x,y)
hold on
%% 参数初始化
c1 = 1.49445;
c2 = 1.49445;

maxgen = 50; %进化次数
sizepop = 10; %种群规模

Vmax = 0.5;
Vmin = -0.5;
popmax = 2;
popmin = 1;

ws = 0.9; 
we = 0.4;

%% 产生初始粒子和速度
for i = 1:sizepop
    % 随机产生一个种群
    pop(i,:) = (rand(1)+1)/2+1; %初始种群,第i行所有值
    V(i,:) = 0.5*rands(1); %初始化速度
    % 计算适应度
    fitness(i) = fun1(pop(i,:));
end
%% 个体极值和群体极值
[bestfitness,bestindex] = max(fitness); %此程序找最大值,所以取max。寻找最小值,取min。
zbest = pop(bestindex,:); %全局最佳
gbest = pop; %个体最佳
fitnessgbest = fitness; %个体最佳适应值
fitnesszbest = bestfitness; %全局最佳适应度值
%% 迭代寻优
for i = 1:maxgen
    w = ws - (ws - we)*(i/maxgen); %权重更新,影响局部和全局的收敛速度
    for j = 1:sizepop
        %速度更新
        V(j,:)=w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:)); %rand生成(0,1)的一个随机数
        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) = fun1(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

%% 输出结果绘图
[fitnesszbest zbest]
plot(zbest,fitnesszbest,'r+')

figure
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);
ylabel('适应度','fontsize',12);

fun1.m

function y = fun1(x)
%函数用于计算粒子适应度值
%x      input    输入粒子
%y      output   粒子适应度值
y = sin(10*pi*x)/x;

运行效果:

  

 figure1:一元函数图像,+处是寻找到的最大值。figure2:经过50次迭代,对应的每一代的最佳适应度值,差不多在第10代往后已经收敛了,适应度值几乎不变。

2.二元函数寻找最大值

test2.m

%% 清空环境
clc
clear
%% 绘制目标函数曲线,二元函数优化寻找最大值
figure
[x,y] = meshgrid(-5:0.1:5,-5:0.1:5);
z = x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20;
mesh(x,y,z)
hold on

%% 参数初始化
c1 = 1.49445;
c2 = 1.49445;

maxgen = 1000; %进化次数
sizepop = 100; %种群规模

Vmax = 1;
Vmin = -1;
popmax = 5;
popmin = -5;

%% 产生初始粒子和速度
for i = 1:sizepop
    %随机产生一个种群
    pop(i,:)=5*rand(1,2); %初始种群
    V(i,:) = rands(1,2); %初始化速度,二元函数,所以要产生两个速度
    % 计算适应度
    fitness(i) = fun2(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) = fun2(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

%% 输出结果
[fitnesszbest zbest]
plot3(zbest(1) ,zbest(2),fitnesszbest,'bo','linewidth',1.5)

figure
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);
ylabel('适应度','fontsize',12);

 fun2.m

function y = fun2(x)
%函数用于计算粒子适应度值
%x      input      输入粒子
%y      output     粒子适应度值
y = x(1).^2 + x(2).^2 - 10*cos(2*pi*x(1)) - 10*cos(2*pi*x(2)) + 20;

运行效果:

  

 figure1:二元函数图像,o处是寻找到的最大值。figure2:经过1000次迭代,对应的每一代的最佳适应度值,差不多在第27代往后已经收敛了,适应度值几乎不变。

四、算法作用

        PSO算法简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化(函数最大值、最小值问题)、神经网络训练(稍后学习用到再说)、模糊系统控制(不了解)以及其他遗传算法(不了解)的应用领域。

注:个人笔记,仅用于学习,内容参考一些视频讲解。如有问题,请及时联系!

Particle Swarm Optimization

在matlab2020aVersion中,也有粒子群算法的工具箱。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值