转自:https://www.cnblogs.com/21207-iHome/p/6062535.html

粒子群算法的思想源于对鸟/鱼群捕食行为的研究,模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作使群体达到最优目的,是一种基于Swarm Intelligence的优化方法。它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。粒子群算法与其他现代优化方法相比的一个明显特色就是所需要调整的参数很少、简单易行,收敛速度快,已成为现代优化方法领域研究的热点。

粒子群算法的基本思想

设想这样一个场景:一群鸟在随机搜索食物。已知在这块区域里只有一块食物;所有的鸟都不知道食物在哪里;但它们能感受到当前的位置离食物还有多远。那么找到食物的最优策略是什么呢?

  1. 搜寻目前离食物最近的鸟的周围区域

  2. 根据自己飞行的经验判断食物的所在。

PSO正是从这种模型中得到了启发,PSO的基础是信息的社会共享

算法介绍

每个寻优的问题解都被想像成一只鸟,称为“粒子”。所有粒子都在一个D维空间进行搜索。

所有的粒子都由一个fitness function 确定适应值以判断目前的位置好坏。

每一个粒子必须赋予记忆功能,能记住所搜寻到的最佳位置。

每一个粒子还有一个速度以决定飞行的距离和方向。这个速度根据它本身的飞行经验以及同伴的飞行经验进行动态调整。


粒子速度更新公式包含三部分: 第一部分为“惯性部分”,即对粒子先前速度的记忆;第二部分为“自我认知”部分,可理解为粒子i当前位置与自己最好位置之间的距离;第三部分为“社会经验”部分,表示粒子间的信息共享与合作,可理解为粒子i当前位置与群体最好位置之间的距离。

粒子群算法流程

第1步 在初始化范围内,对粒子群进行随机初始化,包括随机位置和速度

第2步 计算每个粒子的适应值

第3步 更新粒子个体的历史最优位置

第4步 更新粒子群体的历史最优位置

第5步 更新粒子的速度和位置

第6步 若未达到终止条件,则转第2步

粒子群算法流程图如下:
  

计算示例

以Ras函数(Rastrigin’s Function)为目标函数,求其在x1,x2∈[-5,5]上的最小值。这个函数对模拟退火、进化计算等算法具有很强的欺骗性,因为它有非常多的局部最小值点和局部最大值点,很容易使算法陷入局部最优,而不能得到全局最优解。如下图所示,该函数只在(0,0)处存在全局最小值0。

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')import numpy as np
import matplotlib.pyplot as plt# 目标函数定义
def ras(x):y = 20 + x[0]**2 + x[1]**2 - 10*(np.cos(2*np.pi*x[0])+np.cos(2*np.pi*x[1]))return y# 参数初始化
w = 1.0
c1 = 1.49445
c2 = 1.49445maxgen = 200   # 进化次数
sizepop = 20   # 种群规模# 粒子速度和位置的范围
Vmax =  1
Vmin = -1
popmax =  5
popmin = -5# 产生初始粒子和速度
pop = 5 * np.random.uniform(-1,1,(2,sizepop))
v = np.random.uniform(-1,1,(2,sizepop))fitness = ras(pop)             # 计算适应度
i = np.argmin(fitness)      # 找最好的个体
gbest = pop                    # 记录个体最优位置
zbest = pop[:,i]              # 记录群体最优位置
fitnessgbest = fitness        # 个体最佳适应度值
fitnesszbest = fitness[i]      # 全局最佳适应度值# 迭代寻优
t = 0
record = np.zeros(maxgen)
while t < maxgen:# 速度更新v = w * v + c1 * np.random.random() * (gbest - pop) + c2 * np.random.random() * (zbest.reshape(2,1) - pop)v[v > Vmax] = Vmax     # 限制速度v[v < Vmin] = Vmin# 位置更新pop = pop + 0.5 * v;pop[pop > popmax] = popmax  # 限制位置pop[pop < popmin] = popmin'''# 自适应变异p = np.random.random()             # 随机生成一个0~1内的数if p > 0.8:                          # 如果这个数落在变异概率区间内,则进行变异处理k = np.random.randint(0,2)     # 在[0,2)之间随机选一个整数pop[:,k] = np.random.random()  # 在选定的位置进行变异 '''# 计算适应度值fitness = ras(pop)# 个体最优位置更新index = fitness < fitnessgbestfitnessgbest[index] = fitness[index]gbest[:,index] = pop[:,index]# 群体最优更新j = np.argmin(fitness)if fitness[j] < fitnesszbest:zbest = pop[:,j]fitnesszbest = fitness[j]record[t] = fitnesszbest # 记录群体最优位置的变化   t = t + 1# 结果分析
print zbestplt.plot(record,'b-')
plt.xlabel('generation')
plt.ylabel('fitness')
plt.title('fitness curve')
plt.show()

