+static void ind_print (const individuum_t *ind) /* {{{ */
+{
+ int i;
+
+ for (i = 0; i < inputs_num; i++)
+ {
+ printf ("%3i: %s\n", i, (ind[i] == 0) ? "-" :
+ (ind[i] < 0) ? "MIN" : "MAX");
+ }
+
+ printf ("# sn-cut");
+ for (i = 0; i < inputs_num; i++)
+ {
+ if (ind[i] == 0)
+ continue;
+ printf (" %i:%s", i, (ind[i] < 0) ? "MIN" : "MAX");
+ }
+ printf ("\n");
+} /* }}} void ind_print */
+
+/* Simply makes sure the right amount of cutting positions exist. */
+static void mutate (individuum_t *ind, int this_cuts_num) /* {{{ */
+{
+ int i;
+
+ if (this_cuts_num < 0)
+ {
+ this_cuts_num = 0;
+ for (i = 0; i < inputs_num; i++)
+ if (ind[i] != 0)
+ this_cuts_num++;
+ }
+
+ while (this_cuts_num != cuts_num)
+ {
+ i = sn_bounded_random (0, inputs_num - 1);
+
+ if ((this_cuts_num < cuts_num)
+ && (ind[i] == 0))
+ {
+ ind[i] = (sn_bounded_random (0, 1) * 2) - 1;
+ assert (ind[i] != 0);
+ this_cuts_num++;
+ }
+ else if ((this_cuts_num > cuts_num)
+ && (ind[i] != 0))
+ {
+ ind[i] = 0;
+ this_cuts_num--;
+ }
+ }
+} /* }}} void mutate */
+