src/libpopulation.c: Change the network logic to only send inserted entries.
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Wed, 11 Mar 2009 08:32:12 +0000 (09:32 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Wed, 11 Mar 2009 08:32:12 +0000 (09:32 +0100)
The problem with the previous version was, that although the chance was
pretty small, only good solutions would be send back and forth
destroying the variety in the populations.

src/libpopulation.c

index 26345f8..fb99db1 100644 (file)
@@ -1,6 +1,6 @@
 /**
- * libevolve - src/evolve.c
- * Copyright (C) 2008 Florian octo Forster
+ * libpopulation - src/evolve.c
+ * Copyright (C) 2008,2009  Florian octo Forster
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -659,7 +659,7 @@ int population_insert (population_t *p, void *pi_orig) /* {{{ */
 {
   void *pi;
   int pi_rating;
-  int num_tries;
+  int sent_to_peer;
   int i;
 
   if (p == NULL)
@@ -675,6 +675,25 @@ int population_insert (population_t *p, void *pi_orig) /* {{{ */
     return (-1);
   }
 
+  /*
+   * With a small chance, send this individual to somewhere else.
+   * `sent_to_peer = -1' is used to signal the following code that this
+   * individual has been sent to somewhere else and doesn't go into the local
+   * population.
+   */
+  sent_to_peer = 0;
+  if (p->peers_num > 0)
+  {
+    double prob;
+
+    prob = ((double) rand ()) / (((double) RAND_MAX) + 1.0);
+    if (prob <= 0.001)
+    {
+      population_send_to_peer (p, pi);
+      sent_to_peer = 1;
+    }
+  }
+
   pi_rating = p->rate (pi);
 
   pthread_mutex_lock (&p->lock);
@@ -694,11 +713,11 @@ int population_insert (population_t *p, void *pi_orig) /* {{{ */
     }
   }
 
-  if (p->individuals_num <= 0)
+  if ((sent_to_peer != 0) || (p->individuals_num <= 0))
   {
     pthread_mutex_unlock (&p->lock);
     p->free (pi);
-    return (-1);
+    return (0);
   }
 
   do
@@ -746,34 +765,8 @@ int population_insert (population_t *p, void *pi_orig) /* {{{ */
   pthread_mutex_unlock (&p->lock);
 
   if (pi != NULL)
-  {
-    p->free (pi);
-    pi = NULL;
-  }
-
-  while (p->peers_num > 0)
-  {
-    double prob;
-    size_t j;
-    void *pi;
-
-    prob = ((double) rand ()) / (((double) RAND_MAX) + 1.0);
-    if (prob < 0.999)
-      break;
-
-    pi = population_get_random (p);
-    if (pi == NULL)
-    {
-      fprintf (stderr, "population_insert: population_get_random failed.\n");
-      break;
-    }
-
-    population_send_to_peer (p, pi);
     p->free (pi);
 
-    break;
-  }
-
   return (0);
 } /* }}} int population_insert */