粒子群算法是一种基于鸟类觅食开发出来的优化算法,它是从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质。

From 《An Improved PSO Algorithm to Optimize BP Neural Network》

PSO算法的搜索性能取决于其全局探索和局部细化的平衡,这在很大程度上依赖于算法的控制参数,包括粒子群初始化、惯性因子w、最大飞翔速度和加速常数与等。

PSO算法具有以下优点:

不依赖于问题信息,采用实数求解,算法通用性强。

需要调整的参数少,原理简单,容易实现,这是PSO算法的最大优点。

协同搜索,同时利用个体局部信息和群体全局信息指导搜索。

收敛速度快, 算法对计算机内存和CPU要求不高。

更容易飞越局部最优信息。对于目标函数仅能提供极少搜索最优值的信息,在其他算法无法辨别搜索方向的情况下,PSO算法的粒子具有飞越性的特点使其能够跨过搜索平面上信息严重不足的障碍,飞抵全局最优目标值。比如Generalized Rosenbrock函数全局最小值在原占附近.但是此函数全局最优值与可到达的局部最优值之间右一条独长的山路,曲面山谷中点的最速下降方向几乎与到函数最小值的最佳方向垂直,找到全局最小值的可能性微乎其微, 但是PSO算法完全有可能找到全局最优值。

同时, PSO算法的缺点也是显而易见的:

算法局部搜索能力较差,搜索精度不够高。

算法不能绝对保证搜索到全局最优解。

PSO算法设计的具体步骤如下:

初始化粒子群(速度和位置)、惯性因子、加速常数、最大迭代次数、算法终止的最小允许误差。

评价每个粒子的初始适应值。

将初始适应值作为当前每个粒子的局部最优值,并将各适应值对应的位置作为每个粒子的局部最优值所在的位置。

将最佳初始适应值作为当前全局最优值,并将最佳适应值对应的位置作为全局最优值所在的位置。

依据公式更新每个粒子当前的飞翔速度。

对每个粒子的飞翔速度进行限幅处理,使之不能超过设定的最大飞翔速度。

依据公式更新每个粒子当前所在的位置。

比较当前每个粒子的适应值是否比历史局部最优值好,如果好,则将当前粒子适应值作为粒子的局部最优值,其对应的位置作为每个粒子的局部最优值所在的位置。

在当前群中找出全局最优值,并将当前全局最优值对应的位置作为粒子群的全局最优值所在的位置。

重复步骤(5)~(9),直到满足设定的最小误差或最大迭代次数

输出粒子群的全局最优值和其对应的位置以及每个粒子的局部最优值和其对应的位置。

本文中我们假设要求解一个维度为10的向量,这里的适应度函数采用简单的线性误差求和。

1 #基本粒子群算法

2 #vi+1 = w*vi+c1*r1*(pi-xi)+c2*r2*(pg-xi) 速度更新公式

3 #xi+1 = xi + a*vi+1 位置更新公式(一般a=1)

4 #w = wmax -(wmax-wmin)*iter/Iter 权重更新公式

5 #iter当前迭代次数 Iter最大迭代次数 c1、c2学习因子 r1、r2随机数 pi粒子当前最优位置 pg粒子群全局最优

6 #初始化 wmax=0.9 wmin=0.4 通常c1=c2=2 Iter对于小规模问题(10,20)对于大规模(100,200)

7 #算法优劣取决于w、c1和c2,迭代结束的条件是适应度函数的值符合具体问题的要求

8 #初始化粒子群,包括尺寸、速度和位置

9 #本算法假设想要的输出是长度为10的矩阵,y=[1.7]*10,适应度函数f(x)= |x-y| <=0.001符合要求

10

11 importnumpy as np12

13 swarmsize = 500

14 partlen = 10

15 wmax,wmin = 0.9,0.4

16 c1 = c2 = 2

17 Iter = 400

18

19 defgetwgh(iter):20 w = wmax - (wmax-wmin)*iter/Iter21 returnw22

23 defgetrange():24 randompv = (np.random.rand()-0.5)*2

25 returnrandompv26

27 definitswarm():28 vswarm,pswarm =np.zeros((swarmsize,partlen)),np.zeros((swarmsize,partlen))29 for i inrange(swarmsize):30 for j inrange(partlen):31 vswarm[i][j] =getrange()32 pswarm[i][j] =getrange()33 returnvswarm,pswarm34

35 defgetfitness(pswarm):36 pbest =np.zeros(partlen)37 fitness =np.zeros(swarmsize)38 for i inrange(partlen):39 pbest[i] = 1.7

40

41 for i inrange(swarmsize):42 yloss = pswarm[i] -pbest43 for j inrange(partlen):44 fitness[i] +=abs(yloss[j])45 returnfitness46

47 defgetpgfit(fitness,pswarm):48 pgfitness =fitness.min()49 pg =pswarm[fitness.argmin()].copy()50 returnpg,pgfitness51

52 vswarm,pswarm =initswarm()53 fitness =getfitness(pswarm)54 pg,pgfit =getpgfit(fitness,pswarm)55 pi,pifit =pswarm.copy(),fitness.copy()56

57 for iter inrange(Iter):58 if pgfit <= 0.001:59 break

60 #更新速度和位置

