PSO算法学习心得

一 算法基本思想

   粒子群优化算法属于群智能(swarm intelligence)优化算法。群智能分两种,一种是粒群优化,一种是蚁群优化。

       群智能概念:假设你和你的朋友们(individual)去寻宝(objective),每个人都有一个探测器(function)可以知道宝藏到探测器的距离。在找的过程中,每个人都可以把信息共享出去,每个人都能看到现在谁离宝藏最近。这样,你看谁离宝藏最近,就以某种速度(velocity)向谁靠近,使得个体发现宝藏的机会变大,也比单人找的要快。在群智能的计算研究中,群的个体组织包括蚂蚁、白蚁、蜜蜂、黄蜂、鱼群、鸟群等。研究人员发现,蚂蚁在鸟巢和事物之间的运输路线,不管一开始多随机,最后蚂蚁总能找到一条最短路径。

粒群优化概念:粒群优化(particle swarm optimization, PSO)算法是一种基于群体搜索的算法,它建立在模拟鸟群社会的基础上。粒群概念的最初含义是通过图形来模拟鸟群优美和不可预测的舞蹈动作,发现鸟群支配同步飞行和以最佳队形突然改变飞行方向并重新编队的能力。这个概念已经被包含在一个简单有效的优化算法中。

二 算法描述

       先通过一个形象的场景来描述一下:5只鸟觅食,每个鸟都知道自己与食物的距离,并将此信息与其他鸟共享。一开始,5只鸟分散在不同的地方,假设每只鸟每秒钟更新自己的速度和方向,如何更新呢?每只鸟记下自己离食物的最近位置,成为Pbest(i),从这里边选一个最好的Gbest,作为组里最好的。鸟更新自己的速度v表示为:

    v_new  = v_old + c1*rand()*(pbest-pcurrent) +c2*rand()*(gbest-pcurrent)

    c1,c2一般为2,rand()产生0~1的随机数。

以下伪码摘自百度百科

 程序的伪代码如下

 

  For each particle

 

  ____Initialize particle

 

  END

 

  Do

 

  ____For each particle

 

  ________Calculate fitness value

 

  ________If the fitness value is better than the best fitness value (pBest) in history

 

  ____________set current value as the new pBest

 

  ____End

 

  ____Choose the particle with the best fitness value of all the particles as the gBest

 

  ____For each particle

 

  ________Calculate particle velocity according equation (a)

 

  ________Update particle position according equation (b)

 

  ____End

 

  While maximum iterations or minimum error criteria is not attained

 

  在每一维粒子的速度都会被限制在一个最大速度Vmax,如果某一维更新后的速度超过用户设定的Vmax,那么这一维的速度就被限定为Vmax。

程序实例

计算f(x) = x*x - 20x + 100 的最小值及取最小值时的x

  
  
  1. #include <iostream>  
  2. #include <cmath>  
  3. #include <cstdlib>  
  4. using namespace std;  
  5.  
  6. #define C1 2  
  7. #define C2 2  
  8. #define VMAX 5.0  
  9. #define MAX_ITERATIONS 100  
  10. float rand01()  
  11. {  
  12.         return (float) (rand()/(double)RAND_MAX);  
  13. }  
  14. struct particle{  
  15.         float current;  
  16.         float pbest;  
  17. };  
  18.  
  19. float fitness(float x)  
  20. {  
  21.         return x*x - 20*x + 100;  
  22. }  
  23.  
  24. float gbest = 10000;  
  25. struct particle p[5];  
  26. float v[5] = {0};  
  27.  
  28. void init_particles()  
  29. {  
  30.         int i;  
  31.         for(i = 0; i < 5; i++)  
  32.         {  
  33.                 p[i].current = -2+i;  
  34.                 p[i].pbest = p[i].current;  
  35.         }  
  36. }  
  37. void find_gbest()  
  38. {  
  39.         int i;  
  40.         for(i = 0; i < 5; i++)  
  41.         {  
  42.                         if(fitness(gbest) > fitness(p[i].current))  
  43.                                 gbest = p[i].current;  
  44.         }  
  45. }  
  46. void adjust_v()  
  47. {  
  48.         int i ;  
  49.         for(i = 0; i < 5; i++)  
  50.         {  
  51.                 v[i] = v[i] + C1*rand01()*(p[i].pbest - p[i].current) + C2*rand01()*(gbest - p[i].current);  
  52.                 if(v[i] > VMAX)  
  53.                         v[i] = VMAX;  
  54.         }  
  55. }  
  56. void pso()  
  57. {  
  58.         int i,iter_num;  
  59.         iter_num = 1;  
  60.         while(iter_num < MAX_ITERATIONS)  
  61.         {  
  62.                 /*for(i = 0; i < 5; i++)  
  63.                 {  
  64.                         cout <<"p"<<i<<":current "<<p[i].current<<" pbest "<<p[i].pbest<<endl;  
  65.                 }  
  66.                 cout <<"gbest:"<<gbest<<endl;  
  67.                 cout <<endl;  
  68.                 getchar();*/ 
  69.                 for(i = 0; i < 5; i++)  
  70.                 {  
  71.                         if(fitness(p[i].current) < fitness(p[i].pbest))  
  72.                                 p[i].pbest = p[i].current;  
  73.                 }  
  74.                 find_gbest();  
  75.                 adjust_v();  
  76.                 for(i = 0; i < 5; i++)  
  77.                         p[i].current += v[i];  
  78.                 iter_num ++;  
  79.         }  
  80. }  
  81. int main()  
  82. {  
  83.  
  84.         init_particles();  
  85.         pso();  
  86.         printf("After %d iterations,gbest is %f\n",MAX_ITERATIONS,gbest);  
  87.         return 0;  
  88. }  

