k-means clustering
[imago.git] / pso.py
diff --git a/pso.py b/pso.py
index c30bcfd..6d6fada 100644 (file)
--- a/pso.py
+++ b/pso.py
@@ -4,8 +4,13 @@ import random
 import multiprocessing
 from functools import partial
 
 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
     velocity = [2 * v_max * random.random() - v_max for _ in xrange(dimension)]
     value = func_d(*position)
     return value, position, velocity, value, position
@@ -27,8 +32,8 @@ 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 = boundary
 def optimize(dimension, boundary, function_d, n_parts, n_turns):
     pool = multiprocessing.Pool(None)
     v_max = boundary
-    particles = [particle(dimension, boundary, v_max, function_d)
-                 for _ in xrange(n_parts)]
+    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, 
     gl_best = max(particles)
     for _ in xrange(n_turns):
         move_p = partial(move,