type
status
date
slug
summary
tags
category
icon
password
Property
原理
粒子群算法的思想源于对鸟类捕食行为的研究,模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作使群体达到最优目的。 设想这样的一个场景,一群鸟在随机的搜索食物,在某块区域里有一块食物,所有的鸟都不知道食物在哪里,但是他们可以感受到当前的位置离食物还有多远,此时找到食物的最优策略是什么?答案是:搜寻目前离食物最近的鸟的周围区域,根据自己的飞行经验判断食物的所在。
PSO正是从这种模型中得到了启发:
- 1.每个寻优问题的解都被想象成一只鸟,称为‘粒子’,所有的粒子都在一个D维空间进行搜索。
- 2.所有的粒子都由一个fitness function确定适应值以判断目前位置的好坏。
- 3.每个粒子都被赋予记忆功能,能记住所搜寻到的最佳位置
- 4.每个粒子还有一个速度以决定飞行的距离和方向,这个速度根据本身的飞行经验及同伴的飞行经验进行动态调整
可以看出粒子群算法的基础在于信息的社会共享
维空间中,有 个粒子:
粒子位置:,将 代入适应函数 求适应值;
粒子速度:
粒子个体经历过的最好位置: 种群所经历过的最好位置:
通常,在第 维的位置变化范围限定在( )内,速度变化范围限定在( ) 内(即在迭代中若超出了边界值,则该维的速度或位置被限制为该维最大速度或边界位置)。速度及位置的更新公式有了上面的了解后,一个很关键的问题就是粒子的速度以及位置如何更新?
粒子i的第d维速度更新公式:
其速度更新公式包含三个部分: 第一部分为粒子先前的速度 第二部分为‘认知’部分,表示粒子本身的思考,可理解为粒子i当前位置与自己最好位置之间的距离 第三部分为‘社会部分’,表示粒子间的信息共享和合作,可理解为粒子i当前位置与群体最好位置之间的距离。
粒子i的第d维位置更新公式:
:第k次迭代粒子i的飞行速度矢量的第d维分量
:第k次迭代粒子i位置矢量的第d维分量
c1,c2:加速度常数,调节学习最大步长
r1,r2:两个随机函数,取值范围[0,1],以增加随机性
w:惯性权重,非负数,调节对解空间的搜索范围。
算法流程:
注意该算法在解决具体问题时需要注意以下几点:
- 种群大小m:
m很小很容易陷入局部最优,m很大,pso的优化能力很好,当种群数目增长至一定水平时,再增长将不再有显著的作用
- 权重因子
对于粒子的速度更新的三部分:
a. 惯性因子w=1表示基本的粒子群算法,w=0表示失去对粒子本身的速度记忆。
b. 自我认知部分的学习因子c1=0表示无私型的粒子群算法,只有社会,没有自我,这样会使群体丧失多样性,从而容易导致陷入局部最优而无法跳出。
c. 社会经验部分的学习因子c2=0表示自我型的粒子群算法,只有自我没有社会,这样导致没有信息的社会共享,算法收敛速度缓慢。 这三个参数的选择非常重要,如何调整这三个参数使算法避免早熟又可以比较快的收敛,对于解决实际问题意义较大。
- 最大速度
速度限制的作用为:维护算法的探索能力与开发能力的平衡。
较大时,探索能力强,但是粒子容易飞过最优解;较小时,开发能力强,但是容易陷入局部最优解。
一般设定为每维变量变化范围的10%~20%
- 停止准则
a.最大迭代次数 b.可以接受的满意解(通过fitness function判断是否满意)
- 粒子空间的初始化
较好地选择粒子的初始化空间,将大大缩短收敛时间。初始化空间根据具体问题的不同而不同,根据具体问题进行设定。
该算法为数不多的关键参数的设置却对算法的精度和效率有着显著影响
- 线性递减权值
最大惯性权重, 最小惯性权重,run当前迭代次数, 为算法迭代总次数
较大的w有较好的全局收敛能力,较小的w则有较强的局部收敛能力。因此,随着迭代次数的增加,惯性权重w应不断减少,从而使 得粒子群算法在初期具有较强的全局收敛能力,而晚期具有较强的局部收敛能力。
- 收缩因子法
1999年,Clerc引入收缩因子以保证算法的收敛性,即速度更新公式改为上式,其中,收缩因子K为受φ1 φ2 限制的w。φ1 φ2是需要预先设定的模型参数。
收缩因子法控制系统行为最终收敛,且可以有效搜索不同区域,该法能得到较高质量的解。
- 算法的邻域拓扑结构
粒子群算法的邻域拓扑结构包括两种,一种是将群体内所有个体都作为粒子的邻域,另一种是只将群体中的部分个体作为粒子的邻域.邻域拓扑结构决定群体历史最优位置,因此该算法分为全局粒子群算法和局部粒子群算法。
全局粒子群算法 1. 粒子自己历史最优值 2. 粒子群体的全局最优值
局部粒子群算法 1. 粒子自己历史最优值 2. 粒子邻域内粒子的最优值 邻域随迭代次数的增加线性变大,最后邻域扩展到整个粒子群。
实践证明:全局版本的粒子群算法收敛速度快,但是容易陷入局部最优;局部版本的粒子群算法收敛速度慢,但是很难陷入局部最优。现在的粒子群算法大都在收敛速度与摆脱局部最优这两个方面下功夫,其实这两个方面是矛盾的,看如何更好的折中了。
代码
组合遗传粒子群算法的旅行商问题
混合粒子群算法的基本运算过程如下:
初始化编码:设置最大进化代数T_max、随机生成m个染色体的群体编码
适应度函数:对每一个染色体,都有其个体适应度值
交叉:将每个个体与该个体的个体极值和当前群体的群体极值进行交叉操作更新,只有交叉后的新个体比旧个体的适应度更好,才替换更改。
变异:对单个染色体随机交换两个点的位置,如果变异后的个体比旧个体的适应度更好,就替换更改
调库实现PSO
PSO输入参数
入参 | 默认值 | 意义 |
func | - | 目标函数 |
n_dim | - | 目标函数的维度 |
size_pop | 50 | 种群规模 |
max_iter | 200 | 最大迭代次数 |
lb | None | 每个参数的最小值 |
ub | None | 每个参数的最大值 |
w | 0.8 | 惯性权重 |
c1 | 0.5 | 个体记忆 |
c2 | 0.5 | 集体记忆 |
constraint_ueq | 空元组 | 不等式约束 |
PSO输出参数
pso.record_value
每一代的粒子位置、粒子速度、对应的函数值。pso.record_mode = True
才开启记录
pso.gbest_y_hist
历史最优函数值
pso.best_y
最优函数值 (迭代中使用的是pso.gbest_x
,pso.gbest_y
)
pso.best_x
最优函数值对应的输入值
加入你的非线性约束是个圆内的面积
(x[0] - 1) ** 2 + (x[1] - 0) ** 2 - 0.5 ** 2<=0
可以有多个非线性约束,向
constraint_ueq
加就行了动画演示