/**
- * 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
{
void *pi;
int pi_rating;
- int num_tries;
+ int sent_to_peer;
int i;
if (p == NULL)
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);
}
}
- 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
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 */