粒子群优化并找到最优解python代码
时间: 2024-02-11 21:37:55 浏览: 17
下面是粒子群优化算法的 Python 代码示例:
```python
import random
# 目标函数
def objective_function(x):
return x**2
class Particle:
def __init__(self, dim, x_max, x_min):
self.position = []
self.velocity = []
self.best_position = []
self.fitness = float("inf")
self.best_fitness = float("inf")
for i in range(dim):
self.position.append(random.uniform(x_min, x_max))
self.velocity.append(random.uniform(x_min - self.position[i], x_max - self.position[i]))
def update_fitness(self, objective_function):
self.fitness = objective_function(self.position)
if self.fitness < self.best_fitness:
self.best_fitness = self.fitness
self.best_position = self.position[:]
def update_position(self, x_max, x_min, global_best_position, w, c1, c2):
for i in range(len(self.position)):
r1 = random.uniform(0, 1)
r2 = random.uniform(0, 1)
cognitive = c1 * r1 * (self.best_position[i] - self.position[i])
social = c2 * r2 * (global_best_position[i] - self.position[i])
self.velocity[i] = w * self.velocity[i] + cognitive + social
self.position[i] += self.velocity[i]
if self.position[i] > x_max:
self.position[i] = x_max
self.velocity[i] = 0
elif self.position[i] < x_min:
self.position[i] = x_min
self.velocity[i] = 0
class PSO:
def __init__(self, objective_function, dim, particle_num, x_max, x_min, max_iter):
self.objective_function = objective_function
self.dim = dim
self.particle_num = particle_num
self.x_max = x_max
self.x_min = x_min
self.max_iter = max_iter
self.global_best_fitness = float("inf")
self.global_best_position = []
self.particles = []
for i in range(self.particle_num):
self.particles.append(Particle(self.dim, self.x_max, self.x_min))
def update_global_best(self):
for particle in self.particles:
if particle.best_fitness < self.global_best_fitness:
self.global_best_fitness = particle.best_fitness
self.global_best_position = particle.best_position[:]
def optimize(self, w=0.729, c1=1.49445, c2=1.49445):
for i in range(self.max_iter):
for particle in self.particles:
particle.update_fitness(self.objective_function)
if particle.fitness < self.global_best_fitness:
self.global_best_fitness = particle.fitness
self.global_best_position = particle.position[:]
for particle in self.particles:
particle.update_position(self.x_max, self.x_min, self.global_best_position, w, c1, c2)
return self.global_best_position, self.global_best_fitness
# 测试
pso = PSO(objective_function, dim=1, particle_num=30, x_max=5, x_min=-5, max_iter=100)
best_position, best_fitness = pso.optimize()
print("最优解:", best_position)
print("最优值:", best_fitness)
```
在上面的代码中,首先定义了目标函数 `objective_function`,然后定义了粒子类 `Particle`,其中包括粒子的位置、速度、个体最优位置、个体最优适应度和全局最优适应度等属性,并且定义了更新适应度和位置的方法。接着定义了粒子群优化类 `PSO`,其中包括了初始化粒子、更新全局最优解和优化函数等方法。最后在测试部分调用 `PSO` 类进行优化,并输出最优解和最优值。