00001 #ifndef eoNSGA_IIa_Eval_h
00002 #define eoNSGA_IIa_Eval_h
00003
00004 #include <moo/eoFrontSorter.h>
00005 #include <moo/eoMOEval.h>
00006 #include <cassert>
00007
00014 namespace nsga2a {
00015 extern unsigned assign_worths(std::vector<detail::FitnessInfo> front, unsigned rank, std::vector<double>& worths);
00016 }
00017
00018 template <class EOT>
00019 class eoNSGA_IIa_Eval : public eoMOEval<EOT>
00020 {
00021 public:
00022
00023 eoNSGA_IIa_Eval(eoEvalFunc<EOT>& eval) : eoMOEval<EOT>(eval) {}
00024 eoNSGA_IIa_Eval(eoPopEvalFunc<EOT>& eval) : eoMOEval<EOT>(eval) {}
00025
00026
00027 virtual void operator()(eoPop<EOT>& parents, eoPop<EOT>& offspring) {
00028 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) {
00034 pop.push_back(&offspring[i]);
00035 }
00036
00037 typename eoFrontSorter<EOT>::front_t front = sorter(pop);
00038
00039 std::vector<double> worths(pop.size());
00040 unsigned rank = pop.size();
00041 for (unsigned i = 0; i < front.size(); ++i) {
00042 rank = nsga2a::assign_worths(front[i], rank, worths);
00043 }
00044
00045 for (unsigned i = 0; i < worths.size(); ++i) {
00046 typename EOT::Fitness f = pop[i]->fitness();
00047 f.setWorth(worths[i]);
00048 pop[i]->fitness(f);
00049 }
00050 }
00051
00052 private:
00053
00054 eoFrontSorter<EOT> sorter;
00055
00056
00057 };
00058
00059 #endif