什么是粒子群优化算法?代码举例讲解

粒子群优化算法(Particle Swarm Optimization, PSO)是一种群智能优化算法。
它模拟鸟群或鱼群在寻找食物过程中展现出来的集体智慧行为,通过个体之间的社交思考来搜索最优解。

其原理是:

  1. 初始化粒子群。每个粒子代表一组潜在解,并随机分布在搜索空间内。
  2. 评价每个粒子的适应度值。适应度值反映了该解的优劣。
  3. 为每个粒子确定局部最优解和全局最优解。全局最优解是所有粒子中最优的解。
  4. 根据每个粒子与其局部最优解和全局最优解的距离,确定其新的速度和位置。
  5. 重复步骤 2-4,直到达到最大迭代代数或精度要求。
  6. 最终全局最优解作为算法的最优输出。

其数学模型为:

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算法,并应用到更加广泛的问题中。