粒子群算法带注释的python代码
时间: 2023-09-16 14:06:37 浏览: 40
以下是粒子群算法的带注释的Python代码示例:
```python
import random
class Particle:
def __init__(self, x_min, x_max, dim):
# 初始化粒子的位置和速度
self.position = [random.uniform(x_min, x_max) for i in range(dim)]
self.velocity = [0.0 for i in range(dim)]
# 初始化个体最佳位置和适应值
self.best_position = self.position[:]
self.best_fitness = float('inf')
def update_velocity(self, global_best_position, w, c1, c2):
# 更新粒子的速度
for i in range(len(self.position)):
r1 = random.random()
r2 = random.random()
cognitive = c1 * r1 * (self.best_position[i] - self.position[i])
social = c2 * r2 * (global_best_position[i] - self.position[i])
self.velocity[i] = w * self.velocity[i] + cognitive + social
def update_position(self, x_min, x_max):
# 更新粒子的位置
for i in range(len(self.position)):
self.position[i] += self.velocity[i]
# 确保粒子的位置在搜索空间内
if self.position[i] < x_min:
self.position[i] = x_min
elif self.position[i] > x_max:
self.position[i] = x_max
def evaluate(self, fitness_func):
# 计算粒子的适应值
self.fitness = fitness_func(self.position)
# 更新个体最佳位置和适应值
if self.fitness < self.best_fitness:
self.best_position = self.position[:]
self.best_fitness = self.fitness
class PSO:
def __init__(self, fitness_func, dim, size, x_min, x_max, w, c1, c2):
# 初始化粒子群的参数
self.fitness_func = fitness_func
self.dim = dim
self.size = size
self.x_min = x_min
self.x_max = x_max
self.w = w
self.c1 = c1
self.c2 = c2
# 初始化粒子群的粒子
self.particles = [Particle(x_min, x_max, dim) for i in range(size)]
# 初始化全局最佳位置和适应值
self.global_best_position = self.particles[0].position[:]
self.global_best_fitness = float('inf')
def update(self, max_iter):
# 粒子群更新迭代
for i in range(max_iter):
# 更新每个粒子的速度和位置
for particle in self.particles:
particle.update_velocity(self.global_best_position, self.w, self.c1, self.c2)
particle.update_position(self.x_min, self.x_max)
particle.evaluate(self.fitness_func)
# 更新全局最佳位置和适应值
if particle.fitness < self.global_best_fitness:
self.global_best_position = particle.position[:]
self.global_best_fitness = particle.fitness
# 输出每一代的全局最佳适应值
print(f'iter: {i}, best fitness: {self.global_best_fitness:.6f}')
# 返回全局最佳位置和适应值
return self.global_best_position, self.global_best_fitness
```
使用示例:
```python
def fitness_func(x):
# 适应值函数:Rastrigin函数
return sum([(xi**2 - 10 * math.cos(2 * math.pi * xi)) for xi in x]) + 10 * len(x)
pso = PSO(fitness_func, dim=5, size=20, x_min=-5.12, x_max=5.12, w=0.8, c1=2.0, c2=2.0)
best_position, best_fitness = pso.update(max_iter=50)
print(f'best position: {best_position}')
print(f'best fitness: {best_fitness:.6f}')
```