-
Notifications
You must be signed in to change notification settings - Fork 0
/
pso.py
30 lines (26 loc) · 1.05 KB
/
pso.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import numpy as np
from particle import Particle
import math
def initiate_population(particle_num, dimension):
population = []
for i in range(particle_num):
if i % 5 == 0:
x0 = -1 * np.random.rand(dimension, 1)
else:
x0 = np.random.rand(dimension, 1)
population.append(Particle(x0, dimension))
return population
class PSO(object):
def __init__(self, func, particle_num, max_iter, dimension, option):
self.best_value = math.inf
self.best_position = []
population = initiate_population(particle_num, dimension)
for i in range(max_iter):
for j in range(particle_num):
population[j].enumerate(func)
if population[j].value < self.best_value:
self.best_position = population[j].position
self.best_value = population[j].value
for j in range(particle_num):
population[j].new_speed(self.best_position, i, max_iter, option)
population[j].change_position()