From: Florian Forster Date: Wed, 11 Mar 2009 08:32:12 +0000 (+0100) Subject: src/libpopulation.c: Change the network logic to only send inserted entries. X-Git-Url: https://git.octo.it/?p=libpopulation.git;a=commitdiff_plain;h=e9979110419e14fc3d6317f82cc9ed3c1fd3c5ba src/libpopulation.c: Change the network logic to only send inserted entries. 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. --- diff --git a/src/libpopulation.c b/src/libpopulation.c index 26345f8..fb99db1 100644 --- a/src/libpopulation.c +++ b/src/libpopulation.c @@ -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 */