粒子群优化算法(Particle Swarm Optimization, PSO)是一种群智能优化算法。
它模拟鸟群或鱼群在寻找食物过程中展现出来的集体智慧行为,通过个体之间的社交思考来搜索最优解。
其原理是:
- 初始化粒子群。每个粒子代表一组潜在解,并随机分布在搜索空间内。
- 评价每个粒子的适应度值。适应度值反映了该解的优劣。
- 为每个粒子确定局部最优解和全局最优解。全局最优解是所有粒子中最优的解。
- 根据每个粒子与其局部最优解和全局最优解的距离,确定其新的速度和位置。
- 重复步骤 2-4,直到达到最大迭代代数或精度要求。
- 最终全局最优解作为算法的最优输出。
其数学模型为:
v[] = v[] + c1 * r1 * (pbest[] - present[]) + c2 * r2 * (gbest[] - present[])
present[] = persent[] + v[]
v[] 表示粒子速度,present[] 表示粒子当前位置,pbest[] 表示局部最优解,gbest[] 表示全局最优解。c1、c2 为加速常数,r1、r2 为随机数。
实现代码示例:
python
import numpy as np
class PSO():
def __init__(self, n_particles, dimensions, max_iter):
self.n_particles = n_particles # 粒子数量
self.dimensions = dimensions # 搜索空间维度
self.max_iter = max_iter # 最大迭代次数
# 初始化粒子位置和速度
self.X = np.random.uniform(low=-4, high=4, size=(n_particles, dimensions))
self.V = np.random.rand(n_particles, dimensions) * 2 - 1
# 初始化全局最优解和局部最优解
self.pbest = self.X
self.gbest = self.X[0:1, :]
# 适应度函数
def fitness(self, x):
...
# 更新粒子位置和速度
def update(self, c1=0.5, c2=2):
r1, r2 = np.random.rand(self.n_particles, self.dimensions), np.random.rand(self.n_particles, self.dimensions)
self.V = c1 * r1 * (self.pbest - self.X) + c2 * r2 * (self.gbest - self.X)
self.X = self.X + self.V
# 迭代搜索
def iterate(self):
for i in range(self.max_iter):
# 计算每个粒子的适应度值
fitness = [self.fitness(x) for x in self.X]
# 更新 pbest 和 gbest
self.pbest = np.where(self.pbest < self.X, self.X, self.pbest)
self.gbest = self.X[np.argmax(fitness), :]
# 更新速度和位置
self.update()
# 返回全局最优解
return self.gbest
PSO 算法由于具有全局搜索能力和较快的收敛速度,已被广泛应用于函数优化、神经网络训练、模型选择等领域。理解其工作原理,可以帮助我们设计更高效稳定的PSO算法,并应用到更加广泛的问题中。