Beispiel #1
0
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;
}
Beispiel #3
0
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);
}