粒子群优化算法python
时间: 2023-06-30 21:17:48 浏览: 59
以下是一个简单的粒子群优化算法Python实现的例子:
```python
import random
# 目标函数
def fitness_func(x):
return x ** 2
class Particle:
def __init__(self, dim, bound):
self.__pos = [random.uniform(bound[0], bound[1]) for _ in range(dim)]
self.__vel = [random.uniform(-1, 1) for _ in range(dim)]
self.__best_pos = self.__pos[:]
self.__fitness_value = fitness_func(self.__pos[0])
def set_pos(self, pos):
self.__pos = pos
def get_pos(self):
return self.__pos
def set_vel(self, vel):
self.__vel = vel
def get_vel(self):
return self.__vel
def set_best_pos(self, pos):
self.__best_pos = pos
def get_best_pos(self):
return self.__best_pos
def set_fitness_value(self, value):
self.__fitness_value = value
def get_fitness_value(self):
return self.__fitness_value
class PSO:
def __init__(self, dim, size, iter_num, bound, c1, c2):
self.__dim = dim
self.__size = size
self.__iter_num = iter_num
self.__bound = bound
self.__c1 = c1
self.__c2 = c2
self.__swarm = [Particle(dim, bound) for _ in range(size)]
self.__best_pos = self.__swarm[0].get_best_pos()
self.__best_fitness_value = fitness_func(self.__best_pos[0])
def update(self):
for i in range(self.__size):
fitness_value = fitness_func(self.__swarm[i].get_pos()[0])
if fitness_value < self.__swarm[i].get_fitness_value():
self.__swarm[i].set_best_pos(self.__swarm[i].get_pos())
self.__swarm[i].set_fitness_value(fitness_value)
if fitness_value < self.__best_fitness_value:
self.__best_pos = self.__swarm[i].get_pos()
self.__best_fitness_value = fitness_value
vel = self.__swarm[i].get_vel()
pos = self.__swarm[i].get_pos()
best_pos = self.__swarm[i].get_best_pos()
for j in range(self.__dim):
vel[j] = vel[j] + self.__c1 * random.random() * (best_pos[j] - pos[j]) + \
self.__c2 * random.random() * (self.__best_pos[j] - pos[j])
pos[j] = pos[j] + vel[j]
if pos[j] < self.__bound[0]:
pos[j] = self.__bound[0]
vel[j] = 0
elif pos[j] > self.__bound[1]:
pos[j] = self.__bound[1]
vel[j] = 0
self.__swarm[i].set_pos(pos)
self.__swarm[i].set_vel(vel)
def run(self):
for i in range(self.__iter_num):
self.update()
return self.__best_pos, self.__best_fitness_value
if __name__ == '__main__':
pso = PSO(dim=1, size=50, iter_num=100, bound=(-10, 10), c1=2, c2=2)
best_pos, best_fitness_value = pso.run()
print('best_pos: ', best_pos)
print('best_fitness_value: ', best_fitness_value)
```
这个例子实现了一维的粒子群优化算法,粒子个数为50,迭代次数为100。在实现过程中,需要定义目标函数和粒子类,然后在PSO类中实现update和run方法。在update方法中,更新粒子的位置和速度,更新最优粒子的位置和适应度值。在run方法中,进行多次迭代,最终得到最优解。