X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsn-evolution2.c;h=2f894ec57acbbadfb8ad4be8b8dc35d00be41669;hb=4f5cca3d0af8783bc0d44ea9f78467fd80228d09;hp=62a0969c3308294d14d1d4fd8469a1af075e73a1;hpb=875eadb2a3bce31926fd9bba447a7583db7b7dac;p=sort-networks.git diff --git a/src/sn-evolution2.c b/src/sn-evolution2.c index 62a0969..2f894ec 100644 --- a/src/sn-evolution2.c +++ b/src/sn-evolution2.c @@ -1,6 +1,6 @@ /** - * collectd - src/sn-evolution.c - * Copyright (C) 2008,2009 Florian octo Forster + * libsortnetwork - src/sn-evolution.c + * Copyright (C) 2008-2010 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 @@ -16,14 +16,17 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: - * Florian octo Forster + * Florian octo Forster **/ #ifndef _ISOC99_SOURCE # define _ISOC99_SOURCE #endif #ifndef _POSIX_C_SOURCE -# define _POSIX_C_SOURCE 200112L +# define _POSIX_C_SOURCE 200809L +#endif +#ifndef _XOPEN_SOURCE +# define _XOPEN_SOURCE 700 #endif #include @@ -48,13 +51,13 @@ #include "sn_network.h" #include "sn_random.h" +#if !defined(__GNUC__) || !__GNUC__ +# define __attribute__(x) /**/ +#endif + #define SNE_MIN(a,b) ((a) < (b) ? (a) : (b)) #define SNE_MAX(a,b) ((a) > (b) ? (a) : (b)) -/* Yes, this is ugly, but the GNU libc doesn't export it with the above flags. - * */ -char *strdup (const char *s); - static uint64_t iteration_counter = 0; static int inputs_num = -1; @@ -72,7 +75,11 @@ static int evolution_threads_num = 4; static int do_loop = 0; -static void sigint_handler (int signal) +static int weight_overall = 50; +static int weight_fails = 2; +static int weight_stages = 1; + +static void sigint_handler (__attribute__((unused)) int signal) { do_loop++; } /* void sigint_handler */ @@ -247,7 +254,7 @@ static int rate_network (sn_network_t *n) /* {{{ */ } /* while (42) */ /* All tests successfull */ - return (SN_NETWORK_STAGE_NUM (n) + patterns_failed); + return (weight_overall + (weight_stages * SN_NETWORK_STAGE_NUM (n)) + (weight_fails * patterns_failed)); } /* }}} int rate_network */ static sn_comparator_t get_random_comparator (void) /* {{{ */ @@ -265,22 +272,20 @@ static sn_comparator_t get_random_comparator (void) /* {{{ */ static int mutate_network (sn_comparator_t *comparators, int comparators_num) { static int old_comparators_num = -1; - static int cut_off = 1000000; + static double mutate_probability = 0.0; int i; if (old_comparators_num != comparators_num) { - double p; - - p = powl (0.5, (1.0 / ((double) comparators_num))); - cut_off = (int) (((double) 1000000) * p); - + /* Probability that NO mutation takes place: 1/3 */ + mutate_probability = powl (1.0 / 3.0, (1.0 / ((double) comparators_num))); old_comparators_num = comparators_num; } + /* `mutate_probability' actually holds 1-p, i. e. it is close to one */ for (i = 0; i < comparators_num; i++) - if (sn_bounded_random (0, 1000000) >= cut_off) + if (sn_double_random () >= mutate_probability) comparators[i] = get_random_comparator (); return (0); @@ -392,7 +397,7 @@ static int create_offspring (void) return (0); } /* int create_offspring */ -static void *evolution_thread (void *arg) +static void *evolution_thread (__attribute__((unused)) void *arg) { while (do_loop == 0) { @@ -458,7 +463,7 @@ static int evolution_start (int threads_num) printf ("Best after approximately %i iterations: " "%i comparators in %i stages. Rating: %i (%i not sorted).\n", iter, comparators_num, stages_num, rating, - rating - stages_num); + (rating - (weight_overall + (weight_stages * stages_num))) / weight_fails); } }