# eoMGGReplacement.h

    00001
    00024 //-----------------------------------------------------------------------------
    00025
    00026 #ifndef _eoMGGReplacement_h
    00027 #define _eoMGGReplacement_h
    00028
    00029
    00030 //-----------------------------------------------------------------------------
    00031 #include <eoPop.h>
    00032 #include <eoFunctor.h>
    00033 #include <eoMerge.h>
    00034 #include <eoReduce.h>
    00035 #include <utils/eoHowMany.h>
    00036 #include <eoReduceSplit.h>
    00037 //-----------------------------------------------------------------------------
    00038
    00049 template <class EOT>
    00050 class eoMGGReplacement : public eoReplacement<EOT>
    00051 {
    00052 public:
    00053   eoMGGReplacement(eoHowMany _howManyEliminatedParents = eoHowMany(2, false),
    00054                    unsigned _tSize=2) :
    00055     // split truncates the parents and returns eliminated parents
    00056     split(_howManyEliminatedParents, true),
    00057     tSize(_tSize)
    00058   {
    00059     if (tSize < 2)
    00060       {
    00061         std::cout << "Warning, Size for eoDetTournamentTruncateSplit adjusted to 2\n";
    00062         tSize = 2;
    00063       }
    00064   }
    00065
    00066     void operator()(eoPop<EOT> & _parents, eoPop<EOT> & _offspring)
    00067     {
    00068       eoPop<EOT> temp;
    00069       split(_parents, temp);
    00070       unsigned toKeep = temp.size(); // how many to keep from merged populations
    00071       // minimal check
    00072       if (toKeep < 2)
    00073         throw std::runtime_error("Not enough parents killed in eoMGGReplacement");
    00074
    00075       // select best offspring
    00076       typename eoPop<EOT>::iterator it = _offspring.it_best_element();
    00077       // add to parents
    00078       _parents.push_back(*it);
    00079       // remove from offspring
    00080       _offspring.erase(it);
    00081
    00082       // merge temp into offspring
    00083       plus(temp, _offspring);
    00084
    00085       // repeatedly add selected offspring to parents
    00086       for (unsigned i=0; i<toKeep-1; i++)
    00087         {
    00088           // select
    00089           it = deterministic_tournament(_offspring.begin(), _offspring.end(), tSize);
    00090           // add to parents
    00091           _parents.push_back(*it);
    00092           // remove from offspring
    00093           _offspring.erase(it);
    00094         }
    00095     }
    00096
    00097 private:
    00098   eoLinearTruncateSplit<EOT> split; // few parents to truncate -> linear
    00099   eoPlus<EOT> plus;
    00100   unsigned int tSize;
    00101 };
    00102
    00103 #endif