X-Git-Url: https://git.octo.it/?p=libpopulation.git;a=blobdiff_plain;f=src%2Flibpopulation.c;fp=src%2Flibpopulation.c;h=fb99db12099958d63ede666d84bf4bcfa6b9aa19;hp=26345f86026fe5e53b5d34593b125b988c39afc9;hb=e9979110419e14fc3d6317f82cc9ed3c1fd3c5ba;hpb=9cd71de93b412bd24e5e5b512ec0b774f4123b9d 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 */