103 static char rcsid[]
DD_UNUSED =
"$Id: cuddGenetic.c,v 1.30 2012/02/05 01:07:18 fabio Exp $";
131 #define STOREDD(i,j) storedd[(i)*(numvars+1)+(j)] 148 static int array_hash (
char *array,
int modulus);
149 static int array_compare (
const char *array1,
const char *array2);
152 static double find_average_fitness (
void);
154 static int PMX (
int maxvar);
155 static int roulette (
int *p1,
int *p2);
196 double average_fitness;
236 for (i = 0; i <
popsize; i++) {
240 if (computed == NULL) {
248 for (i = 0; i <
numvars; i++) {
263 for (i = 0; i <
numvars; i++) {
279 for (i = 1; i <
popsize; i++) {
304 (void) fprintf(table->
out,
"Initial population after sifting\n");
305 for (m = 0; m <
popsize; m++) {
306 for (i = 0; i <
numvars; i++) {
307 (void) fprintf(table->
out,
" %2d",
STOREDD(m,i));
309 (void) fprintf(table->
out,
" : %3d (%d)\n",
317 average_fitness = find_average_fitness();
318 (void) fprintf(table->
out,
"\nInitial population: best fitness = %d, average fitness %8.3f",
STOREDD(small,numvars),average_fitness);
330 if (
cross >= popsize) {
335 for (m = 0; m <
cross; m++) {
346 for (i = popsize; i <= popsize+1; i++) {
375 int *pointer = &
STOREDD(index,0);
388 for (n = 0; n <=
numvars; n++) {
415 average_fitness = find_average_fitness();
416 (void) fprintf(table->
out,
"\nFinal population: best fitness = %d, average fitness %8.3f",
STOREDD(small,numvars),average_fitness);
463 (void) fprintf(table->
out,
"Initial population before sifting\n");
464 for (i = 0; i < 2; i++) {
465 for (j = 0; j <
numvars; j++) {
466 (void) fprintf(table->
out,
" %2d",
STOREDD(i,j));
468 (void) fprintf(table->
out,
"\n");
472 for (i = 2; i <
popsize; i++) {
473 for (j = 0; j <
numvars; j++) {
479 for (j = 0; j <
numvars; j++) {
482 }
while (used[next] != 0);
489 for (j = 0; j <
numvars; j++) {
490 (void) fprintf(table->
out,
" %2d",
STOREDD(i,j));
492 (void) fprintf(table->
out,
"\n");
570 (void) fprintf(table->
out,
"\nCache hit for index %d", index);
583 for (j = 0; j <
numvars; j++) {
585 position = table->
perm[i];
589 if (size > limit)
break;
594 (void) fprintf(table->
out,
"\n");
600 for (j = 0; j <
numvars; j++) {
629 while (
repeat[big] > 1) big++;
630 for (i = big + 1; i <
popsize; i++) {
681 intarray = (
int *) array;
683 for (i = 0; i <
numvars; i++) {
684 val = val * 997 + intarray[i];
687 return ((val < 0) ? -val : val) % modulus;
710 int *intarray1, *intarray2;
712 intarray1 = (
int *) array1;
713 intarray2 = (
int *) array2;
715 for (i = 0; i <
numvars; i++) {
716 if (intarray1[i] != intarray2[i])
return(1);
740 for (i = 1; i <
popsize; i++) {
763 find_average_fitness(
void)
766 int total_fitness = 0;
767 double average_fitness;
769 for (i = 0; i <
popsize; i++) {
772 average_fitness = (double) total_fitness / (
double)
popsize;
773 return(average_fitness);
803 inv1 =
ALLOC(
int,maxvar);
807 inv2 =
ALLOC(
int,maxvar);
828 }
while (cut1 == cut2);
832 (void) fprintf(table->out,
833 "Crossover of %d (mom) and %d (dad) between %d and %d\n",
835 for (i = 0; i <
numvars; i++) {
836 if (i == cut1 || i == cut2) (void) fprintf(table->out,
"|");
837 (void) fprintf(table->out,
"%2d ",
STOREDD(mom,i));
839 (void) fprintf(table->out,
"\n");
840 for (i = 0; i <
numvars; i++) {
841 if (i == cut1 || i == cut2) (void) fprintf(table->out,
"|");
842 (void) fprintf(table->out,
"%2d ",
STOREDD(dad,i));
844 (void) fprintf(table->out,
"\n");
848 for (i = 0; i < maxvar; i++) {
854 for (i = cut1; i != cut2; i = (i == numvars-1) ? 0 : i+1) {
862 for (i = cut2; i != cut1; i = (i == numvars-1 ) ? 0 : i+1) {
881 for (i = 0; i <
numvars; i++) {
882 if (i == cut1 || i == cut2) (void) fprintf(table->out,
"|");
885 (void) fprintf(table->out,
"\n");
886 for (i = 0; i <
numvars; i++) {
887 if (i == cut1 || i == cut2) (void) fprintf(table->out,
"|");
890 (void) fprintf(table->out,
"\n");
929 for (i = 1; i <
popsize; i++) {
940 for (i = 0; i <
popsize; i++) {
941 if (spin <= wheel[i])
break;
949 spin = wheel[popsize-1] * (double)
Cudd_Random() / 2147483561.0;
950 for (i = 0; i <
popsize; i++) {
951 if (spin <= wheel[i])
break;
static int sift_up(DdManager *table, int x, int x_low)
int st_lookup_int(st_table *, void *, int *)
void st_free_table(st_table *)
static int roulette(int *p1, int *p2)
int cuddNextLow(DdManager *table, int x)
int cuddSifting(DdManager *table, int lower, int upper)
int cuddGa(DdManager *table, int lower, int upper)
static st_table * computed
int st_insert(st_table *, void *, void *)
static int array_hash(char *array, int modulus)
static int find_best(void)
static int build_dd(DdManager *table, int num, int lower, int upper)
static int array_compare(const char *array1, const char *array2)
st_table * st_init_table(ST_PFICPCP, ST_PFICPI)
int st_delete(st_table *, void *, void *)
int cuddSwapInPlace(DdManager *table, int x, int y)
static int rand_int(int a)
static int make_random(DdManager *table, int lower)
static int PMX(int maxvar)
static char rcsid [] DD_UNUSED