粒子群优化并找到最优解python代码
时间: 2024-02-07 19:03:50 浏览: 41
粒子群优化(Particle Swarm Optimization,PSO)是一种基于群体智能的优化算法,它模拟了鸟群等生物集群的行为,通过不断迭代寻找最优解。下面是一个简单的粒子群优化的 Python 实现:
```python
import random
class Particle:
def __init__(self, x0):
self.position = [] # 粒子的位置
self.velocity = [] # 粒子的速度
self.best_pos = [] # 粒子历史最优位置
self.error = -1 # 粒子历史最优误差
self.best_error = -1 # 粒子当前位置的最优误差
for i in range(0, num_dimensions):
self.velocity.append(random.uniform(-1, 1))
self.position.append(x0[i])
# 计算粒子误差
def evaluate(self, costFunc):
self.error = costFunc(self.position)
# 更新历史最优位置和误差
if self.error < self.best_error or self.best_error == -1:
self.best_pos = self.position
self.best_error = self.error
# 更新粒子速度和位置
def update_velocity(self, best_pos):
w = 0.5 # 惯性权重
c1 = 1 # 个体学习因子
c2 = 2 # 社会学习因子
for i in range(0, num_dimensions):
r1 = random.random()
r2 = random.random()
# 计算速度变化量
vel_cognitive = c1 * r1 * (self.best_pos[i] - self.position[i])
vel_social = c2 * r2 * (best_pos[i] - self.position[i])
self.velocity[i] = w * self.velocity[i] + vel_cognitive + vel_social
# 更新位置
self.position[i] += self.velocity[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].error < self.err_best_g or self.err_best_g == -1:
self.pos_best_g = list(swarm[j].position)
self.err_best_g = float(swarm[j].error)
# 更新粒子速度和位置
for j in range(0, num_particles):
swarm[j].update_velocity(self.pos_best_g)
i += 1
# 输出结果
print('Best position:', self.pos_best_g)
print('Best error:', self.err_best_g)
# 定义一个简单的目标函数
def sphere(x):
result = 0
for i in range(len(x)):
result += x[i] ** 2
return result
if __name__ == "__main__":
PSO(sphere, [-5.12, 5.12], 50, 100)
```
在这个实现中,Particle 类表示粒子,包含粒子的位置、速度、历史最优位置和误差等属性,以及计算粒子误差和更新粒子速度和位置的方法。PSO 类表示粒子群优化算法,包括初始化粒子群、迭代优化过程等方法。最后,在 main 函数中定义了一个简单的目标函数 sphere,并以 [-5.12, 5.12] 为搜索空间,50 个粒子,100 次迭代次数进行了 PSO 优化。
需要注意的是,粒子群优化算法的实现可能有多种变体,例如可以添加惯性权重衰减、动态调整个体和社会学习因子等策略,以提高算法的效率和收敛性能。