Python递归实现粒子群优化算法

2023-04-16 00:00:00 算法 递归 粒子

PSO(粒子群优化)是一种优化算法,可以用于求解优化问题。它模拟了生物界中的群体行为,将每个个体看作粒子,并计算每个粒子的位置和速度,以找到全局最优解。

下面是Python递归实现PSO的代码示例:

import math
import random

# 定义目标函数
def target_func(x):
    return math.sin(x) + 2*math.cos(2*x)

# 定义粒子类
class Particle:
    def __init__(self, dim):
        self.pos = [random.uniform(-10, 10) for i in range(dim)]  # 粒子的位置
        self.vel = [random.uniform(-1, 1) for i in range(dim)]    # 粒子的速度
        self.best_pos = list(self.pos)                             # 粒子历史最优位置
        self.fitness = target_func(self.pos[0])                     # 粒子适应度

    def update(self, neighborhood_best_pos, omega, phi_p, phi_g):
        for i in range(len(self.pos)):
            self.vel[i] = omega*self.vel[i] + phi_p*random.random()*(self.best_pos[i]-self.pos[i]) + phi_g*random.random()*(neighborhood_best_pos[i]-self.pos[i])
            self.pos[i] = self.pos[i] + self.vel[i]
        self.fitness = target_func(self.pos[0])
        if self.fitness > target_func(self.best_pos[0]):
            self.best_pos = list(self.pos)

# 定义粒子群类
class PSO:
    def __init__(self, n_particles, dim):
        self.n_particles = n_particles    # 粒子数量
        self.dim = dim                    # 粒子维度
        self.particles = [Particle(self.dim) for i in range(self.n_particles)]
        self.global_best_pos = self.particles[0].pos
        self.global_best_fitness = target_func(self.global_best_pos[0])

    def update(self, omega, phi_p, phi_g):
        for i in range(self.n_particles):
            if target_func(self.particles[i].pos[0]) > target_func(self.particles[i].best_pos[0]):
                self.particles[i].best_pos = list(self.particles[i].pos)
            if target_func(self.particles[i].best_pos[0]) > target_func(self.global_best_pos[0]):
                self.global_best_pos = list(self.particles[i].best_pos)
                self.global_best_fitness = target_func(self.global_best_pos[0])
        for i in range(self.n_particles):
            self.particles[i].update(self.global_best_pos, omega, phi_p, phi_g)

    def run(self, n_iter, omega, phi_p, phi_g):
        for i in range(n_iter):
            self.update(omega, phi_p, phi_g)
            print("iteration:", i, "global best fitness:", self.global_best_fitness)

if __name__ == '__main__':
    pso = PSO(n_particles=20, dim=1)
    pso.run(n_iter=100, omega=0.7, phi_p=1.5, phi_g=1.5)

在上述代码中,首先定义了目标函数target_func,然后定义了粒子类Particle,其中包括粒子的位置、速度、历史最优位置和适应度等属性,以及根据粒子当前位置计算适应度的方法。

接下来定义了粒子群类PSO,其中包括粒子数量、维度、粒子集合等属性,以及更新全局最优解、更新粒子位置和速度等方法。在run方法中,先定好迭代次数和权重系数,然后开始迭代更新,输出每次迭代后的全局最优适应度值。

最后,在if __name__ == '__main__'中,我们创建了一个PSO对象并运行了100次迭代,结果将会输出。你只需要运行代码,就可以看到控制台输出的结果。

相关文章