Exemplo n.º 1
0
void
Algorithm<T>::Init(int pCountOfIndividuals, 
									 int pCountOfChromosomes,
						       const std::vector<T>& pAllPossibleIndividuals,
						       TaskDefinition<T>* pTask)
{
	if (!m_isInitialized) {
		assert (pAllPossibleIndividuals.size() != 0);
		assert (m_countOfIndividuals <= pAllPossibleIndividuals.size());
		m_countOfIndividuals = pCountOfIndividuals;
		m_countOfChromosomes = pCountOfChromosomes;
		m_allPossibleIndividuals = pAllPossibleIndividuals;
        m_task = pTask;
		
		// 1. Randomly initialize population.
		RandomInitPopulation();

		while (true) {
			// 2. Calculate fitness values.
			CalculateObjectiveFunction();

			// 3. Calculate fitness value. 
			CalculateFitnessValue();

			// 4. Calculate fitness probability.
			CalculateFitnessProbability();

			// 5. Calculate cumulative probability.
			CalculateCumulativeProbability();

			// 6. Selection
			Selection();

			// 7. Extract Parents
			ExtractParents();

			// 8. Crossover
			Crossover();

			// 9. Mutation
			Mutation();

		}
		m_isInitialized = true;
	} else {
		std::cout << "Algorithm is already initialized." << std::endl;
	}
}
Exemplo n.º 2
0
bool GeneticAlgorithm::CreateTimetable(int stop, float infeasibilitiesWeight, float didacticDissatisfactionWeight, 
									   float organizationalDissatisfactionWeight, int mutationGenSize, float crossoverProbability)
{
	finished = false;

	if(!CheckData())
	{
		std::cout << "Bledne dane wejsciowe!" << std::endl;
		return false;
	}

	float min = std::numeric_limits<float>::max();
	char *** solution = new char **[teachers_count];
	for (int i = 0; i < teachers_count; i++)
	{
		solution[i] = new char*[days];
		for (int j = 0; j < days; j++)
		{
			solution[i][j] = new char[hours_per_day];
		}
	}
	int it = 0;
	int seed = time(NULL);
	while(it < stop)
	{
		std::cout << "New population cycle " << it << std::endl;
		srand(seed++);
		int iteration = 0;
		Initialize();
		for(int i = 0; i < population_size; ++i)
		{
			Filter(timetables[i]);
		}
		for(; it < stop; ++it)
		{
			std::cout << it << std::endl;
			float *initial_fitness = CalculateObjectiveFunction(timetables, population_size, infeasibilitiesWeight, didacticDissatisfactionWeight, 
				organizationalDissatisfactionWeight);
			std::vector<char***> new_population = Reproduction(initial_fitness);

			Crossover(new_population, crossoverProbability, infeasibilitiesWeight, 
				didacticDissatisfactionWeight, organizationalDissatisfactionWeight);

			float *new_fitness = CalculateObjectiveFunction(new_population.data(), new_population.size(), infeasibilitiesWeight, didacticDissatisfactionWeight, 
				organizationalDissatisfactionWeight);
			Succession(initial_fitness, new_fitness, new_population);

			delete [] initial_fitness;
			delete [] new_fitness;

			for (int individual = 0; individual < population_size; individual++)
			{
				ApplyMutationOfOrder(individual,mutationGenSize);
				ApplyDayMutation(individual);
				Filter(timetables[individual]);
			}
			float * results = CalculateObjectiveFunction(timetables, population_size, infeasibilitiesWeight, didacticDissatisfactionWeight, 
				organizationalDissatisfactionWeight);
			int idx = -1;
			for (int i = 0; i < population_size; i++)
			{
				if(results[i] < min)
				{
					min = results[i];
					idx = i;
				}
			}
			if(idx > -1)
			{
				for (int i = 0; i < teachers_count; i++)
				{
					for (int j = 0; j < days; j++)
					{
						for (int k = 0; k < hours_per_day; k++)
						{
							solution[i][j][k] = timetables[idx][i][j][k];
						}
					}
				}
				std::cout << "Actual minimum: " << min << std::endl;
				iteration = 0;
			}
			else
				iteration++;
			if(iteration > max_iterations)
				break;
		}
	}

	std::ofstream result;
	result.open("result.pout");
	std::cout << "Final minimum: " << std::endl << min << std::endl;
	std::cout << "Final solution:" << std::endl;
	PrintTimetable(solution, std::cout);
	PrintTimetable(solution, result);
	// put minimum data into file
	result << "Minimum: " << min;
	result.close();

	finished = true;

	return true;
}