13#if !defined(ULTRA_EVOLUTION_SELECTION_H)
14# error "Don't include this file directly, include the specific .h instead"
17#if !defined(ULTRA_EVOLUTION_SELECTION_TCC)
18#define ULTRA_EVOLUTION_SELECTION_TCC
28strategy<E>::strategy(E &eva,
const parameters ¶ms)
29 : eva_(eva), params_(params)
61template<SizedRandomAccessPopulation P>
62std::vector<typename tournament<E>::scored_t>
65 Expects(!this->params_.needs_init());
67 const auto rounds(this->params_.evolution.tournament_size);
71 std::vector<std::pair<typename P::coord, evaluator_fitness_t<E>>> ret;
77 const auto mate_zone(this->params_.evolution.mate_zone);
78 const auto target(random::coord(pop));
80 for (std::size_t i(0); i < rounds; ++i)
82 const auto new_coord(random::coord(pop, target, mate_zone));
83 const auto new_fitness(this->eva_(pop[new_coord]));
85 ret.emplace_back(new_coord, new_fitness);
88 while (k && ret[k - 1].second < ret[k].second)
90 std::swap(ret[k - 1], ret[k]);
95 assert(std::ranges::is_sorted(ret,
96 [](
const auto &i1,
const auto &i2)
98 return i1.second > i2.second;
101 std::vector<scored_t> rs;
102 rs.reserve(ret.size());
103 std::ranges::transform(ret, std::back_inserter(rs),
104 [&pop](
const auto &c)
106 return scored_t{pop[c.first], c.second};
109 Ensures(rs.size() == rounds);
145template<PopulationWithMutex P>
146std::array<typename alps<E>::scored_t, 2>
149 Expects(!this->params_.needs_init());
153 evaluator_individual_t<E> ind;
157 std::pair<bool, evaluator_fitness_t<E>> rank;
160 const auto sample([
this](
const auto &layer)
163 const auto rank(std::pair(ind.age() <= layer.max_age(),
166 return candidate{std::move(ind), rank};
169 auto best(sample(pops.
primary()));
170 auto second(sample(pops.
primary()));
172 if (best.rank < second.rank)
173 std::swap(best, second);
175 const auto ts(this->params_.evolution.tournament_size);
176 assert(0<ts && ts<=parameters::evolution_parameters::max_tournament_size);
178 const auto p_main_layer(this->params_.alps.p_main_layer);
179 assert(in_0_1(p_main_layer));
181 for (
auto rounds(ts - 1); rounds; --rounds)
183 auto incoming(sample(pops.
random(p_main_layer)));
185 if (second.rank < incoming.rank)
187 second = std::move(incoming);
189 if (best.rank < second.rank)
190 std::swap(best, second);
193 assert(best.rank >= second.rank);
194 assert(best.rank.first || !second.rank.first);
197 return {scored_t{std::move(best.ind), best.rank.second},
198 scored_t{std::move(second.ind), second.rank.second}};
211template<SizedRandomAccessPopulation P>
212de::selected_refs<typename P::value_type>
213de::operator()(P &pop)
const
215 const auto target(random::coord(pop));
216 const auto base(random::coord(pop));
217 const auto a(random::coord(pop));
218 const auto b(random::coord(pop));
222 return {pop[target], pop[base], pop[a], pop[b]};
constexpr Layer & primary() const noexcept
Definition alps.h:92
Layer & random(double p_pri) const
Definition alps.h:117
void operator()(alps_layer_pair< P >, const scored_t &, status_t &) const
Definition evolution_replacement.h:294
bool operator()(P &, const scored_t &, status_t &) const
Definition evolution_replacement.h:42
std::ranges::range_value_t< P > individual(const P &p)
Definition population.h:107
static constexpr std::size_t max_tournament_size
Definition parameters.h:180