下面是每次迭代后的结果,可以看到,经过5次迭代,结果就很好了。

  
  
  1. After 1 iterations  
  2. p0:current -2 pbest -2  
  3. p1:current -1 pbest -1  
  4. p2:current 0 pbest 0  
  5. p3:current 1 pbest 1  
  6. p4:current 2 pbest 2  
  7. gbest:10000  
  8.  
  9.  
  10. After 2 iterations  
  11. p0:current 1.15506 pbest -2  
  12. p1:current 3.79064 pbest -1  
  13. p2:current 0.790205 pbest 0  
  14. p3:current 2.53646 pbest 1  
  15. p4:current 2 pbest 2  
  16. gbest:2  
  17.  
  18.  
  19. After 3 iterations  
  20. p0:current 6.15506 pbest 1.15506  
  21. p1:current 8.58128 pbest 3.79064  
  22. p2:current 5.79021 pbest 0.790205  
  23. p3:current 5.87216 pbest 2.53646  
  24. p4:current 4.17373 pbest 2  
  25. gbest:3.79064  
  26.  
  27.  
  28. After 4 iterations  
  29. p0:current 11.1551 pbest 6.15506  
  30. p1:current 13.3719 pbest 8.58128  
  31. p2:current 10.7902 pbest 5.79021  
  32. p3:current 9.79741 pbest 5.87216  
  33. p4:current 8.27141 pbest 4.17373  
  34. gbest:8.58128  
  35.  
  36.  
  37. After 5 iterations  
  38. p0:current 13.8766 pbest 11.1551  
  39. p1:current 10.1764 pbest 8.58128  
  40. p2:current 14.7492 pbest 10.7902  
  41. p3:current 13.7227 pbest 9.79741  
  42. p4:current 13.2714 pbest 8.27141  
  43. gbest:9.79741  
  44.  
  45.  
  46. After 6 iterations  
  47. p0:current 8.03327 pbest 11.1551  
  48. p1:current 6.98078 pbest 10.1764  
  49. p2:current 13.2414 pbest 10.7902  
  50. p3:current 4.78856 pbest 9.79741  
  51. p4:current 11.6974 pbest 8.27141  
  52. gbest:10.1764  
  53.  
  54.  
  55. After 7 iterations  
  56. p0:current 5.84287 pbest 11.1551  
  57. p1:current 9.25245 pbest 10.1764  
  58. p2:current 5.23059 pbest 10.7902  
  59. p3:current -3.28694 pbest 9.79741  
  60. p4:current 9.93147 pbest 11.6974  
  61. gbest:10.1764  

 

本文出自 “牛哥的博客” 博客,请务必保留此出处http://nxlhero.blog.51cto.com/962631/734212



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值