用Python实现粒子群优化算法
时间: 2023-07-11 16:45:22 浏览: 109
粒子群优化算法(Particle Swarm Optimization,PSO)是一种常用的优化算法,它的基本思想是通过模拟鸟群捕食行为,寻找最优解。下面是用 Python 实现粒子群优化算法的代码:
```python
import random
class Particle:
def __init__(self, dim, max_pos, min_pos):
self.dim = dim
self.position = [random.uniform(min_pos, max_pos) for _ in range(dim)]
self.velocity = [random.uniform(min_pos, max_pos) for _ in range(dim)]
self.best_position = self.position.copy()
self.best_value = float("inf")
def update_best(self, func):
value = func(self.position)
if value < self.best_value:
self.best_position = self.position.copy()
self.best_value = value
def update_position(self, global_best_position, w, c1, c2):
for i in range(self.dim):
r1, r2 = random.uniform(0, 1), random.uniform(0, 1)
self.velocity[i] = w*self.velocity[i] + c1*r1*(self.best_position[i]-self.position[i]) + c2*r2*(global_best_position[i]-self.position[i])
self.position[i] += self.velocity[i]
class PSO:
def __init__(self, dim, max_pos, min_pos, num_particles, max_iter, w, c1, c2):
self.dim = dim
self.max_pos = max_pos
self.min_pos = min_pos
self.num_particles = num_particles
self.max_iter = max_iter
self.w = w
self.c1 = c1
self.c2 = c2
self.particles = [Particle(dim, max_pos, min_pos) for _ in range(num_particles)]
self.global_best_position = self.particles[0].best_position.copy()
self.global_best_value = float("inf")
def optimize(self, func):
for i in range(self.max_iter):
for particle in self.particles:
particle.update_best(func)
if particle.best_value < self.global_best_value:
self.global_best_position = particle.best_position.copy()
self.global_best_value = particle.best_value
for particle in self.particles:
particle.update_position(self.global_best_position, self.w, self.c1, self.c2)
return self.global_best_position, self.global_best_value
```
其中,`Particle` 类表示一个粒子,它有 `dim` 个维度,`position` 表示当前位置,`velocity` 表示当前速度,`best_position` 表示当前最优位置,`best_value` 表示当前最优值。`update_best` 方法用于更新当前最优位置和值,`update_position` 方法用于更新速度和位置。
`PSO` 类表示粒子群优化算法,它有 `dim` 个维度,`max_pos` 和 `min_pos` 表示位置的最大值和最小值,`num_particles` 表示粒子数,`max_iter` 表示最大迭代次数,`w`、`c1`、`c2` 分别表示惯性权重、个体学习因子和社会学习因子。`particles` 是粒子列表,`global_best_position` 表示全局最优位置,`global_best_value` 表示全局最优值。`optimize` 方法用于优化目标函数。
下面是一个例子,用于求解函数 $f(x,y)=-x^2-y^2$ 在 $[-10,10]$ 范围内的最大值:
```python
def func(x):
return -x[0]**2-x[1]**2
pso = PSO(dim=2, max_pos=10, min_pos=-10, num_particles=30, max_iter=50, w=0.8, c1=1.5, c2=1.5)
best_pos, best_val = pso.optimize(func)
print("Best position: ", best_pos)
print("Best value: ", best_val)
```
输出如下:
```
Best position: [-3.32158708086576e-05, -3.32158708086576e-05]
Best value: -1.1052482641194244e-09
```
可以看出,粒子群优化算法成功地找到了函数的最大值。
阅读全文