粒子群算法python
时间: 2023-08-31 07:05:10 浏览: 23
以下是一个简单的粒子群算法的Python实现,用于最小化给定函数的值:
```python
import random
def f(x):
"""函数定义"""
return x**2
class Particle:
def __init__(self, x0):
self.position_i = [] # 粒子位置
self.velocity_i = [] # 粒子速度
self.pos_best_i = [] # 粒子最佳位置
self.err_best_i = -1 # 粒子最佳误差
self.err_i = -1 # 粒子当前误差
for i in range(0, num_dimensions):
self.velocity_i.append(random.uniform(-1, 1))
self.position_i.append(x0[i])
# 更新粒子位置
def update_position(self):
for i in range(0, num_dimensions):
self.position_i[i] = self.position_i[i] + self.velocity_i[i]
# 计算当前粒子误差
def evaluate(self, costFunc):
self.err_i = costFunc(self.position_i)
# 更新粒子最佳位置
if self.err_i < self.err_best_i or self.err_best_i == -1:
self.pos_best_i = self.position_i
self.err_best_i = self.err_i
class PSO():
def __init__(self, costFunc, x0, num_particles, maxiter):
global num_dimensions
num_dimensions = len(x0)
self.err_best_g = -1 # 全局最佳误差
self.pos_best_g = [] # 全局最佳位置
swarm = []
for i in range(0, num_particles):
swarm.append(Particle(x0))
# 迭代
i = 0
while i < maxiter:
for j in range(0, num_particles):
swarm[j].evaluate(costFunc)
# 更新全局最佳位置
if swarm[j].err_i < self.err_best_g or self.err_best_g == -1:
self.pos_best_g = list(swarm[j].position_i)
self.err_best_g = float(swarm[j].err_i)
for j in range(0, num_particles):
swarm[j].update_velocity(self.pos_best_g)
swarm[j].update_position()
i += 1
if __name__ == '__main__':
initial = [5, 5]
pso = PSO(costFunc=f, x0=initial, num_particles=15, maxiter=30)
print("Best position: ", pso.pos_best_g)
print("Best error: ", pso.err_best_g)
```
在这个例子中,我们最小化函数 $f(x)=x^2$。在 `Particle` 类中,我们初始化了粒子的位置和速度,并且定义了更新位置和计算误差的方法。在 `PSO` 类中,我们初始化了粒子群,并且定义了迭代过程,更新全局最佳位置和更新粒子速度的方法。最后,我们在主函数中实例化了 `PSO` 类,传递了初始位置、粒子数和最大迭代次数,并且打印了最佳位置和误差。
请注意,这只是一个简单的粒子群算法实现,可能需要根据具体问题进行修改。