61 weight =getwgh(iter)62 for i inrange(swarmsize):63 for j inrange(partlen):64 vswarm[i][j] = weight*vswarm[i][j] + c1*np.random.rand()*(pi[i][j]-pswarm[i][j]) + c2*np.random.rand()*(pg[j]-pswarm[i][j])65 pswarm[i][j] = pswarm[i][j] +vswarm[i][j]66 #更新适应值

67 fitness =getfitness(pswarm)68 #更新全局最优粒子

69 pg,pgfit =getpgfit(fitness,pswarm)70 #更新局部最优粒子

71 for i inrange(swarmsize):72 if fitness[i]

76 for j inrange(swarmsize):77 if pifit[j] <78 pgfit="pifit[j].copy()79" pg="pi[j].copy()80" print>

下面的结果分别是迭代300次和400次的结果。

可以看到400次迭代虽然适应度没有达到预期,得到的向量已经很接近期望的结果了。

写在最后:粒子群算法最重要的参数就是惯性权重和学习因子,针对这两个参数有了新的优化粒子群算法(IPSO)。还有初始化粒子群时速度和位置范围的确定,包括种群的大小和迭代次数的选择,这些都是‘摸着石头过河’,没有标准答案。

78>

粒子群算法python_用Python实现粒子群算法(PSO)相关推荐

  1. 利用python语言实现分类算法_使用python实现kNN分类算法

    k-近邻算法是基本的机器学习算法,算法的原理非常简单: 输入样本数据后,计算输入样本和参考样本之间的距离,找出离输入样本距离最近的k个样本,找出这k个样本中出现频率最高的类标签作为输入样本的类标签,很 ...

  2. python实现蒙特卡洛算法_用Python实现基于蒙特卡洛算法小实验

    用Python实现基于蒙特卡洛算法小实验 蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯· 诺伊曼 ,他在20世纪40年代中期用驰名世界的赌城- ...

  3. python电影推荐算法_基于Python的电影推荐算法

    原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...

  4. 协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item)

    协调过滤推荐概述 协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分.所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过 ...

  5. 随机算法python_在python中实现随机选择

    想从一个序列中随机抽取若干元素,或者想生成几个随机数. random 模块有大量的函数用来产生随机数和随机选择元素.比如,要想从一个序列中随机的抽取一个元素,可以使用random.choice() : ...

  6. 视频异常检测算法 python_使用Python进行异常检测

    作者|Rashida Nasrin Sucky 编译|VK 来源|Towards Datas Science 异常检测可以作为异常值分析的一项统计任务来处理.但是如果我们开发一个机器学习模型,它可以像 ...

  7. 令牌桶算法和漏桶算法python_图解Python算法

    普通程序员,不学算法,也可以成为大神吗? 对不起,这个,绝对不可以. 可是算法好难啊~~看两页书就想睡觉-- 所以就不学了吗?就一直当普通程序员吗? 如果有一本算法书,看着很轻松--又有代码示例--又 ...

  8. 维特比算法 python_用python实现与理解HMM-维特比算法

    HMM-维特比算法理解与实现(python) 解码问题 给定观测序列 \(O=O_1O_2...O_T\) ,模型 \(\lambda (A,B,\pi)\) ,找到最可能的状态序列 \(I^∗=\{ ...

  9. 深度优先搜索 python_黄哥Python:图深度优先算法(dfs)

    深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...

  10. 情感分析算法 python_使用python+机器学习方法进行情感分析(详细步骤)

    不是有词典匹配的方法了吗?怎么还搞多个机器学习方法. 因为词典方法和机器学习方法各有千秋. 机器学习的方法精确度更高,因为词典匹配会由于语义表达的丰富性而出现很大误差,而机器学习方法不会.而且它可使用 ...

最新文章

  1. 优秀的 Java 项目代码都是如何分层的?
  2. 闹乌龙!京东云辟谣:停止云服务?根本没那回事儿
  3. 华为eNsp模拟器安装常见报错汇总
  4. MFC中绘制动态曲线
  5. 记录 Duplicate spring bean id dubbo
  6. Moss、SharePoint数据库迁移问题
  7. 《处理器虚拟化技术》
  8. tomcat修改端口以及启动项目404
  9. 安卓12解除进程限制方法汇总
  10. Java 纸牌游戏 牛牛 逻辑代码 实现
  11. The repository 'http://ppa.launchpad.net/octave/stable/ubuntu bionic Release' does not have a Releas
  12. java-家庭作业2
  13. 用AI制作高保真图片
  14. 今日总结------技术是最不值钱的
  15. 空调控制系统节点服务器,空调的云服务器
  16. ASP.NET MVC身份认证与授权
  17. FS2222可调过压过流芯片IC,40V耐压过压保护可调OVP可调OCP
  18. JAVA_数组的截取
  19. linux 游戏引擎库,用C++实现跨平台游戏引擎开发
  20. “超限效应”和“改宗心理效应”

热门文章

  1. 自适应算法和学习算法的区别
  2. 训练神经网络的详细步骤,神经网络训练完怎么用
  3. 单节1A锂电池充电芯片
  4. linux文件系统-文件的写与读
  5. JavaScript写入文件到本地
  6. android 波斯文排序,android 阿拉伯,波斯字符串从右到左显示问题
  7. 3t studio 导出数据_Studio 3T下操作MongoDB的基本命令(转载)
  8. 调音台docker教程_Docker菜鸟教程 - Docker入门教程 - Docker基础教程 - 动力节点
  9. 电子书阅读器背景颜色修改方法
  10. 代码审计“小迪安全课堂笔记” java