/** -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- ----------------------------------------------------------------------------- eoMergeReduce.h (c) Maarten Keijzer, GeNeura Team, 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: todos@geneura.ugr.es, http://geneura.ugr.es */ //----------------------------------------------------------------------------- #ifndef _eoMergeReduce_h #define _eoMergeReduce_h //----------------------------------------------------------------------------- #include #include #include #include #include #include //----------------------------------------------------------------------------- /** Replacement strategies that combine en eoMerge and an eoReduce. @classes: eoMergeReduce, the base (pure abstract) class eoPlusReplacement the ES plus strategy eoCommaReplacement the ES comma strategy */ /** eoMergeReduce: abstract replacement strategy that is just an application of an embedded merge, followed by an embedded reduce */ template class eoMergeReduce : public eoReplacement { public: eoMergeReduce(eoMerge& _merge, eoReduce& _reduce) : merge(_merge), reduce(_reduce) {} void operator()(eoPop& _parents, eoPop& _offspring) { merge(_parents, _offspring); // parents untouched, result in offspring reduce(_offspring, _parents.size()); _parents.swap(_offspring); } private : eoMerge& merge; eoReduce& reduce; }; /** ES type of replacement strategy: first add parents to population, then truncate */ template class eoPlusReplacement : public eoMergeReduce { public : eoPlusReplacement() : eoMergeReduce(plus, truncate) {} private : eoPlus plus; eoTruncate truncate; }; /** ES type of replacement strategy: ignore parents, truncate offspring */ template class eoCommaReplacement : public eoMergeReduce { public : eoCommaReplacement() : eoMergeReduce(no_elite, truncate) {} private : eoNoElitism no_elite; eoTruncate truncate; }; /** EP type of replacement strategy: first add parents to population, then truncate using EP tournament */ template class eoEPReplacement : public eoMergeReduce { public : eoEPReplacement(int _tSize) : eoMergeReduce(plus, truncate), truncate(_tSize) // {truncate.setSize(_tSize);} {} private : eoPlus plus; eoEPReduce truncate; }; #endif