Python粒子群优化算法(Particle Swarm Optimization)实现

2023-04-17 00:00:00 优化 算法 粒子

Python粒子群优化算法(Particle Swarm Optimization,PSO)是一种智能优化算法,用于解决优化问题。该算法基于群体智能思想,模拟鸟群或鱼群的行为,通过信息共享和个体适应度调整的方式寻找全局最优解。
PSO算法的基本思想是,将一群个体放置在解空间中,每个个体表示一个解,称为粒子。每个粒子拥有自己的位置和速度,速度决定了粒子移动的方向和距离,位置表示了粒子当前所处的解空间的位置。
在每次迭代中,每个粒子都会根据自身的历史最优解和群体的历史最优解来更新自己的速度和位置。具体地,每个粒子会计算出自身的 fitness value(适应度值),该值表示了当前粒子所在位置的优劣。然后根据历史最优解和群体最优解,计算出粒子的新速度和位置。
PSO算法的核心思想就是在解空间中不断地搜索,直到找到全局最优解或满足特定条件为止。下面是PSO算法的Python实现:

import random
class Particle:
    def __init__(self, n):
        self.position = []
        self.velocity = []
        self.pbest = []
        self.fitness_value = -1
        for i in range(n):
            self.position.append(random.uniform(-10, 10))
            self.velocity.append(random.uniform(-1, 1))
    def evaluate(self, fitness_function):
        self.fitness_value = fitness_function(self.position)
        if self.fitness_value < fitness_function(self.pbest):
            self.pbest = self.position
    def update_velocity(self, gbest):
        w = 0.5
        c1 = 0.8
        c2 = 0.9
        for i in range(len(self.position)):
            r1 = random.uniform(0, 1)
            r2 = random.uniform(0, 1)
            cognitive_velocity = c1 * r1 * (self.pbest[i] - self.position[i])
            social_velocity = c2 * r2 * (gbest[i] - self.position[i])
            self.velocity[i] = w * self.velocity[i] + cognitive_velocity + social_velocity
    def update_position(self, bounds):
        for i in range(len(self.position)):
            self.position[i] = self.position[i] + self.velocity[i]
            if self.position[i] < bounds[i][0]:
                self.position[i] = bounds[i][0]
            if self.position[i] > bounds[i][1]:
                self.position[i] = bounds[i][1]
class PSO:
    def __init__(self, fitness_function, n, num_particles, bounds, max_iterations):
        self.fitness_function = fitness_function
        self.n = n
        self.num_particles = num_particles
        self.bounds = bounds
        self.max_iterations = max_iterations
        self.particles = []
        for i in range(num_particles):
            self.particles.append(Particle(n))
        self.gbest = [0.0 for i in range(n)]
        self.gbest_fitness = -1
    def run(self):
        for i in range(self.max_iterations):
            for j in range(self.num_particles):
                self.particles[j].evaluate(self.fitness_function)
                if self.particles[j].fitness_value < self.gbest_fitness or self.gbest_fitness == -1:
                    self.gbest_fitness = self.particles[j].fitness_value
                    self.gbest = list(self.particles[j].position)
            for j in range(self.num_particles):
                self.particles[j].update_velocity(self.gbest)
                self.particles[j].update_position(self.bounds)
            print("Iteration {}: Best Fitness Value = {}".format(i+1, self.gbest_fitness))
        return self.gbest, self.gbest_fitness

代码中的Particle类表示一个粒子,包括其位置、速度和历史最优解。PSO类表示整个算法,包括粒子群的初始化、迭代、计算适应度和更新速度和位置等操作。其中,bounds表示每个维度的取值范围,fitness_function表示适应度函数,max_iterations表示最大迭代次数。
在PSO类的run方法中,首先计算每个粒子的fitness_value,并更新全局最优解gbest和gbest_fitness。然后根据全局最优解更新每个粒子的速度和位置,直到达到最大迭代次数。最后返回全局最优解及其适应度值。
参考文献:
1. Kennedy, J., & Eberhart, R. C. (1995). Particle swarm optimization. Proceedings of IEEE International Conference on Neural Networks, 4, 1942-1948.
2. Shi, Y., & Eberhart, R. (1998). A modified particle swarm optimizer. Proceedings of IEEE International Conference on Evolutionary Computation, 69-73.

相关文章