python的粒子群算法代码
时间: 2023-09-02 21:08:46 浏览: 87
以下是一个基于Python实现的粒子群算法代码示例:
```python
import random
# 粒子群算法类
class PSO:
def __init__(self, dim, particle_num, max_iter, func):
self.w = 0.8 # 惯性权重
self.c1 = 2 # 学习因子
self.c2 = 2 # 学习因子
self.dim = dim # 搜索空间的维度
self.particle_num = particle_num # 粒子数量
self.max_iter = max_iter # 最大迭代次数
self.func = func # 适应度函数
self.particles = [] # 粒子列表
self.gbest_fitness = float('inf') # 全局最优适应度值
self.gbest_position = [0.0 for _ in range(dim)] # 全局最优位置
self.init_particles() # 初始化粒子
# 初始化粒子
def init_particles(self):
for i in range(self.particle_num):
position = [random.uniform(-100, 100) for _ in range(self.dim)] # 随机生成粒子的位置
velocity = [random.uniform(-1, 1) for _ in range(self.dim)] # 随机生成粒子的速度
fitness = self.func(position) # 计算粒子的适应度值
particle = Particle(position, velocity, fitness, position, fitness) # 创建粒子对象
self.particles.append(particle) # 将粒子添加到列表中
if particle.fitness < self.gbest_fitness: # 更新全局最优位置
self.gbest_fitness = particle.fitness
self.gbest_position = particle.position
# 粒子群算法主函数
def optimize(self):
for i in range(self.max_iter):
for particle in self.particles:
r1, r2 = random.random(), random.random() # 随机生成两个0~1之间的随机数
particle.velocity = [self.w * v + self.c1 * r1 * (pbest - pos) + self.c2 * r2 * (self.gbest_position - pos)
for v, pos, pbest in zip(particle.velocity, particle.position, particle.pbest_position)] # 更新速度
particle.position = [pos + v for pos, v in zip(particle.position, particle.velocity)] # 更新位置
particle.fitness = self.func(particle.position) # 计算适应度值
if particle.fitness < particle.pbest_fitness: # 更新粒子的个体最优位置
particle.pbest_fitness = particle.fitness
particle.pbest_position = particle.position
if particle.fitness < self.gbest_fitness: # 更新全局最优位置
self.gbest_fitness = particle.fitness
self.gbest_position = particle.position
# 粒子类
class Particle:
def __init__(self, position, velocity, fitness, pbest_position, pbest_fitness):
self.position = position # 粒子的当前位置
self.velocity = velocity # 粒子的当前速度
self.fitness = fitness # 粒子的适应度值
self.pbest_position = pbest_position # 粒子的个体最优位置
self.pbest_fitness = pbest_fitness # 粒子的个体最优适应度值
# 适应度函数示例
def sphere(x):
return sum([xi ** 2 for xi in x])
# 示例代码
if __name__ == '__main__':
pso = PSO(dim=10, particle_num=30, max_iter=500, func=sphere)
pso.optimize()
print('最优解:', pso.gbest_position)
print('最优适应度值:', pso.gbest_fitness)
```
在这个示例代码中,我们定义了一个PSO类和一个Particle类。其中,PSO类实现了粒子群算法的主要逻辑,而Particle类则是粒子的实体类,包含粒子的位置、速度、适应度值以及个体最优位置和个体最优适应度值等属性。此外,我们还定义了一个适应度函数`sphere`,用于评估粒子的适应度值。
在示例代码中,我们使用了`random`模块生成了随机数,使用了`sum`函数计算向量的平方和。在实际应用中,我们可能需要根据具体问题自行编写随机数生成函数和适应度函数。
阅读全文