本文介绍了一种综合学习的粒子群优化算法,该算法的提出是为了使得粒子群优化在处理多模态问题(即多峰问题)上能够避免算法落入局部最优的风险。文章参考自JJ Liang,AK Qin,PN Suganthan,S Baskar所写的《Comprehensive learning particle swarm optimizer for global optimization of multimodal functions》
本文介绍的综合学习粒子群优化算法 (CLPSO)是粒子群优化算法 (PSO) 的一种变体,它使用一种新颖的学习策略,即使用所有其他粒子的历史最佳信息来更新粒子的速度。 这种策略可以保持群的多样性,以防止过早收敛。 对多模态测试函数(多峰函数)及组合函数进行了相关的测试。 结果表明,与
在经典的
但是这就像是一把双刃剑,收敛过快在经典的
然而在经典的
在
从公式(1)来看,广泛学习策略的速度更新公式相较于经典粒子群优化算法缺少了全局最优对粒子的引导,只有一个
首先要明确的是,$pBest_{f_i(d)}^d$ 不是所更新速度粒子的历史最优的第
在粒子
在上式粒子$x$取值文中并未特别说明,一般来说取值范围为:
$x=1,2,...,N;x\not ={i}$ ,但是对于这个取值范围约束产生的作用效果意义不大,而不排除当前粒子随机选择粒子相对于实现来说也更加方便。当然,约束取值版本可在code文件夹中获取。
即当产生的随机数大于概率
当
在综合学习策略中,粒子会依概率去学习其他粒子对应维度信息。因此在算法初始化时,需要对每个维度都初始化一个学习概率$Pc$,写成向量的形式为:$\vec{Pc} = [pc_1,pc_2,\dotsb,pc_N]$,然后每次都会在对应维度生成一个随机数,再根据公式(2)与对应维度学习概率$Pc_i$进行比较,判断是否需要进行综合学习策略。
竞技过程并非和综合学习是同级别关系,竞技过程是综合学习策略中的一个过程,当粒子进入综合学习策略时,需要选择粒子$x$,这个时候就进入了竞技过程。
在粒子
- 首先随机在
$x$ 的取值范围内随机选择两个粒子的历史最优位置。即除却当前要更新速度的粒子之外的其他粒子的历史最优位置。 - 在随机选择的两个粒子中比较两个粒子的历史最优位置的适应值,选择适应值更优越的历史最优位置作为此时的
$pBest_x^d$ ,以此进行速度的更新。此时更新公式可写成式(5)。 - 当出现极端情况:某个粒子更新速度所有的维度都是使用的自身历史最优位置的对应维度进行更新,则随机选择一个维度来学习另一个粒子的历史最优对应维度。
$$ v_i^d=\omega v_i^d+crand_i^d(pBest_x^d-x_i^d)\tag{5} $$
这里稍微进行补充:
- 第一点:我们在进行函数求解时,适应值一般是用是否更优越来描述,而不是大小描述,这是由于对于求解的问题不一样,评判标准不一样。当求解函数最大值时,则适应度越大越优越;当求解的问题是求解最小值时,适应度越小越优越。因此在以往的描述中,一般都是使用适应值的优越程度,而不使用适应值大小之类的描述,以免造成误解。
- 第二点:上面第三个过程在文献[1]中并未提及如何选择另一个粒子,这里就暂定从除更新粒子外的其他粒子中的随机选择一个粒子。
上图是作者论文中描述的竞技选择过程流程图,但是在其中存在一个问题,那便是对论文中第三个要点图中并未体现,也并未注明。由此,图与文便产生了冲突。具体如何处理,我会在最后进行相关性说明。
在作者的实验过程中,发现了 CLPSO 与 经典 PSO 有三个主要区别:
- 经典PSO的粒子学习对象来自自身历史最优位置及全局历史最优。在CLPSO中任意一个粒子的历史最优位置都有可能成为学习对象,引导粒子的飞行方向。
- 与从所有维度的相同粒子的
$pBest$ 学习的经典$PSO$ 不同,粒子的每个维度通常可以从一代甚至于几代相同维度的不同$pBest$ 中学习。 换句话说,一个粒子的每个维度都可以从不同粒子的$pBest$ 的对应维度中学习。 - 与经典
$PSO$ 中的每一代同时从两个样本($pBest$ 和$gBest$ )学习不同,$CLPSO$ 粒子的每个维度只从一个样本学习几代。
在文献[1]中,作者提出广泛学习策略能够增加种群的多样性,同时能提高算法在多模态(多峰)问题的求解能力。
此外提出经典
其主要出发点在于当多个历史最优值在同一维度线上,或者直接看成上图的直线,且粒子在
下面仅为个人观点:个人觉得振荡有更大的可能发生在
$CLPSO$ 中,而非经典$PSO$ ,正如文献[1]提供的图,有两者在中间拉扯,但是在每次运行中历史最优都会被更新,倘若该粒子这次被$gBest$ 拉扯到偏向$gBest$ 位置,如果该位置优于该粒子的历史最优位置,那么就会更新。所以虽然可能出现在中间的情形,但一定会偏向一边移动。而由于$CLPSO$ 只有一个学习对象$pBest_{f_i(d)}^d$ ,当这个学习对象在广泛学习过程中得到的位置在整体上总是劣与该粒子,那么就会出现该粒子一直在比当前粒子历史最优更差的区域不停的游荡。
作者还提出,即使在远离全局最优的局部最优区域中,$gbest$ 也可能影响粒子沿其方向移动。 如果
由于在文献 [2] 的测试中中,作者发现如果对群体中的所有粒子使用相同的
至于该文对旋转及非旋转问题的定义文中未能提及,本人才疏学浅,无力解释,便对该问题不多言。但是这个问题对算法的理解与实现是没有关系的。
因此,作者提出对不同的粒子生成不同的概率值
在
在该文中,对于位置越界的情况并未进行边界处理。
在
算法的整体代码编写依照算法流程图!
在上面的流程图中,速度更新时的判断出现了错误,这里使用在上文分析的方法。同时图中计算惯性权重公式是有问题的,应该是少了一个减号,真正的惯性权重计算公式应为: $$ \omega = \omega_0-(\omega_0-\omega_1)*\frac{iterate}{MaxIterate}\tag{8} $$ 其中
$iterate$ 是当前迭代次数,$MaxIterate$ 是指最大迭代次数。
当
整体流程到此结束。
鉴于我对文献[1]某些地方理解存在偏差,为了更加严谨的实现代码,我写了三个不同版本的
- 版本一:按照流程图的方式书写代码。在该代码中,没有第三个要点,即当粒子的所有维度都没有满足
$rand_i^d<Pc_i$ ,$CLPSO$ 也不做任何措施,如上面的广泛学习流程图所示。 - 版本二:按照文字描述,当粒子所有维度都没有满足
$rand_i^d<Pc_i$ ,则随机选择一个维度,同时从剩余粒子中随机选择一个粒子的对应维度进行替换。 - 版本三:在版本一的基础上,对粒子$x$取值进行约束,取值范围为:
$x=1,2,...,N;x\not ={i}$ 。
- 从实验结果来看,三者之间的差别并不是很大。当然各位也可以进行编写测试,或者可直接使用我的代码。
代码详情见code文件夹
[1] Liang J J , Qin A K , Suganthan P N , et al. Comprehensive learning particle swarm optimizer for global optimization of multimodal functions[J]. IEEE Transactions on Evolutionary Computation, 2006, 10(3):281-295. [2] Liang J J , Qin A K , Suganthan P M , et al. Particle swarm optimization algorithms with novel learning strategies[C]// IEEE International Conference on Systems. IEEE, 2004.