【博客开通第一篇】初识粒子群算法
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次迭代的时候便已经找到全局最优解。其实这只是最基本的一种粒子群算法,但是搞了两天终于弄明白了还是蛮激动的,接下来我会更新一些实际使用到它时的用法。。。(未完待续。。)
相关文章推荐
- 我的第一篇博客-记录我此刻的心情以及开通CSDN博客的感受
- 开通博客第一篇
- 博客开通。。第一篇文章:8086汇编学习笔记(原创)
- 第一篇博客---2017年12月后如何在CSDN平台上开通博客
- 我的博客开通了,呵呵!第一篇文章!
- 开通csdn的第一篇博客
- 开通自己的第一篇博客
- (开通博客第一篇文章)高情商者的15个表现(谁比谁好,能差到多少)
- 博客开通第一篇
- 开通博客的第一篇
- 开通CSDN第一篇博客
- 开通博客第一篇
- 开通博客后的第一篇日志。
- 开通CSDN第一篇博客
- 开通园子博客的第一篇博文——我是来搅局的。。。
- 开通CSDN第一篇博客
- 第一天 记录开通博客的第一篇
- 今天开通博客 这是第一篇文章
- 开通博客以后写的第一篇博客
- 开通博客第一篇