#ifndef eoNSGA_II_Eval_h #define eoNSGA_II_Eval_h #include #include /** @brief Fast Elitist Non-Dominant Sorting Genetic Algorithm Adapted from Deb, Agrawal, Pratab and Meyarivan: A Fast Elitist Non-Dominant Sorting Genetic Algorithm for MultiObjective Optimization: NSGA-II KanGAL Report No. 200001 */ namespace nsga2 { void assign_worths(const std::vector& front, unsigned rank, std::vector& worths); } template class eoNSGA_II_Eval : public eoMOEval { public: eoNSGA_II_Eval(eoEvalFunc& eval) : eoMOEval(eval) {} eoNSGA_II_Eval(eoPopEvalFunc& eval) : eoMOEval(eval) {} virtual void operator()(eoPop& parents, eoPop& offspring) { this->eval(parents, offspring); std::vector pop; pop.reserve(parents.size() + offspring.size()); for (unsigned i = 0; i < parents.size(); ++i) pop.push_back(&parents[i]); for (unsigned i = 0; i < offspring.size(); ++i) pop.push_back(&offspring[i]); typename eoFrontSorter::front_t front = sorter(pop); // calculate worths std::vector worths(pop.size()); for (unsigned i = 0; i < front.size(); ++i) { nsga2::assign_worths(front[i], front.size() - i, worths); } // set worths for (unsigned i = 0; i < pop.size(); ++i) { pop[i]->fitnessReference().setWorth( worths[i]); } } eoFrontSorter sorter; private: }; #endif