参数选择与优化

参数w,c1,c2的选择分别关系粒子速度的3个部分:惯性部分、社会部分和自身部分在搜索中的作用。如何选择、优化和调整参数,使得算法既能避免早熟又能比较快的收敛,对工程实践有着重要意义。

1.惯性权重w描述粒子上一代速度对当前代速度的影响。w值较大,全局寻优能力强,局部寻优能力弱;反之,则局部寻优能力强。当问题空间较大时,为了在搜索速度和搜索精度之间达到平衡,通常做法是使算法在前期有较高的全局搜索能力以得到合适的种子,而在后期有较高的局部搜索能力以提高收敛精度。所以w不宜为一个固定的常数。

wmax最大惯性权重,wmin最小惯性权重,run当前迭代次数,runmax为算法迭代总次数。较大的w有较好的全局收敛能力,较小的w则有较强的局部收敛能力。因此,随着迭代次数的增加,惯性权重w应不断减少,从而使得粒子群算法在初期具有较强的全局收敛能力,而晚期具有较强的局部收敛能力。

2.学习因子c2=0称为自我认识型粒子群算法,即“只有自我,没有社会”,完全没有信息的社会共享,导致算法收敛速度缓慢;学习因子c1=0称为无私型粒子群算法,即“只有社会,没有自我”,会迅速丧失群体多样性,容易陷入局部最优解而无法跳出;c1,c2都不为0,称为完全型粒子群算法,完全型粒子群算法更容易保持收敛速度和搜索效果的均衡,是较好的选择。

3.群体大小m是一个整数,m很小时陷入局部最优解的可能性很大;m很大时PSO的优化能力很好,但是当群体数目增长至一定水平时,再增长将不再有显著作用,而且数目越大计算量也越大。群体规模m 一般取20~40,对较难或特定类别的问题 可以取到100~200。

4.粒子群的最大速度Vmax对维护算法的探索能力与开发能力的平衡很重要,Vmax较大时,探索能力强,但粒子容易飞过最优解;Vmax较小时,开发能力强,但是容易陷入局部最优解。Vmax一般设为每维变量变化范围的10%-20%

