/**
- * 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
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors:
- * Florian octo Forster <octo at verplant.org>
+ * Florian octo Forster <ff at octo.it>
**/
#ifndef _ISOC99_SOURCE
static int comparators_num = -1;
+static char *initial_input_file = NULL;
static char *best_output_file = NULL;
static int stats_interval = 0;
static int do_loop = 0;
+static int weight_overall = 50;
+static int weight_fails = 2;
+static int weight_stages = 1;
+
static void sigint_handler (int signal)
{
do_loop++;
"Valid options are:\n"
" -i <inputs> Number of inputs\n"
" -c <comparators> Number of comparators\n"
+ " -I <file> Initial input file\n"
" -o <file> Write the current best solution to <file>\n"
" -p <num> Size of the population (default: 128)\n"
" -P <peer> Send individuals to <peer> (may be repeated)\n"
{
int option;
- while ((option = getopt (argc, argv, "i:c:o:p:P:s:t:h")) != -1)
+ while ((option = getopt (argc, argv, "i:c:I:o:p:P:s:t:h")) != -1)
{
switch (option)
{
break;
}
+ case 'I':
+ {
+ if (initial_input_file != NULL)
+ free (initial_input_file);
+ initial_input_file = strdup (optarg);
+ break;
+ }
+
case 'o':
{
if (best_output_file != NULL)
} /* 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) /* {{{ */
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);
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);
}
}
population_start_listen_thread (population, NULL, NULL);
+ if (initial_input_file != NULL)
+ {
+ sn_network_t *n;
+
+ n = sn_network_read_file (initial_input_file);
+ if (n == NULL)
+ {
+ fprintf (stderr, "Cannot read network from `%s'.\n",
+ initial_input_file);
+ exit (EXIT_FAILURE);
+ }
+
+ if (n->inputs_num != inputs_num)
+ {
+ fprintf (stderr, "Network `%s' has %i inputs, but %i were configured "
+ "on the command line.\n",
+ initial_input_file, n->inputs_num, inputs_num);
+ exit (EXIT_FAILURE);
+ }
+
+ population_insert (population, n);
+ sn_network_destroy (n);
+ }
+ else /* if (initial_input_file == NULL) */
{
sn_network_t *n;
int i;