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>
56 InIterator it, InIterator itE,
57 OutIterator out, OutIterator outE
60 std::vector<KeyValuePair<int, InIterator> > results = performTournament(rng, it, itE);
61 if(results.size() < outputSize){
62 throw SHARKEXCEPTION(
"[EPTournamentSelection] Input range must be bigger than output range");
65 for(std::size_t i = 0; i != outputSize; ++i, ++out){
66 *out = *results[i].value;
76 template<
typename Population>
82 typedef typename Population::iterator InIterator;
83 std::vector<KeyValuePair<int, InIterator> > results = performTournament(rng, population.begin(),population.end());
86 for(std::size_t i = 0; i != mu; ++i){
87 individualPerform[i].value->select() =
true;
89 for(std::size_t i = mu; i != results.size()-1; ++i){
90 individualPerform[i].value->select() =
false;
99 template<
class InIterator>
100 std::vector<KeyValuePair<int, InIterator> > performTournament(
DefaultRngType& rng, InIterator it, InIterator itE){
102 UIntVector selectionProbability(size,0.0);
103 std::vector<KeyValuePair<int, InIterator> > individualPerformance(size);
105 for( std::size_t i = 0; i !=
size(); ++i ) {
106 individualPerformance[i].value = it+i;
108 std::size_t idx =
discrete(rng, 0,size-1 );
109 if(e(*it) < e(*(it+idx)){
110 individualPerformance[i].key -= 1;
115 std::sort( individualPerformance.begin(), individualPerformance.end());
116 return individualPerformance;