55 if (population.
empty())
return;
57 std::size_t pop_size = population.
size();
61 evaluatePopulation(population);
63 std::random_device master_rd;
64 unsigned int master_seed = master_rd();
66 for (std::size_t generation_idx = 0; generation_idx < max_generations_m; ++generation_idx) {
71 std::mt19937_64 tl_gen(master_seed + omp_get_thread_num() + generation_idx);
72 std::uniform_real_distribution<double> tl_dist(0.0, 1.0);
73 std::uniform_int_distribution<std::size_t> tl_int_dist(0, pop_size - 1);
74 std::uniform_int_distribution<std::size_t> tl_gene_dist(0, num_genes - 1);
76 #pragma omp for schedule(static)
77 for (
int i = 0; i < static_cast<int>(pop_size); ++i) {
79 std::size_t r1, r2, r3;
80 do { r1 = tl_int_dist(tl_gen); }
while (r1 ==
static_cast<std::size_t
>(i));
81 do { r2 = tl_int_dist(tl_gen); }
while (r2 ==
static_cast<std::size_t
>(i) || r2 == r1);
82 do { r3 = tl_int_dist(tl_gen); }
while (r3 ==
static_cast<std::size_t
>(i) || r3 == r1 || r3 == r2);
84 const auto& target = population[i].getGenotype();
85 const auto& x_r1 = population[r1].getGenotype();
86 const auto& x_r2 = population[r2].getGenotype();
87 const auto& x_r3 = population[r3].getGenotype();
92 std::size_t j_rand = tl_gene_dist(tl_gen);
97 for (std::size_t j = 0; j < num_genes; ++j) {
98 trial[j] = x_r1[j] + F_m * (x_r2[j] - x_r3[j]);
101 for (std::size_t j = 0; j < num_genes; ++j) {
102 trial[j] = x_r1[j] + F_m * (x_r2[j] - x_r3[j]);
107 for (std::size_t j = 0; j < num_genes; ++j) {
108 if (tl_dist(tl_gen) <= CR_m || j == j_rand) {
111 trial[j] = target[j];
116 double trial_fitness = fitness_function_m.
evaluate(trial);
119 if (trial_fitness <= population[i].getFitness()) {
120 new_population[i] = std::move(trial_ind);
122 new_population[i] = population[i];
127 std::swap(population, new_population);