粒子群算法,也称粒子群优化算法或鸟群觅食算法,缩写PSO,由Kennedy和Eberhart于1995年提出;
群体迭代,粒子在解空间追随最优的粒子进行搜索;
粒子群算法:1)简单易行;2)收敛速度快;3)设置参数少;
已成为现代优化方法领域研究的热点。
粒子群算法的思想源于对鸟群捕食行为的研究;
模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作使群体达到最优目的,是一种基于Swarm Intelligent的优化方法;
马良教授在他的著作《蚁群优化算法》一书的前言中写到:
“自然界的蚁群、鸟群、鱼群、羊群、牛群、蜂群等,其实时时刻刻都在给予我们以某种启示,只不过我们常常忽略了大自然对我们的最大恩赐!。。。”
设想一个场景:一群鸟在随机搜索食物
已知:1)在这块区域里只有一块食物;2)所有的鸟都不知道食物在哪里;3)但它们能感受到当前的位置离食物还有多远。
那么:找到食物的最优策略是什么呢?搜寻目前离食物最近的鸟的周围区域,根据自己飞行的经验判断食物的所在。
PSO正是从这种模型中得到了启发,PSO的基础:信息的社会共享
生物学家对鸟(鱼)群捕食的行为研究
>社会行为(Social-Only Model)
>个体认知(Cognition-Only Model)
>每个寻优的问题解都被想象成一只鸟,称为“粒子”。所有粒子都在一个D维空间进行搜索;
>所有的粒子都由一个fitness function确定适应值以判断目前的位置好坏;
>每一个粒子必须赋予记忆功能,能记住所搜寻到的最佳位置;
>每一个粒子还有一个速度以决定飞行的距离和方向。这个速度根据它本身的飞行经验以及同伴的飞行经验进行动态调整。
D维空间中,有N个粒子:
粒子 i 位置:,将代入适应函数求适应值;
粒子 i 速度:,
粒子 i 个体经历过的最好位置:
种群所经历过的最好位置:
通常,在第 d 维的位置变化范围限定在内
速度变化范围限定在内(即在迭代中若、超出了边界值,则该维的速度或位置被限制为该维最大速度或边界位置)
>粒子 i 的第 d 维速度更新公式:
>粒子 i 的第 d 维位置更新公式:
-----第 k 次迭代粒子 i 飞行速度矢量的第 d 维分量
-----第 k 次迭代粒子 i 位置矢量化的第 d 维分量
,------加速度常数,调节学习最大步长
,------两个随机函数,取值范围[0,1],以增加搜索随机性
w------惯性权重,非负数,调节对解空间的搜索范围
粒子速度更新公式包含三部分:
第一部分为粒子先前的速度;
第二部分为“认知”部分,表示粒子本身的思考,可理解为粒子 i 当前位置与自己最好位置之间的距离;
第三部分分为“社会”部分,表示粒子间的信息共享与合作,可理解为粒子 i 当前位置与群体最好位置之间的距离。
1.Initial:
初始化粒子群体(群体规模n),包括随机位置和速度。
2.Evaluation:
根据fitness function,评价每个粒子的适应度。
3.Find the Pbest:
对每个粒子,将其当前适应值与其个体历史最佳位置(pbest)对应的适应值做比较,如果当前的适应值更高,则将用当前位置更新历史最佳位置pbest。
4.Find the Gbest:
对每个粒子,将其当前适应值与全局最佳位置(gbest)对应的适应值做比较,如果当前的适应值更高,则将当前粒子的位置更新全局最佳位置gbest。
5.Update the Velocity
根据公式更新每个粒子的速度与位置。
6.如未满足结束条件,则返回步骤2。通常算法达到最大迭代次数或者最佳适应度值的增量小于某个给定的阈值时算法停止。
群体大小 m
m是一个整型参数。
m很小:陷入局优的可能性很大。
m很大:PSO的优化能力很好,当群体数目增长至一定水平时,再增长将不再有显著的作用。
权重因子
权重因子:惯性因子 ,学习因子 ,
粒子的速度更新主要由三部分组成:
前次迭代中自身的速度,惯性因子,基本粒子群算法,失去对粒子本身的速度的记忆;
自我认知部分,学习因子,无私型粒子群算法“只有社会,没有自我”,迅速丧失群体多样性,易陷入局优而无法跳出;
社会经验部分,学习因子,自我认知型粒子群算法“只有自我,没有社会”,完全没有信息的社会共享导致算法收敛速度缓慢;
, 都不为0,称为完全型粒子群算法,其更容易保持收敛速度和搜素效果的均衡,是较好的选择。
最大速度
作用:在于维护算法的探索能力与开发能力的平衡。
较大时,探索能力增强,但粒子容易飞过最优解;
较小时,开发能力增强,但容易陷入局部最优;
一般设为每维变量变化范围的。
领域的拓扑结构
粒子群算法的领域拓扑结构包括两种,一种是将群体内所有个体都作为粒子的领域,另一种是只将群体中的部分个体作为粒子的领域。
领域拓扑结构决定群体历史最优位置。
由此,将粒子群算法分为全局粒子群算法和局部粒子群算法。
全局粒子群算法:1)粒子自己历史最优值;2)粒子群体的全局最优值
局部粒子群算法:1)粒子自己历史最优值;2)粒子领域内粒子的最优值;领域随迭代次数的增加线性变大,最后领域扩展到整个粒子群。
经过实践证明:全局版本的粒子群算法收敛速度快,但是容易陷入局部最优。局部版本的粒子群算法收敛速度慢,但是很难陷入局部最优。现在的粒子群算法大都在收敛速度与摆脱局部最优这两个方面下功夫。其实这两个方面是矛盾的,看如何更好的折中。
停止准则
停止准则一般有如下两种:
1)最大迭代步数;2)可接受的满意解。
粒子空间的初始化
较好地选择粒子的初始化空间,将大大缩短收敛时间。初始化空间根据具体问题的不同而不同,也就是说,这是问题依赖的。
粒子群算法与其他现代优化方法相比的一个明显特色就是所需调整的参数很少,相对来说,惯性因子和领域定义较为重要。这些为数不多的关键参数的设置却对算法的精度和效率有着显著影响。
例:求解如下四维Rosenbrock函数的优化问题。
解:算法的相关设计分析如下。
种群大小:即算法中粒子的数量,取
编码:因为问题的维数是4,所以每个粒子的位置和速度均4维的实数向量。
设定粒子的最大速度:
对粒子群进行随机初始化:
包括随机初始化各粒子的位置和速度
设各粒子的初始位置和初始速度为:
初始位置:
初始速度:
初始位置:
初始速度:
计算每个粒子的适应值:
群体历史最优解:
个体历史最优解:
更新粒子的速度和位置:
取,,得到速度和位置的更新函数为
更新速度,得:
超过速度范围变为
更新位置,得:
重复上述步骤,将迭代进行下去。
从上述结果,可以看出,经过10000次迭代,粒子群算法得到了比较好的适应值。
第 1 步 在初始化范围内,对粒子群进行随机初始化,包括随机位置和速度。
第 2 步 计算每个粒子的适应值。
第 3 步 更新粒子个体的历史最优位置。
第 4 步 更新粒子群体的历史最优位置。
第 5 步 更新粒子的速度和位置,公式如下:
第 6 步 若未达到终止条件,则转第2步。
1998年,Shi和Eberhart引入了惯性权重w,并提出动态调整惯性权重以平衡收敛的全局性和收敛速度,该算法被称为标准PSO算法。
惯性权重w描述粒子上一代速度对当前代速度的影响。w值较大,全局寻优能力强,局部寻优能力弱;反之,则局部寻优能力强。当问题空间较大时,为了在搜索速度和搜索精度之间达到平衡,通常做法是使算法在前期有较高的全局搜索能力以得到合适的种子,而在后期有较高的局部搜索能力以提高收敛精度。所以w不宜为一个固定的常数。
最大惯性权重,最小惯性权重,当前迭代次数,为算法迭代总次数
较大的w有较好的全局收敛能力,较小的w则有较强的局部收敛能力。因此,随着迭代次数的增加,惯性权重w应不断减少,从而使得粒子群算法在初期具有较强的全局收敛能力,而晚期具有较强的局部收敛能力。
1999年,Clerc引入收缩因子以保证算法的收敛性。
速度更新公式为
其中,收缩因子K为受,限制的w。是需要预先设定的模型参数
收缩因子法控制系统行为最终收敛,且可以有效搜索不同区域,该法能得到较高质量的解。
PSO比较有潜力的应用包括系统设计、多目标优化、分类、模式识别、调度、信号处理、决策、机器人应用等。其中具体应用实例有:模糊控制器设计、车间作业调度、机器人实时路径规划、自动目标检测、时频分析等。
PSO算法的理论研究:纵观PSO的研究成果,大部分研究都集中在算法的设计上,对算法的性能、收敛性、收敛速度、参数选取及参数的鲁棒性等理论性的研究则很少,偶有一些理论研究,但仅仅局限在对算法的参数、状态及概念等方面,且理论分析的内容和深度都很浅,因此理论研究大大滞后于PSO在工程中的应用。
PSO的算法研究:利用不同问题的特点设计出相应的有效算法,应注重高效的算法开发,提出合理的核心更新公式以及有效的均衡全局搜索和局部改进的策略。尤其要注重把PSO与其它算法,如进化算法、模糊逻辑、生物智能以及混沌等方法或策略相结合,解决PSO易陷入局部最优的问题。
参考
参考
假设我们要用粒子群算法求解以下函数的最小值:
f(x) = x^2 - 4x + 4
其中 x 的取值范围为 [-10, 10]。
1.初始化粒子群
我们先随机生成一些粒子,并给它们随机的位置和速度,如下所示:
# 设粒子数为 10
num_particles = 10
# 粒子的位置和速度都是一维的
position = np.random.uniform(-10, 10, size=(num_particles, 1))
velocity = np.random.uniform(-1, 1, size=(num_particles, 1))
2.计算适应度值
根据粒子的位置计算它们的适应度值,即函数 f(x) 的取值,如下所示:
fitness = np.zeros((num_particles, 1))
for i in range(num_particles):
fitness[i] = position[i]**2 - 4*position[i] + 4
3.更新全局最优位置和个体最优位置
对于每个粒子,记录它在历史搜索过程中的个体最优位置和全局最优位置,如下所示:
# 初始化个体最优位置和全局最优位置
pbest_position = position.copy()
pbest_fitness = fitness.copy()
gbest_position = position[fitness.argmin()]
gbest_fitness = fitness.min()
# 更新个体最优位置和全局最优位置
for i in range(num_particles):
if fitness[i] < pbest_fitness[i]:
pbest_fitness[i] = fitness[i]
pbest_position[i] = position[i]
if fitness[i] < gbest_fitness:
gbest_fitness = fitness[i]
gbest_position = position[i]
4.更新速度和位置
根据以下公式更新粒子的速度和位置:
w = 0.8 # 惯性权重
c1 = 2 # 自我认知因子
c2 = 2 # 社会认知因子
for i in range(num_particles):
r1 = np.random.rand()
r2 = np.random.rand()
velocity[i] = w*velocity[i] + c1*r1*(pbest_position[i]-position[i]) + c2*r2*(gbest_position-position[i])
position[i] = position[i] + velocity[i]
# 确保粒子的位置在取值范围内
if position[i] < -10:
position[i] = -10
elif position[i] > 10:
position[i] = 10
5.重复步骤 2-4,直到满足停止条件
重复执行步骤 2-4,直到满足停止条件,例如达到最大迭代次数或达到所需精度等。最终得到的全局最优位置即为函数 f(x) 的最小值点。