Example #1
0
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);
	}
}
Example #2
0
/*依照每組基因的分數來篩選基因,分數越高越有機會被選上*/
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);
    }
}
Example #3
0
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');

}