int Evalue(PARBRE arbre) { int g,d; switch (arbre->op) { case Cste: return(arbre->gauche.E); case '+': g = Evalue(arbre->gauche.A); d = Evalue(arbre->droit.A); return (g + d); case '-': g = Evalue(arbre->gauche.A); d = Evalue(arbre->droit.A); return (g - d); case '*': g = Evalue(arbre->gauche.A); d = Evalue(arbre->droit.A); return (g * d); case '/': g = Evalue(arbre->gauche.A); d = Evalue(arbre->droit.A); if (d != 0) return (g / d); else { fprintf(stderr, "Division par Zero\n"); exit(3); } default: fprintf(stderr, "Cas non prevu dans Evaluation: %c\n", arbre->op); exit(4); } }
/*依照每組基因的分數來篩選基因,分數越高越有機會被選上*/ void Eliminate( int group[][COUNT_FUNC]){ int probability[GROUP_SIZE]; int copy[GROUP_SIZE][COUNT_FUNC]; int i,j; int sum, tmp; int index; int random; //int offset[] = {1,2,4,8,16,32,64,128,256,512,1024,2048}; int offset[] = {1,4,9,16,25,36,49,64,81,100,121}; sum = 0; for (i = 0; i < GROUP_SIZE ; i++){ tmp = (int)(Evalue(group[i])); tmp = offset[tmp]; sum += tmp; if ( i == 0 ) probability[i] = tmp; else probability[i] = probability[i-1] + tmp; } for (i = 0 ; i < GROUP_SIZE ; i++){ for ( j = 0 ; j < COUNT_FUNC ; j++){ copy[i][j] = group[i][j]; } } for ( i = 0 ; i < GROUP_SIZE ; i++){ random = rand()%sum + 1; for ( j = 0 ; j < GROUP_SIZE ; j++){ if ( probability[j] >= random){ index = j; break; } } for ( j = 0 ; j < COUNT_FUNC ;j++) group[i][j] = copy[index][j]; } if ( i != GROUP_SIZE){ printf("Eliminate Error\n"); } if (GA_DEBUG_MODE == 1){ printf("==Eliminate==\n"); PrintGene(group); } }
void GeneticAlgorithm(){ int maxIter = 100; int i,j,k; int group[GROUP_SIZE][COUNT_FUNC]; int oldParameter[COUNT_FUNC]; int maxIndex; double sum,max,min,tmp; int count_record = 0; char output[300]; /*初始族群*/ InitGroup(group); for ( i = 0 ; i < maxIter ; i++){ Eliminate(group); Crossover(group); Mutation(group); sum = 0; max = -1; min = 20; maxIndex = 0; #pragma omp parallel for for ( j = 0 ; j < GROUP_SIZE ; j++){ tmp= Evalue( group[j]); if ( tmp > 10){ fout = fopen("parameter.txt", "a"); sprintf(output,"Parameter = "); for ( k = 0 ; k < COUNT_FUNC ; k++){ sprintf(output,"%s %5d",output, group[j][k]); } sprintf(output,"%s, Score = %lf\n",output,tmp); fprintf(fout,"%s",output); fclose(fout); } sum += tmp; if ( tmp > max ){ max= tmp; maxIndex = j; } if ( tmp < min ) min = tmp; } if ( i % 10 == 0) Record(group); printf("Level(%d) = %.2lf, %.2lf, %.2lf\n", i,max,sum/GROUP_SIZE,min); if ( max >= 10.5 && PlayGame(group[maxIndex]) >= 10.9) break; } printf("==Result==\n"); for ( i = 0 ; i < COUNT_FUNC ; i++){ printf(", %d", group[maxIndex][i]); } putchar('\n'); }