virtual void run(unsigned int generations, unsigned int logFrequency = 100) { // Generation: create the new members for (auto i = 0U; i < PopSize; ++i) { population.push_back(generator()); } for (auto generation = 0U; generation < generations; ++generation) { // Crossover: Add missing members auto popSizePostSelection = population.size(); while (population.size() < PopSize) { population.push_back( crossover(population[random_uint(popSizePostSelection)], population[random_uint(popSizePostSelection)])); } // Mutation: Mutate at least rate*popsize members for (size_t i = 0; i < PopSize * mutationRate; ++i) { auto index = random_uint(PopSize); mutator(population[index]); } // Selection: Destroy the least fit members selector(population, evaluator); if (evaluator(population[0]) > bestScore) { bestMember = population[0]; bestScore = evaluator(population[0]); } if (generation % logFrequency == 0) { std::cout << "Generation(" << generation << ") - Fitness:" << bestScore << std::endl; } } std::cout << "Best: "; for (const auto& allele : bestMember) { std::cout << allele << " "; } std::cout << std::endl << "Fitness: " << evaluator(bestMember) << std::endl; }