void runLocalSearch(FILE *fileResults, HistoricalData *fileReader, int populationSize, int numberOfSteps, int cycle) { printf ("LS Bugs %d - Cycle %d \r", fileReader->openBugList.size(), cycle); int maxEvaluations = (int) (numberOfSteps * populationSize * (1 - TOPMOST_PERCENTIL)); time_t start = time (NULL); LocalSearch *method = new LocalSearch(fileReader, maxEvaluations); Chromosome *bestSolution = method->run(); time_t finish = time (NULL); int diff = (int) (finish - start); printSchedule(bestSolution, "LS", cycle, populationSize, numberOfSteps, fileReader->openBugList.size()); fprintf(fileResults, "Cycle %d; Time = %d; Cost = %.0f; Makespan = %d\n", cycle, diff, bestSolution->getCost(), bestSolution->getSchedule()->calculateMakespan()); fflush(fileResults); }
Chromosome *LocalSearch::run () { // Creates a random chromossome std::vector <double> genes; for (unsigned k = 0; k < historicalData->openBugList.size(); k++) genes.push_back (rand_uniform()); // Calculate cost and chromossome size Chromosome *chromosome = new Chromosome (historicalData, genes); double costReference = chromosome->getCost(); int evaluations = 1; // Hill Climbing local search int size = chromosome->genes.size(); Chromosome *neighbour = chromosome->clone(); while (evaluations <= maxEvaluations) { int i = 0, j; while (i < size && evaluations <= maxEvaluations) { for (j = i + 1; j < size && evaluations <= maxEvaluations; j++) { neighbour->swapGene(i, j); neighbour->recalculateSchedule(); evaluations++; if (neighbour->getCost() < costReference) { delete chromosome; chromosome = neighbour; costReference = neighbour->getCost(); neighbour = neighbour->clone(); break; } else neighbour->swapGene (j, i); } i = j; } // Creates new random chromossome genes.clear(); for (unsigned k = 0; k < historicalData->openBugList.size(); k++) genes.push_back (rand_uniform()); // Calculate cost and chromossome size delete neighbour; neighbour = new Chromosome (historicalData, genes); evaluations++; if (neighbour->getCost() < costReference) { delete chromosome; chromosome = neighbour; costReference = neighbour->getCost(); neighbour = neighbour->clone(); } } return chromosome; }
void runGeneticAlgorithm(FILE *fileResults, HistoricalData *fileReader, int populationSize, int numberOfSteps, int cycle) { time_t start = time (NULL); RandomKeyMethod *method = new RandomKeyMethod (fileReader, populationSize); for (int i=0; i < numberOfSteps; i++) { printf ("GA Bugs %d - Cycle %d - Step %d \r", fileReader->openBugList.size(), cycle, i); method->reproduct (); } Chromosome *bestSolution = method->getBestSolution(); time_t finish = time (NULL); int diff = (int) (finish - start); printSchedule(bestSolution, "GA", cycle, populationSize, numberOfSteps, fileReader->openBugList.size()); fprintf(fileResults, "Cycle %d; Time = %d; Cost = %.0f; Makespan = %d\n", cycle, diff, bestSolution->getCost(), bestSolution->getSchedule()->calculateMakespan()); fflush(fileResults); }