28strategy<E>::strategy(E &eva,
const problem &prob) : eva_(eva), prob_(prob)
41 requires std::ranges::random_access_range<const R>
42 && std::ranges::sized_range<const R>
43 && std::same_as<std::ranges::range_value_t<const R>, scored_t>
45 const auto ¶ms(this->prob_.params.evolution);
47 Expects(in_0_1(params.p_cross));
48 Expects(params.brood_recombination);
49 Expects(std::ranges::size(parents) >= 2);
53 const auto scored([
this](
auto ind)
55 auto fitness(this->eva_(ind));
56 return scored_t(std::move(ind), std::move(fitness));
59 const auto generate([&]
61 const auto first(std::ranges::begin(parents));
66 offspring.mutation(this->prob_);
67 return scored(std::move(offspring));
70 auto offspring(crossover(this->prob_, first[0].ind, first[1].ind));
72 if (params.p_mutation > 0.0)
74 constexpr unsigned max_attempts(32);
84 && (offspring.signature() == first[0].ind.signature()
85 || offspring.signature() == first[1].ind.signature());
87 offspring.mutation(this->prob_,
static_cast<double>(i + 1));
90 return scored(std::move(offspring));
93 const unsigned brood_size(use_crossover || params.p_mutation > 0.0
94 ? params.brood_recombination : 1);
96 auto best(generate());
98 for (
unsigned i(1); i < brood_size; ++i)
99 if (
auto candidate(generate()); candidate > best)
100 best = std::move(candidate);