/** -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- ----------------------------------------------------------------------------- eoReplacement.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 _eoReplacement_h #define _eoReplacement_h //----------------------------------------------------------------------------- #include #include #include #include //----------------------------------------------------------------------------- /** eoReplacement: High level strategy for creating a new generation from parents and offspring. This is a combination of eoMerge and eoReduce, so there is an implementation called eoMergeReduce that can be found below @see eoMerge, eoReduce, eoMergeReduce */ template class eoReplacement : public eoBF&, eoPop&, void> {}; /** no replacement */ template class eoNoReplacement : public eoReplacement { public : /// do nothing void operator()(const eoPop&, eoPop&) {} }; /** eoMergeReduce: special 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()(const eoPop& _parents, eoPop& _offspring) { merge(_parents, _offspring); reduce(_offspring, _parents.size()); } 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; }; #endif