您的位置:首页 > 其它

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

2015-01-04 13:22 239 查看
一直在想写点东西,但是无奈自己只是一枚小菜鸟,所以感觉没有什么东西值得分享。最近因为做毕业设计需要接触了粒子群算法,那么好,我们先把百度百科的名词解释贴上来~“粒子群算法,也称粒子群优化算法(ParticleSwarm Optimization),缩写为 PSO, 是近年来发展起来的一种新的进化算法(EvolutionaryAlgorithm - 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次迭代的时候便已经找到全局最优解。其实这只是最基本的一种粒子群算法,但是搞了两天终于弄明白了还是蛮激动的,接下来我会更新一些实际使用到它时的用法。。。(未完待续。。)
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: