粒子群算法python
时间: 2023-08-30 17:10:34 浏览: 31
粒子群算法是一种优化算法,可以用来寻找最优解或近似最优解。下面是一个用Python实现的简单粒子群算法示例:
```python
import random
# 目标函数
def f(x):
return x ** 2
# 粒子群算法
class PSO():
def __init__(self, dim, size, iter_num):
self.w = 0.8 # 惯性权重
self.c1 = 2 # 自我认知因子
self.c2 = 2 # 社会认知因子
self.dim = dim # 变量维度
self.size = size # 粒子数量
self.iter_num = iter_num # 迭代次数
self.x_bound = [-10, 10] # 变量范围
self.v_bound = [-1, 1] # 速度范围
self.x = [[random.uniform(self.x_bound[0], self.x_bound[1]) for _ in range(self.dim)] for _ in range(self.size)] # 粒子位置
self.v = [[random.uniform(self.v_bound[0], self.v_bound[1]) for _ in range(self.dim)] for _ in range(self.size)] # 粒子速度
self.pbest = self.x.copy() # 个体最优位置
self.gbest = self.pbest[0] # 全局最优位置
# 更新速度和位置
def update(self):
for i in range(self.size):
# 更新速度
for j in range(self.dim):
r1, r2 = random.random(), random.random()
self.v[i][j] = self.w * self.v[i][j] + self.c1 * r1 * (self.pbest[i][j] - self.x[i][j]) + self.c2 * r2 * (self.gbest[j] - self.x[i][j])
# 限制速度范围
self.v[i][j] = min(max(self.v[i][j], self.v_bound[0]), self.v_bound[1])
# 更新位置
for j in range(self.dim):
self.x[i][j] += self.v[i][j]
# 限制位置范围
self.x[i][j] = min(max(self.x[i][j], self.x_bound[0]), self.x_bound[1])
# 更新个体最优位置
if f(self.x[i]) < f(self.pbest[i]):
self.pbest[i] = self.x[i]
# 更新全局最优位置
if f(self.pbest[i]) < f(self.gbest):
self.gbest = self.pbest[i]
# 运行算法
def run(self):
for i in range(self.iter_num):
self.update()
print('Iteration {}: Best Value: {}'.format(i+1, f(self.gbest)))
if __name__ == '__main__':
pso = PSO(dim=1, size=20, iter_num=50)
pso.run()
```
在上面的示例中,我们定义了一个目标函数 $f(x)=x^2$,并使用粒子群算法来寻找 $f(x)$ 的最小值。在算法的初始化阶段,我们设置了粒子数量、变量维度、迭代次数、惯性权重、自我认知因子和社会认知因子等参数。然后,我们生成一些随机的粒子位置和速度,并将它们用作算法的初始状态。在迭代过程中,我们根据粒子群算法的公式来更新粒子的速度和位置,并记录每次迭代后的全局最优位置。最后,我们输出算法的运行结果。