This repository has been archived on 2026-03-28. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
eodev/eo/src/moo/eoNSGA_IIa_Eval.h
maartenkeijzer f93327a041 several fixes
2007-09-03 14:37:27 +00:00

59 lines
1.6 KiB
C++

#ifndef eoNSGA_IIa_Eval_h
#define eoNSGA_IIa_Eval_h
#include <moo/eoFrontSorter.h>
#include <moo/eoMOEval.h>
#include <cassert>
/** @brief Fast Elitist Non-Dominant Sorting Genetic Algorithm
Variant of the NSGA-II, where the ranking is based on a top-down distance based mechanism ( O(n^2)! )
*/
namespace nsga2a {
extern unsigned assign_worths(std::vector<detail::FitnessInfo> front, unsigned rank, std::vector<double>& worths);
}
template <class EOT>
class eoNSGA_IIa_Eval : public eoMOEval<EOT>
{
public:
eoNSGA_IIa_Eval(eoEvalFunc<EOT>& eval) : eoMOEval<EOT>(eval) {}
eoNSGA_IIa_Eval(eoPopEvalFunc<EOT>& eval) : eoMOEval<EOT>(eval) {}
virtual void operator()(eoPop<EOT>& parents, eoPop<EOT>& offspring) {
eval(parents, offspring);
std::vector<EOT*> 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<EOT>::front_t front = sorter(pop);
std::vector<double> worths(pop.size());
unsigned rank = pop.size();
for (unsigned i = 0; i < front.size(); ++i) {
rank = nsga2a::assign_worths(front[i], rank, worths);
}
for (unsigned i = 0; i < worths.size(); ++i) {
typename EOT::Fitness f = pop[i]->fitness();
f.setWorth(worths[i]);
pop[i]->fitness(f);
}
}
private:
eoFrontSorter<EOT> sorter;
// implementation
};
#endif