【博客开通第一篇】初识粒子群算法

一直在想写点东西,但是无奈自己只是一枚小菜鸟,所以感觉没有什么东西值得分享。

最近因为做毕业设计需要接触了粒子群算法,那么好,我们先把百度百科的名词解释贴上来~

“粒子群算法,也称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO, 是近年来发展起来的一种新的进化算法(Evolutionary Algorithm - EA)。PSO 算法属于进化算法的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。”

也就是说,粒子群算法和很多现代智能算法一样,本身的目的是为了寻找最优值,而它使用了群体运算的方法,使得计算变得高效。

根据我个人的理解,粒子群算法的建立主要分为以下几个步骤:

1.初始化,通过随机的方法在全局铺设若干个粒子,每个粒子对应了一个函数值。

2.在这些函数值中初始化两个量:个体最优值Pi和群体最优值Pg以及它们对应的粒子所在位置Pid和Pgd,群体最优值很好理解,就是整个种群所能达到的最优值,而个体最优值便值每个粒子所达到过的最优值。

3.进行迭代,每一代分别计算每个粒子的适应度,然后更新群体和个体的最优值。

4.计算速度,这一步也是最重要的一步,我们找到群体最优值和个体最优值以及他们对应的位置,这时,我们便需要粒子向某个方向进行运动,而粒子每次迭代所移动的距离便是由速度决定的,第i个粒子速度的计算公式为:Vi=omega*Vi+c1*r1*(Pid-Xid)+c2*r2*(Pgd-Xid);其中Xid为当前粒子所在位置,omega为惯性权重,c1和c2为群体最优和个体最优对运动的影响因子,r1和r2为两个[0,1]间分布的随机数。

5.在计算出每个粒子的运动速度以后,粒子便开始运动,他们的位置进行更新:Xid=Xid+Vi。之后重复3-4-5步骤反复迭代。

大概的原理就是这样的,接下来我们进行一下实验。首先我们需要选取一个用来寻求最优值的函数,以寻找最小值为例,我们最好找到一个有全局最小值和局部最小值的函数,我脑海中第一个跳出来的便是sinc函数。。好吧,个人比较喜欢这个形状。那么ok,设我们的函数原型为sinc(2*π*x),x为1-20的数字,采样精度为0.0001,之所以使用这个精度,主要是因为Matlab的浮点数精度是0.0001。画出的函数为:

使用min函数求出最小值是-0.0425,此时x=1.1915。

已经有了评价函数,我们下面要做的就是建立粒子群算法。

首先,我们进行群体的初始化

close all;
clear all;
clc;
c1=1.5;
c2=1.5;
times=100;     %迭代次数
sizex=20;      %粒子数量
xmax=20;       
xmin=1;
vmax=1;
vmin=-1;
a=1:0.0001:20;
for i=1:1:sizex
    xid(i)=20*rand;
    if xid(i)<1;
        xid(i)=1;
    end;
    v(i)=rand;
    fitness(i)=sinc(2*pi*xid(i));
end;
[bestfitness bestindex]=min(fitness);
Pid=xid(bestindex);
Pgd=xid;
Pi=fitness;
Pg=bestfitness;

其中,xmax和xmin分别代表粒子所能达到的最大位置和最小位置,使用随机数来初始化xid数组为1-20之间,代表粒子的初始位置,v数组表示粒子的初始速度,并且对所有粒子计算一次适应度后存入fitness数组。并在该数组中求出当前的最优值。

我们画个图来观察一下粒子的初始状态:


可以看出,粒子在初始化后是随机分布在整个1-20区间内的。下面我们进行迭代:

for i=1:1:times
       plot(a,sinc(2*pi*a));
    hold on;
    for b=1:1:20   plot(xid(b),sinc(2*pi*xid(b)),'x','color','red','MarkerSize',15);
    end;
    hold off;
    
    for j=1:1:sizex           % Break Point Here
        v(j)=v(j)+c1*rand*(Pgd(j)-xid(j))+c2*rand*(Pid-xid(j));
        if v(j)>vmax
            v(j)=vmax;
        end;
        if v(j)<vmin
            v(j)=vmin;
        end;
        xid(j)=xid(j)+0.5*v(j);
        if xid(j)>xmax
            xid(j)=xmax;
        end;
        if xid(j)<xmin
            xid(j)=xmin;
        end;
        fitness(j)=sinc(2*pi*xid(j));
    end;
    for j=1:1:sizex
        if fitness(j)<Pi(j)
            Pgd(j)=xid(j);
            Pi(j)=fitness(j);
        end;
        if fitness(j)<Pg
            Pid=xid(j);
            Pg=fitness(j);
        end;
    end;
    y(i)=Pg;
end;



我们在这里加入断点,来观察粒子的状态


第5次迭代:




第10次迭代:


。。。。

第45次迭代



我们可以看到,随着迭代的进行,越来越多的粒子开始聚集在最优解的附近,但是由于随机量的存在,粒子会在附近进行运动。我们在程序中的y数组记录了每一代粒子所能达到的最优值,在程序结束后plot可以看到


算法在第18次迭代的时候便已经找到全局最优解。

其实这只是最基本的一种粒子群算法,但是搞了两天终于弄明白了还是蛮激动的,接下来我会更新一些实际使用到它时的用法。。。

(未完待续。。)


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值