population_set_replacement_method: New function. master
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Mon, 10 May 2010 09:50:43 +0000 (11:50 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Mon, 10 May 2010 09:50:43 +0000 (11:50 +0200)
src/libpopulation.c
src/population.h

index fb99db1..c27fd9b 100644 (file)
@@ -107,6 +107,7 @@ struct population_s
 
 #define POPULATION_FLAG_LISTEN   0x01
 #define POPULATION_FLAG_SHUTDOWN 0x02
+#define POPULATION_FLAG_EXPLORE  0x10
   int flags;
   pthread_t listen_thread_id;
 
@@ -489,6 +490,27 @@ int population_set_serialization (population_t *p, /* {{{ */
   return (0);
 } /* }}} int population_set_serialization */
 
+int population_set_replacement_method (population_t *p, int method) /* {{{ */
+{
+  int status = 0;
+
+  if (p == NULL)
+    return (EINVAL);
+
+  pthread_mutex_lock (&p->lock);
+
+  if (method == POPULATION_REPLACEMENT_EXPLOIT)
+    p->flags &= ~POPULATION_FLAG_EXPLORE;
+  else if (method == POPULATION_REPLACEMENT_EXPLORE)
+    p->flags |= POPULATION_FLAG_EXPLORE;
+  else
+    status = EINVAL;
+
+  pthread_mutex_unlock (&p->lock);
+
+  return (0);
+} /* }}} int population_set_replacement_method */
+
 int population_add_peer (population_t *p, const char *node, /* {{{ */
     const char *port)
 {
@@ -747,6 +769,10 @@ int population_insert (population_t *p, void *pi_orig) /* {{{ */
 
     chance = (int) (((double) (chance_j + chance_pi))
         * (rand() / (RAND_MAX + 1.0)));
+
+    if (p->flags & POPULATION_FLAG_EXPLORE)
+      chance *= .5;
+
     if (chance < chance_j) /* j looses ;) */
     {
       void *temp0;
index 8dc7c73..cc513d4 100644 (file)
@@ -35,6 +35,10 @@ int population_set_size (population_t *p, size_t population_size);
 int population_set_serialization (population_t *p,
     pi_serialize_f serialize, pi_unserialize_f unserialize);
 
+#define POPULATION_REPLACEMENT_EXPLOIT  1
+#define POPULATION_REPLACEMENT_EXPLORE  2
+int population_set_replacement_method (population_t *p, int method);
+
 #define POPULATION_DEFAULT_PORT "46835"
 int population_add_peer (population_t *p, const char *node, const char *port);
 int population_start_listen_thread (population_t *p,