00001 #ifndef eoNSGA_II_Eval_h
00002 #define eoNSGA_II_Eval_h
00003
00004 #include <moo/eoFrontSorter.h>
00005 #include <moo/eoMOEval.h>
00006
00015 namespace nsga2 {
00016 void assign_worths(const std::vector<detail::FitnessInfo>& front, unsigned rank, std::vector<double>& worths);
00017 }
00018
00019 template <class EOT>
00020 class eoNSGA_II_Eval : public eoMOEval<EOT>
00021 {
00022 public:
00023
00024 eoNSGA_II_Eval(eoEvalFunc<EOT>& eval) : eoMOEval<EOT>(eval) {}
00025 eoNSGA_II_Eval(eoPopEvalFunc<EOT>& eval) : eoMOEval<EOT>(eval) {}
00026
00027 virtual void operator()(eoPop<EOT>& parents, eoPop<EOT>& offspring) {
00028 this->eval(parents, offspring);
00029
00030 std::vector<EOT*> pop;
00031 pop.reserve(parents.size() + offspring.size());
00032 for (unsigned i = 0; i < parents.size(); ++i) pop.push_back(&parents[i]);
00033 for (unsigned i = 0; i < offspring.size(); ++i) pop.push_back(&offspring[i]);
00034
00035 typename eoFrontSorter<EOT>::front_t front = sorter(pop);
00036
00037
00038 std::vector<double> worths(pop.size());
00039 for (unsigned i = 0; i < front.size(); ++i) {
00040 nsga2::assign_worths(front[i], front.size() - i, worths);
00041 }
00042
00043
00044 for (unsigned i = 0; i < pop.size(); ++i) {
00045 pop[i]->fitnessReference().setWorth( worths[i]);
00046 }
00047
00048 }
00049
00050
00051 eoFrontSorter<EOT> sorter;
00052
00053 private:
00054
00055 };
00056
00057 #endif