• MATLAB2016笔记(十一):基本粒子群优化算法(PSO)的MATLAB实现



    一、概述

    粒子群优化算法 ( P a r t i c l e   S w a r m   O p t i m i z a t i o n ) (Particle \ Swarm\ Optimization) (Particle Swarm Optimization),缩写为 P S O PSO PSO,属于进化算法的一种,和模拟退火算法相似,从随机解出发,通过迭代寻找最优解
    P S O PSO PSO通过适应度来评价解的品质,但它比遗传算法规则更简单,没有遗传算法的“交叉”(Crossover)和“变异”(Mutation),它通过追随当前搜索到的最优值来寻找全局最优

    优点:原理简单,收敛速度快
    缺点:早熟收敛、维数灾难、易于陷入局部极值
    
    • 1
    • 2

    知乎——粒子群算法介绍


    二、基本原理

    P S O PSO PSO从鸟群捕食模型中得到启示并可用于解决优化问题

    P S O PSO PSO中,每个优化问题的潜在解都是搜索空间中的一只鸟,称为粒子
    所有的粒子都有一个由被优化的函数决定的适值( f i t n e s s   v a l u e fitness\ value fitness value),每个粒子还有一个速度决定它们“飞行”的方向和距离
    粒子们追随当前的最优粒子在解空间中搜索
    在这里插入图片描述
    P S O PSO PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。

    在每一次迭代中,例子通过跟踪两个极值来更新自己:
    一个是粒子本身找到的最优解,这个解称为个体极值
    另一个是整个种群目前找到的最优解,这个极值是全局极值,另外也可以不用整个种群,而只用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值

    假设在一个 D D D维的目标搜索空间中,有 N N N个粒子组成一个群落,其中第 i i i个粒子的位置是一个 D D D维的向量:
    X i = ( x i 1 , x i 2 , . . . , x i D ) ,   i = 1 , 2 , . . . , N X_i=(x_{i1},x_{i2},...,x_{iD}),\ i=1,2,...,N Xi=(xi1,xi2,...,xiD), i=1,2,...,N

    i i i个粒子的“飞行”速度也是一个 D D D维的向量,记为:
    V i = ( v i 1 , v i 2 , . . . , v i D ) ,   i = 1 , 2 , . . . , N V_i=(v_{i1},v_{i2},...,v_{iD}),\ i=1,2,...,N Vi=(vi1,vi2,...,viD), i=1,2,...,N

    i i i个粒子迄今为止搜索到的最优位置称为个体极值,记为:
    p b e s t = ( p i 1 , p i 2 , . . . , p i D ) ,   i = 1 , 2 , . . . , N p_{best}=(p_{i1},p_{i2},...,p_{iD}),\ i=1,2,...,N pbest=(pi1,pi2,...,piD), i=1,2,...,N

    整个粒子群迄今为止搜索到的最优位置称为全局极值,记为:
    g b e a s t = ( p g 1 , p g 2 , . . . , p g D ) g_{beast}=(p_{g1},p_{g2},...,p_{gD}) gbeast=(pg1,pg2,...,pgD)

    在找到这两个最优值时,粒子根据如下的公式来更新自己的速度和位置:
    v i d = w ∗ v i d + c 1 r 1 ( p i d − x i d ) + c 2 r 2 ( p g d − x i d ) v_{id}=w*v_{id}+c_1r_1(p_{id}-x_{id})+c_2r_2(p_{gd}-x_{id}) vid=wvid+c1r1(pidxid)+c2r2(pgdxid)
    x i d = x i d + v i d x_{id}=x_{id}+v_{id} xid=xid+vid

    所以速度可以理解为下一次迭代移动距离

    其中: c 1 c_1 c1 c 2 c_2 c2为学习因子,也称加速常数, r 1 r_1 r1 r 2 r_2 r2为[0,1]范围内的均匀随机数。

    v i d = w ∗ v i d + c 1 r 1 ( p i d − x i d ) + c 2 r 2 ( p g d − x i d ) v_{id}=w*v_{id}+c_1r_1(p_{id}-x_{id})+c_2r_2(p_{gd}-x_{id}) vid=wvid+c1r1(pidxid)+c2r2(pgdxid)由三部分组成

    自左向右
    第一部分为“惯性”或“动量”部分,反映粒子运动“习惯”,代表粒子有维持自己先前速度的趋势。
    第二部分为“认知”部分,反映粒子对自身粒子经验的记忆或回忆,代表粒子有向自己历史最佳位置逼近的趋势。
    第三部分为“社会”部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋势。
    
    • 1
    • 2
    • 3
    • 4

    粒子群算法应用于多目标优化具有很大的优势,它既可以得到多目标意义下的最优解,也可以通过代表整个解集种群,按并行方式同步搜索多个非劣解,也即搜索到多个Pareto最优解(资源分配的一种理想状态)


    三、程序设计

    (一)流程

    (1)初始化粒子群,包括群体规模 N N N,每个粒子的位置 x i x_i xi和速度 v i v_i vi
    (2)计算每个粒子的适应度值 F i t [ i ] F_{it}[i] Fit[i]
    (3)对每个粒子,用它的适应度值 F i t [ i ] F_{it}[i] Fit[i]和个体最优值 p b e s t ( i ) p_{best}(i) pbest(i)比较,如果 F i t [ i ] > p b e s t ( i ) F_{it}[i]>p_{best}(i) Fit[i]>pbest(i),则用 F i t [ i ] F_{it}[i] Fit[i]替换掉 p b e s t ( i ) p_{best}(i) pbest(i)
    (4)对每个粒子,用它的适应度值 F i t [ i ] F_{it}[i] Fit[i]和全局最优值 g b e s t g_{best} gbest比较,如果 F i t [ i ] > g b e s t F_{it}[i]>g_{best} Fit[i]>gbest,则用 F i t [ i ] F_{it}[i] Fit[i]代替 g b e s t g_{best} gbest
    (5)更新粒子的速度 v i v_i vi和位置 x i x_i xi
    (6)如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回(2)。

    在这里插入图片描述

    (二)基本粒子群算法代码

    M A T L A B MATLAB MATLAB中编程实现的基本粒子群算法基本函数为 P S O PSO PSO,如下所示:

    function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
    %基本粒子群算法
    %c1 学习因子1
    %c2 学习因子2
    %w  惯性权重
    %M  最大迭代次数
    %D  搜索空间维度
    %N  初始化群体个体数目
    
    format long;%long作为数据类型
    for i=1:N
        for j=1:D
            x(i,j)=randn;  %随机初始化位置,randn,产生均值为0,方差为1的正态分布的随机数
            v(i,j)=randn;  %随机初始化速度
        end
    end
    
    %计算各个粒子的适应度,并初始化Pi(个体最优)、Pg(全局最优)
    for i=1:N
        P(i)=fitness(x(i,:));
        y(i,:)=x(i,:);
    end
    Pg=x(N,:);
    
    for i=1:(N-1)
        if fitness(x(i,:))<fitness(Pg)
            Pg=x(i,:);
        end
    end
    
    %进入主要循环,按照公式依次迭代,直到满足精度要求
    for t=1:M
        for i=1:N
            v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(Pg-x(i,:));
            x(i,:)=x(i,:)+v(i,:);
            if fitness(x(i,:))<P(i)
                P(i)=fitness(x(i,:));
                y(i,:)=x(i,:);
            end
            if P(i)<fitness(Pg)
                Pg=y(i,:);
            end
        end
        Pbest(t)=fitness(Pg);
    end
    
    %最后给出计算结果
    disp('-------------------------------')
    disp('目标函数取最小值时的自变量')
    xm=Pg'
    disp('目标函数的最小值为:')
    fv=fitness(Pg)
    disp('-------------------------------')
    
    end
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    (三)适应度函数——Griewank函数

    格里旺克函数,是数学上常用于测试优化程序效率的函数

    function y= Griewank( x )
    %Griewank函数,PSO粒子群算法的适应度计算
    %输入x,给出相应的y值,在x(0,0,..,0)处有全局极小点0[row,col]=size(x);
    if row>1
        error('输入参数有误');%要求为单行
    end
    y1=1/4000*sum(x.^2);
    y2=1;
    
    for h=1:col
        y2=y2*cos(x(h)/sqrt(h));
    end
    y=y1-y2+1;
    y=-y;
    
    end
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    function Griewank_draw(x)
    %GRIEWANK_DRAW,绘制Griewank函数图形
    y=x;
    [X,Y]=meshgrid(x,y);
    [row,col]=size(X);
    for l=1:col
        for h=1:row
            z(h,l)=Griewank([X(h,l),Y(h,l)]);
        end
    end
    surf(X,Y,z);
    shading interp;%对曲面或图形对象的颜色着色进行色彩的插值处理,使色彩平滑过渡
    
    end
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (四)适应度函数——Rastrigin函数

    Rastrigin函数,研究智能优化算法时的测试函数

    function y= Rastrigin(x)
    %RASTRIGIN函数
    %输入x,给出相应的y值,在x(0,0,..,0)处有全局极小点0[row,col]=size(x);
    if row>1
        error('输入参数有误');%要求为单行
    end
    y=sum(x.^2-10*cos(2*pi*x)+10);
    y=-y;
    
    end
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    function Rastrigin_draw(x)
    %RASTRIGIN_DRAW,绘制Rastrigin图像
    y=x;
    [X,Y]=meshgrid(x,y);
    [row,col]=size(X);
    for l=1:col
        for h=1:row
            z(h,l)=Rastrigin([X(h,l),Y(h,l)]);
        end
    end
    surf(X,Y,z);
    shading interp;%对曲面或图形对象的颜色着色进行色彩的插值处理,使色彩平滑过渡
    
    end
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (五)例子:求解函数最小值

    f ( x ) = ∑ i = 1 30 ( x i 2 + x i − 6 ) f(x)=\sum_{i=1}^{30}(x_i^2+x_i-6) f(x)=i=130(xi2+xi6)

    1.根据函数所示,需要确定30个数,使得函数值最小,所以D也就是30;
    2.目标为函数最小值,fitness函数就是此函数,且计算结果越小适应度值越高
    3.可以直观看出x均为-1/2时,有最小值为-187.5
    
    • 1
    • 2
    • 3
    function y= fitness(x)
    y=0;
    for i=1:30
        y=y+x(i)^2+x(i)-6;
    end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    设粒子群规模 N N N为50,学习因子 C 1 C_1 C1为1.5,学习因子 C 2 C_2 C2为2.5,惯性权值 w w w为0.5,搜索空间维度 D D D为30

    先考虑最大迭代次数不同所得的结果
    在这里插入图片描述

    再考虑不同粒子群规模所得的结果
    在这里插入图片描述
    在这里插入图片描述

    根据上图,可分析出如下结果
    1.PSO为随机算法,同样的参数所得的结果也不一定一致
    2.迭代步数不一定与获得解的精度成正比
    3.粒子群规模越大,获得解的精度不一定越高
    4.在PSO算法中,想要获得精度高的解,关键是各个参数之间的合适配合
    
    • 1
    • 2
    • 3
    • 4
    • 5

  • 相关阅读:
    LightDB中的存储过程(五)
    MATLAB/Python编程 | 图片的形态学处理
    汇编指令转机器码
    工程机械比例阀电流采集方案
    android P 应用读写内置sd卡权限白名单
    新型数据中心,助力加快构建以数据为关键要素的数字经济
    二叉搜索树
    【网络安全】「漏洞原理」(一)SQL 注入漏洞之概念介绍
    独立站即web3.0,国家“十四五“规划要求企业建数字化网站!
    什么是父子组件通信,一秒看懂emit
  • 原文地址:https://blog.csdn.net/qq_52441682/article/details/126267359