1 """Particle swarm optimization"""
5 from functools import partial
7 def particle(dimension, bound, v_max, func_d):
8 position = [2 * bound * random.random() - bound for _ in xrange(dimension)]
9 velocity = [2 * v_max * random.random() - v_max for _ in xrange(dimension)]
10 value = func_d(*position)
11 return value, position, velocity, value, position
13 def move(particle, omega, phi_p, phi_g, v_max, global_best, func_d):
14 _, position, velocity, best_value, best_position = particle
15 position = [p + v for (p, v) in zip(position, velocity)]
17 + phi_p * random.random() * (b - x)
18 + phi_g * random.random() * (g - x)
19 for (v, x, b, g) in zip(velocity, position,
20 best_position, global_best)]
21 velocity = [min(max(v, - v_max), v_max) for v in velocity]
22 value = func_d(*position)
23 if value > best_value:
24 best_value, best_position = value, position
25 return value, position, velocity, best_value, best_position
27 def optimize(dimension, boundary, function_d, n_parts, n_turns):
28 pool = multiprocessing.Pool(None)
30 particles = [particle(dimension, boundary, v_max, function_d)
31 for _ in xrange(n_parts)]
32 gl_best = max(particles)
33 for _ in xrange(n_turns):
34 move_p = partial(move,
35 omega=0.98, phi_p=2.75, phi_g=3., v_max=v_max,
36 global_best=gl_best[1], func_d=function_d)
37 particles = pool.map(move_p, particles)
38 gl_best = max(max(particles), gl_best)