#include "ga.h" #include "../includes/globals.h" #include #include #include #include "../WalkSat/WalkSat.h" #include "ga_param.h" void printSolution(int hasSolution){ int i; int j; if(hasSolution == 0){ printf("Solution: Fail\n"); return; } printf("Solution: ("); for(i=0; i0){ if(gene->assignment[lit-1]>0){ counter++; break; } } else{ if(gene->assignment[abs(lit)-1]<=0){ counter++; break; } } } } if(counter > bestSolutionValue){ bestSolutionValue = counter; for(i=0; iassignment[i] > 0){ bestSolution[i] = 1; } else{ bestSolution[i] = -1; } } } if(counter == numberOfClauses){ solutionFound = 1; for(i=0; iassignment[i] > 0){ literals[i].value = 1; } else{ literals[i].value = -1; } } } return counter; } int literalsToSatisfyMostUnsatisfied(GENE* gene, int* tabuList){ int i; int j; int max; int maxValue; int maxV; int maxValueV; for(i=0;i0){ if(gene->assignment[lit-1]>0){ satisfied=1; break; } } else{ if(gene->assignment[abs(lit)-1]<=0){ satisfied=1; break; } } } if(satisfied == 0){ for(j=0;jfitness = clausesSatisfied(gene); //gene->fitness *= gene->fitness; } void mutateGene(GENE* gene){ int flipCount = random()%numberOfLiterals; int i; for(i=0;iassignment[val] = gene->assignment[val]==1?0:1; } calculateFitness(gene); } void crossGenes(GENE* parent1, GENE* parent2, GENE* child1, GENE* child2){ int i; for(i=0;iassignment[i]=parent1->assignment[i]; child2->assignment[i]=parent2->assignment[i]; } else{ child1->assignment[i]=parent2->assignment[i]; child2->assignment[i]=parent1->assignment[i]; } } calculateFitness(child1); calculateFitness(child2); } void copyGenes(GENE* parent1, GENE* parent2, GENE* child1, GENE* child2){ int i; for(i=0;iassignment[i]=parent1->assignment[i]; child2->assignment[i]=parent2->assignment[i]; } calculateFitness(child1); calculateFitness(child2); } int localSearch(GENE* gene){ if(HEURISTIC == TABU_SEARCH){ return localSearchTabu(gene); } else if(HEURISTIC == WALK_SAT){ return localSearchWalkSat(gene); } } int localSearchWalkSat(GENE* gene){ //assign the gene into a structure int i; int flips; int retries; for(i=0; iassignment[i] > 0){ functionUse_literalsSize[i]=(i+1); } else{ functionUse_literalsSize[i]=-(i+1); } } if(WalkSat(RAND_PROB, RETRIES_FACTOR * numberOfLiterals, 1, &flips, &retries, functionUse_literalsSize)>0){ for(i=0;i0?1:-1; } solutionFound = 1; return 1; } else{ for(i=0;iassignment[i] = functionUse_literalsSize[i]>0?1:0; } calculateFitness(gene); return 0; } } int localSearchTabu(GENE* gene){ int tabuList[TABU_SIZE]; int tabuPosition=0; int currentFitness = gene->fitness; int bestFlip = currentFitness; int bestLiteral = -1; int i; for(i=0;iassignment[rand] > 0){ gene->assignment[rand] = 0; } else{ gene->assignment[rand] = 1; } } calculateFitness(gene); return solutionFound; } int localSearchWithRandomFlipsTabu(GENE* gene){ int tabuList[TABU_SIZE]; int tabuPosition=0; int currentFitness = gene->fitness; int bestFlip = currentFitness; int bestLiteral = -1; int i; for(i=0;iassignment[rand] > 0){ gene->assignment[rand] = 0; } else{ gene->assignment[rand] = 1; } } calculateFitness(gene); return solutionFound; } int runGeneticAlgorithm(){ initializeGeneticAlgorithm(); int generation; int genes; int i; for(generation=0; generation maxFitness){ maxFitness = currentGeneration[i].fitness; fittestGene = ¤tGeneration[i]; } } //printf("\n"); printf("Starting Level %d at fitness %d\n",generation+1, maxFitness); printf("Local Search Leads to"); if(localSearch(fittestGene)){ printf(" right answer..\n"); return 1; } printf(" %d\n",fittestGene->fitness); totalSum+=fittestGene->fitness-maxFitness; for(genes=0;genes=0){ randomVal-=currentGeneration[i].fitness; if(randomVal <= 0){ parent1 = ¤tGeneration[i]; } } if(randomVal2>=0){ randomVal2-=currentGeneration[i].fitness; if(randomVal2 <= 0){ parent2 = ¤tGeneration[i]; } } } if(parent1 == parent2){ genes-=1; continue; } //if(genes < POPULATION_SIZE/10){ // copyGenes(parent1, parent2, &nextGeneration[genes], &nextGeneration[genes+1]); //} //else{ crossGenes(parent1, parent2, &nextGeneration[genes], &nextGeneration[genes+1]); //} } for(i=0;i \n"); exit(1); } POPULATION_SIZE = atoi(argv[2]); MUTATE = atoi(argv[3]); TABU_SIZE = atoi(argv[4]); HEURISTIC = strcmp(argv[5], "tabu")==0?TABU_SEARCH:WALK_SAT; RETRIES_FACTOR = atoi(argv[6]); RAND_PROB = atof(argv[7]); RANDOM_SEED = atoi(argv[8]); int returned = runGeneticAlgorithm(); printSolution(returned); }