Python递归实现粒子群优化算法
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次迭代,结果将会输出。你只需要运行代码,就可以看到控制台输出的结果。
相关文章