粒子群优化算法(Particle Swarm Optimization)相关推荐

  1. 一文搞懂什么是粒子群优化算法(Particle Swarm Optimization,PSO)【附应用举例】

    Python代码链接放文末. 本文参考了很多张军老师<计算智能>的第六章知识. 本文来源:https://blog.csdn.net/qq_44186838/article/details ...

  2. 白鹭群优化算法(Egret Swarm Optimization Algorithm)

    欢迎加入一同交流,QQ群:916165264 白鹭群优化算法(Egret Swarm Optimization Algorithm)是一种结合了雪白鹭(坐等策略,Sit-And-Wait Strate ...

  3. 粒子群优化算法的寻优算法——非线性函数极值寻优Matlab

    粒子群算法的起源 1995年,受到鸟群觅食行为的规律性启发,James Kennedy和Russell Eberhart建立了一个简化算法模型,经过多年改进最终形成了粒子群优化算法(Particle ...

  4. 【计算智能】读书笔记 第六章节 粒子群优化算法

    文章目录 1. 算法简介 2. 算法基本流程 算法流程图 伪代码 3. 算法改进研究 3.1 算法理论研究的改进 3.2 算法拓扑结构的改进 3.2.1 静态拓扑结构的改进 3.2.2 动态拓扑结构的 ...

  5. pso解决tsp matlab,计算智能课程设计_粒子群优化算法求解旅行商问题_Matlab实现.doc...

    计算智能课程设计_粒子群优化算法求解旅行商问题_Matlab实现.doc 摘要:TSP是一个典型的NPC问题.本文首先介绍旅行商问题和粒子群优化算法的基本概念.然后构造一种基于交换子和交换序[1]概念 ...

  6. 粒子群优化算法 PSO

    文章目录 1.基本内容 1.1 概念 1.2 基本原理 1.3 基本步骤 2.代码分析 2.1 Rastrigrin()函数 2.2 Schaffer()函数 2.3 Griewank()函数 2.4 ...

  7. 【优化算法】粒子群优化算法

    粒子群优化算法 粒子群优化算法简介 粒子群优化算法原理 粒子群优化算法的数学描述 粒子群优化算法框架 PySwarms:Python中粒子群优化的研究工具包 PySwarms快速使用 示例:编写自己的 ...

  8. matlab粒子群优化算法工具箱,MATLAB粒子群优化算法(PSO)

    MATLAB粒子群优化算法(PSO) 一.介绍 粒子群优化算法(Particle Swarm Optimization Algorithm)是一种群智能算法,为了寻求全局最优.群体迭代,粒子在解空间追 ...

  9. 【项目实战】Python实现用PSO粒子群优化算法对KMeans聚类模型进行优化项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取. 1.项目背景 粒子群优化算法(Particle Swarm optimizat ...

  10. 【原理与代码讲解】粒子群优化算法 PSO(基础版)

    0 前言 Gitee 代码地址: https://gitee.com/futurelqh/GA 粒子群优化算法(Particle Swarm Optimization,PSO),其思想源于对鸟群觅食过 ...

最新文章

  1. android tombstone发生过程,Android Tombstone 分析
  2. 1470篇!CVPR2020结果出炉(附13篇论文链接/开源代码/解读)
  3. 矩阵论习题:设A,B为投影矩阵,证明A+B仍为投影矩阵当且仅当AB=BA=0。
  4. SpringBoot 集成 Elasticsearch
  5. 从ODA看一体机的木桶理论
  6. php的验证码要gd库,PHP利用GD库实现一个简单的验证码
  7. Wp keyword link 标签自动内链/文章关键词内链 WordPress插件
  8. KafkaConsumer.poll : Timeout must not be negative
  9. Linux工作笔记037---Centos下Linux创建用户_用户组_删除用户
  10. 倪静(201550919)第一次作业
  11. animite cc html5项目,Animate CC HTML5/Canvas使用actionscript控制嵌套的MovieClip時間軸
  12. Pssp-mvirt: 基于多视图深度学习架构的肽二级结构预测
  13. 51nod 1108.距离之和最小 V2 - 曼哈顿距离
  14. 干货分享:小程序项目实践和经验总结
  15. input输入框限制(座机,手机号码)
  16. Spring Doc OpenAPI3.0 抛弃SpringFox拥抱SpringDoc
  17. python standardprint_Python 机器学习 标准差(Standard Deviation)
  18. vue移动端深坑之微信浏览器相关优化方案
  19. 在职Java_java在职学习班
  20. 基于ymir2.0版本搭建本地化调试的环境

热门文章

  1. 常见的NTP授时服务器地址(本文不断更新中)
  2. android smb开源,搭建samba服务---实现跨平台文件共享
  3. 请问台式电扇一、二档启动不了,三档还要用手转下才行,是电容坏了吗?
  4. uniapp 微信小程序 多人语音
  5. 深入理解java虚拟机—— 虚拟机 新型垃圾收集器 Shenandoah GC, ZGC
  6. mysql数据库事务类型
  7. 如何查询中信信用卡订单号
  8. 2021年更快乐的40件事
  9. 【面试题】面试不面试,你都必须得掌握的vue知识
  10. 十个改变降血压:每天吃四瓣蒜走六千步