32 #ifndef SHARK_ALGORITHMS_DIRECT_SEARCH_OPERATORS_SELECTION_INDICATOR_BASED_SELECTION_H 33 #define SHARK_ALGORITHMS_DIRECT_SEARCH_OPERATORS_SELECTION_INDICATOR_BASED_SELECTION_H 54 template<
typename Indicator>
59 struct view_reference {
62 typedef RealVector FitnessType;
64 view_reference() : mep_value( NULL ){}
65 view_reference(T & value) : mep_value( &value ){}
72 operator const T & ()
const 77 view_reference<T> operator=(
const T & rhs )
84 RealVector
const& penalizedFitness()
const{
85 return mep_value->penalizedFitness();
88 RealVector
const& unpenalizedFitness()
const{
89 return mep_value->unpenalizedFitness();
93 return mep_value->selected();
106 template<
typename PopulationType>
107 void operator()( PopulationType & population, std::size_t mu )
109 if(population.empty())
return;
113 nonDomSort(population);
115 typedef std::vector< view_reference<typename PopulationType::value_type > > View;
117 unsigned int maxRank = 0;
118 std::map< unsigned int, View > fronts;
120 for(
unsigned int i = 0; i < population.size(); i++ ) {
121 maxRank =
std::max( maxRank, static_cast<unsigned int>( population[i].rank() ) );
122 fronts[population[i].rank()].push_back( population[i] );
123 population[i].selected() =
true;
127 unsigned int rank = maxRank;
128 std::size_t popSize = population.size();
130 while(popSize-fronts[rank].
size() >= mu){
132 View & front = fronts[rank];
133 for(std::size_t i = 0; i != front.size(); ++i){
134 front[i].selected() =
false;
136 popSize -= front.size();
141 View& front = fronts[rank];
142 for(; popSize >mu;--popSize) {
144 front[lc].selected() =
false;
145 front.erase( front.begin() + lc );
155 template<
typename Archive>
156 void serialize( Archive & archive,
const unsigned int version )