From dd8aa6df377076de71f129de797058d30f9a0748 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 29 Mar 2020 18:32:25 +0200 Subject: [PATCH] add eoAlgoFoundryEA --- eo/src/eo | 1 + eo/src/eoForge.h | 14 ++--- eo/test/t-algo-forged.cpp | 124 ++------------------------------------ 3 files changed, 14 insertions(+), 125 deletions(-) diff --git a/eo/src/eo b/eo/src/eo index 4bb6a69a8..edf9bc79b 100644 --- a/eo/src/eo +++ b/eo/src/eo @@ -159,6 +159,7 @@ #include "eoCounter.h" #include "eoForge.h" +#include "eoAlgoFoundryEA.h" //----------------------------------------------------------------------------- diff --git a/eo/src/eoForge.h b/eo/src/eoForge.h index 02ddb6c8c..952a02586 100644 --- a/eo/src/eoForge.h +++ b/eo/src/eoForge.h @@ -23,20 +23,20 @@ #ifndef _eoForge_H_ #define _eoForge_H_ -#include -#include -#include #include #include +/** + * @defgroup Foundry Tools for automatic algorithms assembling, selection and search. + */ + /** Interface for a "Forge": a class that can defer instanciation of EO's operator. * * This interface only declares an `instanciate` method, * in order to be able to make containers of factories (@see eoForgeOperator). * * @ingroup Core - * @defgroup Forge Wrap and defer operators' instanciations. - * @ingroup Forge + * @ingroup Foundry */ template class eoForgeInterface @@ -63,7 +63,7 @@ class eoForgeInterface eoSelect& select = forge.instanciate(); * @endcode * - * @ingroup Forge + * @ingroup Foundry */ template class eoForgeOperator : public eoForgeInterface @@ -162,7 +162,7 @@ class eoForgeOperator : public eoForgeInterface op(); * @endcode * - * @ingroup Forge + * @ingroup Foundry */ template class eoForgeVector : public std::vector*> diff --git a/eo/test/t-algo-forged.cpp b/eo/test/t-algo-forged.cpp index acee25f99..c0535c89c 100644 --- a/eo/test/t-algo-forged.cpp +++ b/eo/test/t-algo-forged.cpp @@ -5,119 +5,6 @@ #include #include "../../problems/eval/oneMaxEval.h" -template -class eoFoundryEA : public eoAlgo -{ - public: - static const size_t dim = 5; - - protected: - std::array _encoding; - - struct Indices - { - static const size_t continuators = 0; - static const size_t crossovers = 1; - static const size_t mutations = 2; - static const size_t selectors = 3; - static const size_t replacements = 4; - }; - - public: - const Indices index_of; - - eoFoundryEA( eoEvalFunc& eval ) : - index_of(), - _eval(eval) - { - _encoding = { 0 }; // dim * 0 - } - - size_t& at(size_t i) - { - return _encoding.at(i); - } - - void operator=( std::array a) - { - _encoding = a; - } - - eoForgeVector< eoContinue > continuators; - eoForgeVector< eoQuadOp > crossovers; - eoForgeVector< eoMonOp > mutations; - eoForgeVector< eoSelectOne > selectors; - eoForgeVector< eoReplacement > replacements; - - void operator()(eoPop& pop) - { - assert(continuators.size() > 0); assert(_encoding.at(index_of.continuators) < continuators.size()); - assert( crossovers.size() > 0); assert(_encoding.at(index_of.crossovers) < crossovers.size()); - assert( mutations.size() > 0); assert(_encoding.at(index_of.mutations) < mutations.size()); - assert( selectors.size() > 0); assert(_encoding.at(index_of.selectors) < selectors.size()); - assert(replacements.size() > 0); assert(_encoding.at(index_of.replacements) < replacements.size()); - - eoSequentialOp variator; - variator.add(this->crossover(), 1.0); - variator.add(this->mutation(), 1.0); - - eoGeneralBreeder breeder(this->selector(), variator, 1.0); - - eoGenContinue common_cont(100); - eoCombinedContinue gen_cont(common_cont); - gen_cont.add(this->continuator()); - - eoEasyEA algo = eoEasyEA(gen_cont, _eval, breeder, this->replacement()); - - algo(pop); - } - - std::string name() - { - std::ostringstream name; - name << _encoding.at(index_of.continuators) << " (" << this->continuator().className() << ") + "; - name << _encoding.at(index_of.crossovers) << " (" << this->crossover().className() << ") + "; - name << _encoding.at(index_of.mutations) << " (" << this->mutation().className() << ") + "; - name << _encoding.at(index_of.selectors) << " (" << this->selector().className() << ") + "; - name << _encoding.at(index_of.replacements) << " (" << this->replacement().className() << ")"; - return name.str(); - } - - protected: - eoEvalFunc& _eval; - - eoContinue& continuator() - { - assert(_encoding.at(index_of.continuators) < continuators.size()); - return continuators.instanciate(_encoding.at(index_of.continuators)); - } - - eoQuadOp& crossover() - { - assert(_encoding.at(index_of.crossovers) < crossovers.size()); - return crossovers.instanciate(_encoding.at(index_of.crossovers)); - } - - eoMonOp& mutation() - { - assert(_encoding.at(index_of.mutations) < mutations.size()); - return mutations.instanciate(_encoding.at(index_of.mutations)); - } - - eoSelectOne& selector() - { - assert(_encoding.at(index_of.selectors) < selectors.size()); - return selectors.instanciate(_encoding.at(index_of.selectors)); - } - - eoReplacement& replacement() - { - assert(_encoding.at(index_of.replacements) < replacements.size()); - return replacements.instanciate(_encoding.at(index_of.replacements)); - } - -}; - int main(int /*argc*/, char** /*argv*/) { @@ -128,12 +15,13 @@ int main(int /*argc*/, char** /*argv*/) using EOT = eoBit; - oneMaxEval eval; + oneMaxEval evalfunc; + eoPopLoopEval eval(evalfunc); eoBooleanGenerator gen(0.5); eoInitFixedLength init(dim, gen); - eoFoundryEA foundry(eval); + eoAlgoFoundryEA foundry(eval); /***** Continuators ****/ for(size_t i=10; i < 30; i+=10 ) { @@ -143,7 +31,6 @@ int main(int /*argc*/, char** /*argv*/) /***** Crossovers ****/ foundry.crossovers.add< eo1PtBitXover >(); foundry.crossovers.add< eoUBitXover >(0.5); // preference over 1 - for(size_t i=1; i < 11; i+=4) { foundry.crossovers.add< eoNPtsBitXover >(i); // nb of points } @@ -154,6 +41,7 @@ int main(int /*argc*/, char** /*argv*/) foundry.mutations.add< eoDetBitFlip >(i); // mutate k bits } + /***** Selectors *****/ foundry.selectors.add< eoStochTournamentSelect >(0.5); foundry.selectors.add< eoSequentialSelect >(); foundry.selectors.add< eoProportionalSelect >(); @@ -165,10 +53,10 @@ int main(int /*argc*/, char** /*argv*/) foundry.replacements.add< eoCommaReplacement >(); foundry.replacements.add< eoPlusReplacement >(); foundry.replacements.add< eoSSGAWorseReplacement >(); + foundry.replacements.add< eoSSGAStochTournamentReplacement >(0.51); for(size_t i=2; i < 10; i+=4) { foundry.replacements.add< eoSSGADetTournamentReplacement >(i); } - foundry.replacements.add< eoSSGAStochTournamentReplacement >(0.51); size_t n = foundry.continuators.size() * foundry.crossovers.size() * foundry.mutations.size() * foundry.selectors.size() * foundry.replacements.size(); @@ -187,7 +75,7 @@ int main(int /*argc*/, char** /*argv*/) eoPop pop; pop.append(pop_size, init); - apply(eval,pop); + eval(pop,pop); foundry.at(foundry.index_of.continuators) = i_cont; foundry.at(foundry.index_of.crossovers) = i_cross;