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; } }
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; }