/*************************************************************************** * File name : longruns.c (modifed from tourn.c) * 10000 runs, 300 pop_size * First written: 30 July 1997 by Chilukuri K. Mohan at Syracuse University ***************************************************************************/ #include #include #include #include #include #include struct timeval *tp; struct timezone *tzp; int *listofprimes; /* primes >= 13 */ int max_prime_count = 40; time_t t=0.0; int max_trials = 10; int maxpos =0; float mut_rate = 0.033333333; long int jran = 2147483647; float epsilon = 0.01; float pop_mean_fitness; float pop_max_fitness; int max_num_of_generation = 10000; int indiv_length = 300; int sizeby3 = 100; int print_freq = 250; int pop_size = 300; int sel_choice = 1; int op_choice = 0; float **gradient; float *onegrad; float *sum_maxf; int **population; int **offspring_set; float *newfit; float *oldfit; int no_of_mutation = 0; /*********** function prototypes ***********************************/ double when(); void initialization(); float mean_pop_fitness(); float max_pop_fitness(); void init_population(); void execute_one_generation(); int fitness_proportionate(); void change_contents(); void d_tournament(); void nd_tournament(); void tournament(); void replacement(); void elitist(); float fitness_modified(); void crossover(); void mutation(); int ux(); void one_ptx(); void two_ptx(); int pux(); void hux(); float weight(); float variation(); float fitness(); float max(); float min(); float triple(); float ugly3(); float easy3(); float myrand(); float getaprime(); extern struct timeval; extern struct timezone; double when(){ /* time function to record current time*/ struct timeval tp; struct timezone tzp; gettimeofday(&tp,&tzp); return ((double) tp.tv_sec + (double) tp.tv_usec*1e-6); } /*********************************************************************** * main **********************************************************************/ main () { int argc, i,j,k, no_of_prints, trial_num, no_gen=0; double start_time = 0.0; initialization(); no_of_prints = max_num_of_generation/print_freq; for (i=0;i < no_of_prints; i++) sum_maxf[i] = 0.0; start_time = when(); for (trial_num=0; trial_num < max_trials; trial_num++) { init_population(); for (i=0; i < no_of_prints; i++) { for (j=0; j=1) with which changes should be printed:"); scanf("%d",&print_freq); fprintf(stderr,"Population size :"); scanf("%d",&pop_size); } population = (int **) calloc(pop_size,sizeof(int)); offspring_set = (int **) calloc(pop_size,sizeof(int)); sum_maxf = (float *) calloc(500,sizeof(float)); newfit = (float *) calloc(pop_size,sizeof(float)); oldfit = (float *) calloc(pop_size,sizeof(float)); gradient = (float **) calloc(pop_size,sizeof(float)); onegrad = (float *) calloc(pop_size,sizeof(float)); listofprimes = (int *) calloc(max_prime_count,sizeof(int)); listofprimes[0]=13;listofprimes[1]=17 ;listofprimes[2]=19 ;listofprimes[3]=23 ;listofprimes[4]=29 ; listofprimes[5]=31 ;listofprimes[6]= 37 ;listofprimes[7]=41 ;listofprimes[8]=43 ;listofprimes[9]=47 ; listofprimes[10]=53 ;listofprimes[11]=59 ;listofprimes[12]=61 ;listofprimes[13]=67 ;listofprimes[14]=71 ; listofprimes[15]=79 ;listofprimes[16]=83 ;listofprimes[17]=89 ;listofprimes[18]=97 ;listofprimes[19]=101 ; listofprimes[20]=103 ;listofprimes[21]=107 ;listofprimes[22]=109 ;listofprimes[23]=113 ;listofprimes[24]=119 ; listofprimes[25]=127 ;listofprimes[26]=131 ;listofprimes[27]=133 ;listofprimes[28]=137 ;listofprimes[29]=139 ; listofprimes[30]=149 ;listofprimes[31]=151 ;listofprimes[32]=157 ;listofprimes[33]=163 ;listofprimes[34]=167 ; listofprimes[35]=173 ;listofprimes[36]=179 ;listofprimes[37]=181 ;listofprimes[38]=191 ;listofprimes[39]=193 ; } /****************************************** function definitions */ /* * finding mean fitness value of current population */ float mean_pop_fitness() { int i; float result = 0.0; for(i=0;i result) {maxpos = i; result = cur_fit;} } return(result); } /*********************************************************************** * init_population **********************************************************************/ void init_population() { int i,j, *indv; float *onegrad; for (i=0; i < pop_size;i++) { indv = (int *) calloc(indiv_length,sizeof(int)); onegrad = (float *) calloc(indiv_length,sizeof(float)); /* allocate memory for each individual */ if ((indv == NULL)||(onegrad == NULL)) { fprintf(stderr,"insufficient memory error\n"); exit(1); } for(j=0;j current) { i++; current += oldfit[i];} /*fprintf(stderr,"i=%d, randint=%d, current = %d,\n", i, randint, current);*/ return((i pop_max_fitness)) {for (j=0;j curfit)) || (!(det) && (myrand() > curfit/(curfit + oldfit[k])))) { curfit = oldfit[k]; curbest = k;} } if (curbest < pop_size) { for (j=0; j < indiv_length; j++) offspring_set[i][j] = population[curbest][j]; newfit[i] = oldfit[curbest]; } /* Later, also store gradient for reuse */ } for (i=0; i New **************/ void crossover( X, Y, New) int X, Y, * New; { float diffXY=0; int i, oneprime=getaprime(); int j=0; if (X==Y) for(i=0;i (fitness_modified(X,j) - fitness_modified(Y,j))) ? population[X][j] : population[Y][j])); } } } } /*---------------------------------------------------------*/ float myrand() /* returns a float >= 0 and <1 */ { long int n; jran = (1283 + (jran * 106)) % 6075; /* 0 <= jran < 6075 */ return ((float) (jran) / 6075 ); }/***********************************************************************/ void mutation( X) int * X; { int i; for(i=0;i p) ? population[y][i]: population[x][i]; }/***********************************************************************/ void hux(x, y, Z) /* ensures half the elements come from each parent */ int x, y, * Z; { int i, oneprime=getaprime(); int j,xcount=0; float halflen = indiv_length/2; for(i=0;i= y) ? x :y);} /**********************************************************************/ float min(x,y) float x, y;{return ((x > y) ? y :x);} /**********************************************************************/ float fitness(X) int * X; { return(ugly3(sizeby3,X));} /*********** CALCULATE Hamming distance*************/ float variation(X, Y) int * X, *Y; { int i, sum=0; for(i=0;i