31 #ifndef SHARK_ALGORITHMS_DIRECTSEARCH_OPERATORS_SELECTION_EP_TOURNAMENT_H 32 #define SHARK_ALGORITHMS_DIRECTSEARCH_OPERATORS_SELECTION_EP_TOURNAMENT_H 44 template<
typename Extractor >
53 template<
typename InIterator,
typename OutIterator>
55 InIterator it, InIterator itE,
56 OutIterator out, OutIterator outE
59 std::vector<KeyValuePair<int, InIterator> > results = performTournament(it, itE);
60 if(results.size() < outputSize){
61 throw SHARKEXCEPTION(
"[EPTournamentSelection] Input range must be bigger than output range");
64 for(std::size_t i = 0; i != outputSize; ++i, ++out){
65 *out = *results[i].value;
75 template<
typename Population>
80 typedef typename Population::iterator InIterator;
81 std::vector<KeyValuePair<int, InIterator> > results = performTournament(population.begin(),population.end());
84 for(std::size_t i = 0; i != mu; ++i){
85 individualPerform[i].value->select() =
true;
87 for(std::size_t i = mu; i != results.size()-1; ++i){
88 individualPerform[i].value->select() =
false;
97 template<
class InIterator>
98 std::vector<KeyValuePair<int, InIterator> > performTournament(InIterator it, InIterator itE){
100 UIntVector selectionProbability(size,0.0);
101 std::vector<KeyValuePair<int, InIterator> > individualPerformance(size);
103 for( std::size_t i = 0; i !=
size(); ++i ) {
104 individualPerformance[i].value = it+i;
106 std::size_t idx = shark::Rng::discrete( 0,size-1 );
107 if(e(*it) < e(*(it+idx)){
108 individualPerformance[i].key -= 1;
113 std::sort( individualPerformance.begin(), individualPerformance.end());
114 return individualPerformance;