diff --git a/eo/src/eo b/eo/src/eo index ca2c49c2..cdab6e9d 100644 --- a/eo/src/eo +++ b/eo/src/eo @@ -60,8 +60,8 @@ // population #include -// Evaluation functions -#include +// Evaluation functions (all include eoEvalFunc.h) +#include #include // Continuators - all include eoContinue.h diff --git a/eo/src/eoEasyEA.h b/eo/src/eoEasyEA.h index c762b8ee..422d90da 100644 --- a/eo/src/eoEasyEA.h +++ b/eo/src/eoEasyEA.h @@ -42,20 +42,47 @@ and any selection transformation, merging and evaluation algorithms; you can even change in runtime parameters of those sub-algorithms + +Change (MS, July 3. 2001): + Replaced the eoEvalFunc by an eoPopEvalFunc: this immediately + allows many useful constructs, such as co-evolution (e.g. game players), + parisian approach (the solution to the problem is the whole population) + or simple distribution of evaluations on a cluster. + In case an eoEvalFunc is passed, it is embedded on an eoPopLoopEval + This makes things a little uglier (required an additional "dummy" member + +Note: it looks ugly only because we wanted to authorize many different + constructors. Please only look at the operator() and there shall be light */ template class eoEasyEA: public eoAlgo { public: - /// Ctor taking a breed and merge. + /** Ctor taking a breed and merge */ eoEasyEA( eoContinue& _continuator, eoEvalFunc& _eval, eoBreed& _breed, eoReplacement& _replace ) : continuator(_continuator), - eval(_eval), + loopEval(_eval), + popEval(loopEval), + selectTransform(dummySelect, dummyTransform), + breed(_breed), + mergeReduce(dummyMerge, dummyReduce), + replace(_replace) + {} + + /** NEW Ctor taking a breed and merge and an eoPopEval */ + eoEasyEA( + eoContinue& _continuator, + eoPopEvalFunc& _eval, + eoBreed& _breed, + eoReplacement& _replace + ) : continuator(_continuator), + loopEval(dummyEval), + popEval(_eval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), @@ -70,7 +97,8 @@ template class eoEasyEA: public eoAlgo eoMerge& _merge, eoReduce& _reduce ) : continuator(_continuator), - eval(_eval), + loopEval(_eval), + popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(_merge, _reduce), @@ -85,7 +113,8 @@ template class eoEasyEA: public eoAlgo eoTransform& _transform, eoReplacement& _replace ) : continuator(_continuator), - eval(_eval), + loopEval(_eval), + popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(dummyMerge, dummyReduce), @@ -101,7 +130,8 @@ template class eoEasyEA: public eoAlgo eoMerge& _merge, eoReduce& _reduce ) : continuator(_continuator), - eval(_eval), + loopEval(_eval), + popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(_merge, _reduce), @@ -125,7 +155,7 @@ template class eoEasyEA: public eoAlgo breed(_pop, offspring); - apply(eval, offspring); + popEval(_pop, offspring); // eval of parents + offspring if necessary replace(_pop, offspring); // after replace, the new pop. is in _pop @@ -154,9 +184,13 @@ template class eoEasyEA: public eoAlgo class eoDummyTransform : public eoTransform { public : void operator()(eoPop&) {} } dummyTransform; + class eoDummyEval : public eoEvalFunc + {public: void operator()(EOT &) {} } dummyEval; eoContinue& continuator; - eoEvalFunc& eval; + + eoPopLoopEval loopEval; + eoPopEvalFunc& popEval; eoSelectTransform selectTransform; eoBreed& breed; diff --git a/eo/src/eoPopEvalFunc.h b/eo/src/eoPopEvalFunc.h new file mode 100644 index 00000000..e825b834 --- /dev/null +++ b/eo/src/eoPopEvalFunc.h @@ -0,0 +1,100 @@ +/** -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +----------------------------------------------------------------------------- + eoPopEvalFunc.h + Abstract class for global evaluation of the population + + (c) 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 eoPopEvalFunc_H +#define eoPopEvalFunc_H + +#include + +/** eoPopEvalFunc: This abstract class is for GLOBAL evaluators + * of a population after variation. + * It takes 2 populations (typically the parents and the offspring) + * and is suppposed to evaluate them alltogether + * + * Basic use: apply an embedded eoEvalFunc to the offspring + * + * Time-varying fitness: apply the embedded eoEvalFunc to both + * offspring and parents + * + * Advanced uses: Co-evolution or "parisian" approach, or ... + * + * Basic parallelization (synchronous standard evolution engine): + * call the slaves and wait for the results + */ +template +class eoPopEvalFunc : public eoBF & , eoPop &, void> +{}; + +///////////////////////////////////////////////////////////// +// eoPopLoopEval +///////////////////////////////////////////////////////////// + +/** eoPopLoopEval: an instance of eoPopEvalFunc that simply applies + * a private eoEvalFunc to all offspring + */ +template +class eoPopLoopEval : public eoPopEvalFunc { +public: + /** Ctor: set value of embedded eoEvalFunc */ + eoPopLoopEval(eoEvalFunc & _eval) : eval(_eval) {} + + /** Do the job: simple loop over the offspring */ + void operator()(eoPop & _parents, eoPop & _offspring) + { + apply(eval, _offspring); + } + +private: + eoEvalFunc & eval; +}; + +///////////////////////////////////////////////////////////// +// eoTimeVaryingLoopEval +///////////////////////////////////////////////////////////// + +/** eoPopLoopEval: an instance of eoPopEvalFunc that simply applies + * a private eoEvalFunc to all offspring AND ALL PARENTS + * as the fitness is supposed here to vary + */ +template +class eoTimeVaryingLoopEval : public eoPopEvalFunc { +public: + /** Ctor: set value of embedded eoEvalFunc */ + eoTimeVaryingLoopEval(eoEvalFunc & _eval) : eval(_eval) {} + + /** Do the job: simple loop over the offspring */ + void operator()(eoPop & _parents, eoPop & _offspring) + { + apply(eval, _parents); + apply(eval, _offspring); + } + +private: + eoEvalFunc & eval; +}; + +#endif +