经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » MATLAB » 查看文章
MATLAB粒子群优化算法(PSO)
来源:cnblogs  作者:凯鲁嘎吉  时间:2019/7/10 11:34:45  对本文有异议

MATLAB粒子群优化算法(PSO)

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

一、介绍

  • 粒子群优化算法(Particle Swarm Optimization Algorithm)是一种群智能算法,为了寻求全局最优。群体迭代,粒子在解空间追随最优的粒子进行搜索。
  • 粒子群算法的思想源于对鸟群捕食行为的研究,模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作使群体达到最优目的,是一种基于Swarm Intelligence的优化方法。
  • 马良教授在他的著作《蚁群优化算法》一书的前言中写到:“自然界的蚁群、鸟群、鱼群、羊群、牛群、蜂群等,其实时时刻刻都在给予我们以某种启示,只不过我们常常忽略了大自然对我们的最大恩赐!”
  • 设想这样一个场景:一群鸟在随机搜索食物,已知
  • (1)在这块区域里只有一块食物;  (2)所有的鸟都不知道食物在哪里;  (3)但它们能感受到当前的位置离食物还有多远.  
  • 那么:找到食物的最优策略是什么呢? 
  • 搜寻目前离食物最近的鸟的周围区域,根据自己飞行的经验判断食物的所在。

  • PSO的基础: 信息的社会共享 

二、算法思路

  1. 每个寻优的问题解都被想像成一只鸟,称为“粒子”。所有粒子都在一个D维空间进行搜索。
  2. 所有的粒子都由一个fitness function 确定适应值以判断目前的位置好坏。
  3. 每一个粒子必须赋予记忆功能,能记住所搜寻到的最佳位置。
  4. 每一个粒子还有一个速度以决定飞行的距离和方向。这个速度根据它本身的飞行经验以及同伴的飞行经验进行动态调整。

三、算法流程与伪代码

  • c1: weight of local information
  • c2: weight of global information
  • p: particle's position
  • v: path direction
  • rand: random variable, 0<rand<1
  • number of particles: 10~50
  • c1+c2=4
  • v=v+c1*rand*(pbest-p)+c2*rand*(gbest-p);中右边第一项v: inertia, c1*rand*(pbest-p): personal influence, c2*rand*(gbest-p): social influence.

四、MATLAB程序

粒子群优化算法求解函数y=x+x*sin(x)在[-10, 10]的最大值.

pso.m

  1. function [best_x, best_y]=pso()
  2. %find the max value of a function
  3. %Author: kailugaji https://www.cnblogs.com/kailugaji/
  4. posMax=10;posMin=-10; %range of feasible solution
  5. x=posMin:0.1:posMax;
  6. y=my_fun(x); %object function
  7. plot(x,y);hold on; %plot function
  8. popsize=30; %number of particles
  9. max_iter=100; %maximum number of iterations
  10. position=rand(popsize,1);
  11. position=position*20-ones(popsize,1)*10; %particle's position
  12. vMax=1;vMin=-1; %range of velocity
  13. velosity=2*rand(popsize,1)-1; %path direction
  14. pbest=position; %current optimum
  15. gbest=position(1); %global optimum
  16. wBegin=1;wEnd=0.05;
  17. c1=2; %weight of local information
  18. c2=2; %weight of global information
  19. for i=1:max_iter
  20. position_new=position+velosity; %change direction of each particle
  21. velosity_new=(wEnd+(wBegin-wEnd)*(100-i)/100).*velosity+c1*rand().*(position-pbest.*ones(popsize,1))+c2*rand().*(position-gbest.*ones(popsize,1)); %inertia+personal influence+social influence
  22. for j=1:popsize
  23. if(position_new(j)>posMax)
  24. position_new(j)=posMax;
  25. end
  26. if(position_new(j)<posMin)
  27. position_new(j)=posMin;
  28. end
  29. if(velosity_new(j)>vMax)
  30. velosity_new(j)=vMax;
  31. end
  32. if(velosity_new(j)<vMin)
  33. velosity_new(j)=vMin;
  34. end
  35. if(my_fun(position_new(j))>my_fun(pbest(j)))
  36. pbest(j)=position_new(j);
  37. end
  38. if(my_fun(position_new(j))>my_fun(gbest))
  39. gbest=position_new(j);
  40. end
  41. end
  42. position=position_new;
  43. velosity=velosity_new;
  44. end
  45. plot(gbest,my_fun(gbest),'or');
  46. best_x=gbest;
  47. best_y=my_fun(gbest);

my_fun.m

  1. function y=my_fun(x)
  2. y=x+x.*sin(x);

五、实验结果

  1. >> [best_x, best_y]=pso()
  2. best_x =
  3. 8.0051
  4. best_y =
  5. 15.9190

当x=8.0051时,粒子群优化算法终止迭代,此时获得的最大值为y=15.9190。

六、参考文献

原文链接:http://www.cnblogs.com/kailugaji/p/11160570.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号