X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/577a280086d400b3ab83caed89424b6f5e064be9..fb4d31c62744561af4bc3941d1cb9da430c5c64a:/pso.py?ds=sidebyside diff --git a/pso.py b/pso.py index 9149167..6d6fada 100644 --- a/pso.py +++ b/pso.py @@ -4,8 +4,13 @@ import random import multiprocessing from functools import partial -def particle(dimension, bound, v_max, func_d): - position = [2 * bound * random.random() - bound for _ in xrange(dimension)] +import lhs + +def particle(dimension, bound, v_max, func_d, pos=None): + if not pos: + position = [2 * bound * random.random() - bound for _ in xrange(dimension)] + else: + position = pos velocity = [2 * v_max * random.random() - v_max for _ in xrange(dimension)] value = func_d(*position) return value, position, velocity, value, position @@ -26,9 +31,9 @@ def move(particle, omega, phi_p, phi_g, v_max, global_best, func_d): def optimize(dimension, boundary, function_d, n_parts, n_turns): pool = multiprocessing.Pool(None) - v_max = 30. - particles = [particle(dimension, boundary, v_max, function_d) - for _ in xrange(n_parts)] + v_max = boundary + particles = [particle(dimension, boundary, v_max, function_d, pos) + for pos in lhs.latin_hypercube(dimension, bound, n_parts)] gl_best = max(particles) for _ in xrange(n_turns): move_p = partial(move,