一、粒子群算法简介
粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization), 缩写为 PSO。
粒子群优化算法是一种基于群体智能的优化算法,它模拟了一群鸟或昆虫在飞行时的群体行为,通过信息共享和互相合作来优化系统的行为。该算法应用范围广泛,例如在神经网络、数据挖掘、网络优化等领域都得到了广泛的应用。
基本思想是将优化问题转换为粒子集合的搜索问题。在搜索空间中,每个粒子都代表一个候选解,而整个群体则代表一个解向量集合。每个粒子可以在搜索空间中进行移动,被吸引到当前最优解附近的位置。通过对领域和速度等参数的动态调整,可以逐步接近全局最优解。
在该算法中,每个粒子的位置和速度可以视为搜索过程中的解和搜索方向,而每个粒子的能量或适应度函数则是评价解优劣的标准。每个粒子根据当前速度和临近的最优解调整位置,从而逐步优化解。算法模拟了群体的智能操作,即个体间的信息交流和合作,以实现全局优化。
算法的实现主要涉及到初始化粒子、计算适应度值、更新速度和更新位置等步骤。在大多数应用中,使用惯性权重来控制粒子在搜索过程中的探索和利用能力,同时调整邻域参数来保持群体的协同性。
具体的粒子群算法步骤如下:
在算法的运算过程中,一般会引入惯性权重、加速系数和随机因素等参数来进行探索和利用的平衡。惯性权重控制粒子的惯性,控制着粒子的运动方向和速度。加速系数控制粒子的局部搜索和全局搜索的比例。随机因素用于在全局最优解和局部最优解之间平衡,控制着粒子的探索深度和速度。算法中不同的参数和具体实现方法可能会因应用领域和问题而异。
二、开始学习
1、问:已知A为全局最优,B和C如何移动才能到达A处?
这个过程如何用数学表达式描述?
1.某个粒子(点)的移动,是有大小,有方向 的。
2.有大小,有方向的东西叫向量。
3.位置就是坐标。(1,1)=(2,3)+𝛼 → 𝛼 = (1,1) − (2,3) = (−1, −2)
2、基本原理
假设在一个D维的目标搜索空间中,有N个粒子组成一个群落,其中第i个粒子表示为一个D维的向量:
Xi = ( xi1, xi 2 , xiD ),i = 1, 2, , N
第i个粒子的“飞行”速度也是一个D维的向量,记为:
Vi = (vi1, vi 2 , viD ), i = 1, 2, , N
在第t代的第i个粒子向第t+1代进化时,根据如下式子更新:
LOOK!!!!!
假设某粒子当前位置C,个体极值位置B,全局 最优位置A,那么该粒子下一步的运动状态如 上图所示。
B对应𝑝𝑖,A对应𝑝𝑔,黄色向量为当前速度方 向,绿色向量为向个体极值飞行步长,红色为 向全局最值飞行步长。
3、算法流程
输入: 参数𝜔:0.5 − 0.8, 𝑐1, 𝑐2:0.1 − 2, 𝑣𝑚𝑎𝑥, 𝑥𝑚𝑎𝑥:取决于优化函数
Step1:初始化种群𝑥
Step2: 计 算 个 体 适 应 度 *
Step3:更新粒子速度−>更新粒子位置*
Step4:并计算新位置的适应度,若新位置适应度更高,则将该粒子的位置进行更新,否则不更新
Step5:判断是否满足终止条件* ,是则退出,否则返回Step2。 输出:输出最优值。
注:*1.一般的,我们优化目标是最小化一个函数值。所以个体计算出的函数值越小,适应度越高。
1. max 𝑓 = min −𝑓
*2.注意更新速度后,先进行速度边界检测,一般采用𝑣(𝑣 > 𝑣𝑚𝑎𝑥) = 𝑣𝑚𝑎𝑥,位置同理。
*3.常见终止条件为设定迭代进化次数、适应度n代不再变化等。
4、算法分析
优点:1)原理比较简单,实现容易,参数少。
缺点:1)易早熟收敛至局部最优、迭代后期收敛速度慢的。
解释:标准粒子群算法的参数是固定的。𝜔描述的是粒子的“惯性”,在进化前期𝜔应该大一些,保 证各个粒子独立飞行充分搜索空间,后期应该小一点,多向其他粒子学习。 𝑐1, 𝑐2分别向个体极值和全局 极值最大飞行步长。前期𝑐1应该大一些,后期𝑐2应该大一些,这样就能平衡粒子的全局搜索能力和局部搜 索能力。3个参数共同影响了粒子的飞行方向,导致即使其他粒子找到更好的,但是当前粒子惯性太大, 不能很快的飞向更优的位置。
针对标准PSO的缺点,通常有如下的改进:
1. 实现参数的自适 应 变化。●2. 引入一些其他机 制 ,比 如 随机 的 因素 , 速度 、 位置 的 边界 变 化 − 后 期 压缩 最 大速 度 等。●3. 结合其他智能优 化 算法 : 遗传 算 法、 免 疫算 法 、模 拟 退火 算 法等 等 ,帮 助 粒子 跳 出局 部 最优 , 改善收敛速度。
5、举个例子吧
'''在这个示例中,我们定义了一个多元函数,该函数在实现粒子群优化算法时将被用到。
然后,我们定义粒子群优化算法的类,并实现了初始化、适应度函数、更新速度和位置等方法。
最后,我们在主函数中实例化该类,并调用方法运行算法,输出找到的最小函数值和对应的最优解。'''
import numpy as np
# 定义待优化函数
def function(x):
for i in range(len(x)):
return x[i] ** 2
# return x[0] ** 2 + x[1] ** 2 + x[2] ** 2 + x[3] ** 2 - np.cos(2 * np.pi * x[0]) - np.cos(2 * np.pi * x[1]) - np.cos(
# 2 * np.pi * x[2]) - np.cos(2 * np.pi * x[3]) + 4
# 定义粒子群算法
class PSO:
def __init__(self, function, num_particles, dim, max_iter, x_min=-5.12, x_max=5.12, w=0.729, c1=1.494, c2=1.494):
self.function = function # 待优化函数
self.num_particles = num_particles # 粒子数目
self.dim = dim # 搜索空间维数
self.max_iter = max_iter # 最大迭代次数
self.bounds = [(x_min, x_max) for i in range(dim)] # 搜索空间边界
self.w = w
self.c1 = c1
self.c2 = c2
# 随机初始化粒子的位置和速度
self.x = np.random.uniform(x_min, x_max, (num_particles, dim))
self.v = np.zeros((num_particles, dim))
# 初始化粒子的历史最优解和全局最优解
self.pbest = self.x.copy()
self.pbest_fitness = np.array([float('inf') for i in range(num_particles)])
self.gbest = self.x[0]
self.gbest_fitness = float('inf')
# 计算当前粒子的适应度值
def fitness(self, particle):
return self.function(particle)
# 更新速度和位置
def update(self):
for i in range(self.num_particles):
r1, r2 = np.random.uniform(size=2)
self.v[i] = self.w * self.v[i] + self.c1 * r1 * (self.pbest[i] - self.x[i]) \
+ self.c2 * r2 * (self.gbest - self.x[i])
self.x[i] += self.v[i]
# 限制位置在搜索空间内
for j in range(self.dim):
self.x[i][j] = min(max(self.x[i][j], self.bounds[j][0]), self.bounds[j][1])
fit = self.fitness(self.x[i])
# 更新历史最优解和全局最优解
if fit < self.pbest_fitness[i]:
self.pbest_fitness[i] = fit
self.pbest[i] = self.x[i]
if fit < self.gbest_fitness:
self.gbest_fitness = fit
self.gbest = self.x[i]
# 运行粒子群算法
def run(self):
for i in range(self.max_iter):
self.update()
return self.gbest, self.gbest_fitness
# 运行粒子群算法求解函数最优解
pso = PSO(function, 50, 4, 1000)
bestx, bestf = pso.run()
print("最小值为:", bestf)
print("最小值点的坐标是:", bestx)
运行结果如下: