建立一个PSO类实现PSO算法
时间: 2024-02-11 15:06:45 浏览: 21
好的,以下是一个基于类的PSO算法实现示例:
```python
import numpy as np
class Particle:
def __init__(self, dim, lb, ub):
self.position = np.random.uniform(lb, ub, dim)
self.velocity = np.zeros(dim)
self.best_position = self.position.copy()
self.best_cost = np.inf
class PSO:
def __init__(self, cost_function, dim, num_particles, maxiter, lb, ub, w=0.8, c1=2, c2=2):
self.cost_function = cost_function
self.dim = dim
self.num_particles = num_particles
self.maxiter = maxiter
self.lb = lb
self.ub = ub
self.w = w
self.c1 = c1
self.c2 = c2
self.particles = [Particle(dim, lb, ub) for _ in range(num_particles)]
self.g_best = np.zeros(dim)
self.g_best_cost = np.inf
def optimize(self):
for i in range(self.maxiter):
for j in range(self.num_particles):
# 计算适应度值
cost = self.cost_function(self.particles[j].position)
# 更新个体历史最优位置和适应度值
if cost < self.particles[j].best_cost:
self.particles[j].best_position = self.particles[j].position.copy()
self.particles[j].best_cost = cost
# 更新全局历史最优位置和适应度值
if cost < self.g_best_cost:
self.g_best = self.particles[j].position.copy()
self.g_best_cost = cost
# 更新粒子速度和位置
r1 = np.random.uniform(size=self.dim)
r2 = np.random.uniform(size=self.dim)
self.particles[j].velocity = self.w * self.particles[j].velocity \
+ self.c1 * r1 * (self.particles[j].best_position - self.particles[j].position) \
+ self.c2 * r2 * (self.g_best - self.particles[j].position)
self.particles[j].position = self.particles[j].position + self.particles[j].velocity
# 边界处理
self.particles[j].position = np.maximum(self.particles[j].position, self.lb)
self.particles[j].position = np.minimum(self.particles[j].position, self.ub)
return self.g_best, self.g_best_cost
```
`Particle`类表示粒子,包含位置、速度、个体历史最优位置和适应度值等属性。`PSO`类表示整个粒子群算法,包含目标函数、变量数目、粒子数、最大迭代次数、变量下界和上界、惯性权重、加速常数等属性,以及粒子列表、全局历史最优位置和适应度值等属性。`optimize`方法实现了算法的优化过程。