粒子群算法的简单介绍
粒子群算法
粒子群算法是一种启发式算法,它的核心是思想是利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的可行解。
思想就是放一群鸟,每过一段时间更新(迭代)每只鸟的位置和速度。
粒子(鸟)的速度主要与三个因素有关,1、惯性;2、自己飞行过程中的最佳位置(自我认知);3、整个鸟群飞行过程中的最佳位置(社会认知)。
核心公式有
其中,
\({v_i^d}\)表示第d次迭代时,第i个粒子的速度
\({x_i^d}\)表示第d次迭代时,第i个粒子的位置
w是惯性权重,一般取0.9~1.2
c1是个体学习因子,最初提出粒子群的大牛认为这两个因子取2合适
c2是社会学习因子
\({pbest_i^d}\)表示第 i 个粒子截止到第 d 次迭代的最佳位置
\({gbest^d}\)表示截止到第 d 次迭代,所有粒子的最佳位置
r1、r2是0~1的随机数,就是让过程具有随机性
一、惯性权重的改进
1、定值
直接取0.9~1.2之间的一个定值
2、(非)线性递减惯性权重
一个较大的惯性权值有利于全局搜索,而一个较小的权值则更利于局部搜索。
即惯性权值大表现为广撒网,惯性权值小表现为精准捕捞。
\({w^d}\)表示第 d 次迭代时的惯性权值,随着迭代次数的增加而线性递减。
同理,也有学者提出非线性递减:
三者的关系:
3、自适应惯性权重
对于每一次迭代,每一个粒子的适应度不同,根据这个适应度来确定权重,适应度越好(离最优解越近),则给的权重越小,让它搜索的步长小一点,反之越大。
4、随机惯性权重
之前只用线性/非线性递减时,我们让它前期广撒网,有利于全局搜索;后期精准捕捞,有利于局部搜索。
如果使用随机的惯性权重,可以避免在迭代前期局部搜索能力的不足,也可以避免在迭代后期全局搜索能力的不足。
(实际上就是每次迭代给惯性权重一个随机数)
两种实现:
1)直接用rand(1)给一个[0,1)的随机数
2)\({w=w_{end}+(w_{start}-w_{end})×rand(1)+\sigma×randn(1)}\)
\({\sigma}\)是正态分布的标准差,一般取0.2~0.5之间的一个数
二、学习因子的改进
1、压(收)缩因子法
个体学习因子c1和社会(群体)学习因子c2决定了粒子本身经验信息和其他粒子的经验信息对粒子运行轨迹的影响,其反映了粒子群之间的信息交流。
设置c1较大的值,会使粒子 过多地在自身的局部范围内搜索,而较大的c2的值,则又会促使粒子过早收敛到局部最优值。
为了有效地控制粒子的飞行速度,使算法达到全局搜索与 局部搜索两者间的有效平衡,Clerc构造了引入收缩因子的 PSO模型,采用了压缩因子,这种调整方法通过合适选取参 数,可确保PSO算法的收敛性,并可取消对速度的边界限制。
具体实现为:
就相当于对每次的速度进行了压缩。
2、非对称学习因子
由于c1越大,全局搜索能力越强,c2越大,局部搜索能力越强,因此在搜索前期我们应当让c1大、c2小,在后期让c1小、c2大。
所以让c1随迭代次数线性递减、c2线性递增,也可以尝试一下非线性的效果。
在一个学者的一篇论文中,c1从2.5到0.5,c2从1.0到2.25,也可以尝试其他值。
小结:粒子群算法需结合其他智能算法才适合解决组合优化问题,所以组合优化问题使用智能算法的话优先选择模拟退火算法。