diff --git a/edo/application/eda/main.cpp b/edo/application/eda/main.cpp index 07505718..f6ce7b86 100644 --- a/edo/application/eda/main.cpp +++ b/edo/application/eda/main.cpp @@ -161,7 +161,7 @@ int main(int ac, char** av) eoPopLoopEval popEval( eval ); // EDA algorithm configuration - edoAlgo< Distrib >* algo = new edoEDA< Distrib > + edoAlgo< Distrib >* algo = new edoAdaptiveAlgo< Distrib > (popEval, *selector, *estimator, *sampler, *replacor, pop_continue, *distribution_continue ); diff --git a/edo/src/edo b/edo/src/edo index c73dcb0c..70aff6eb 100644 --- a/edo/src/edo +++ b/edo/src/edo @@ -30,7 +30,6 @@ Authors: #include "edoAlgo.h" //#include "edoEDASA.h" -#include "edoEDA.h" #include "edoAdaptiveAlgo.h" #include "edoDistrib.h" diff --git a/edo/src/edoAdaptiveAlgo.h b/edo/src/edoAdaptiveAlgo.h index 03f349a9..2951a871 100644 --- a/edo/src/edoAdaptiveAlgo.h +++ b/edo/src/edoAdaptiveAlgo.h @@ -77,6 +77,7 @@ public: eoContinue< EOType > & pop_continuator, edoContinue< EOD > & distribution_continuator ) : + _dummy_distrib(), _distrib(distrib), _evaluator(evaluator), _selector(selector), @@ -88,6 +89,39 @@ public: _distribution_continuator(distribution_continuator) {} + /*! + Without a distribution + + \param evaluation Evaluate a population + \param selector Selection of the best candidate solutions in the population + \param estimator Estimation of the distribution parameters + \param sampler Generate feasible solutions using the distribution + \param replacor Replace old solutions by new ones + \param pop_continuator Stopping criterion based on the population features + \param distribution_continuator Stopping criterion based on the distribution features + */ + edoAdaptiveAlgo( + eoPopEvalFunc < EOType > & evaluator, + eoSelect< EOType > & selector, + edoEstimator< EOD > & estimator, + edoSampler< EOD > & sampler, + eoReplacement< EOType > & replacor, + eoContinue< EOType > & pop_continuator, + edoContinue< EOD > & distribution_continuator + ) : + _dummy_distrib(), + _distrib( _dummy_distrib ), + _evaluator(evaluator), + _selector(selector), + _estimator(estimator), + _sampler(sampler), + _replacor(replacor), + _pop_continuator(pop_continuator), + _dummy_continue(), + _distribution_continuator(distribution_continuator) + {} + + //! constructor without an edoContinue /*! Takes algo operators, all are mandatory @@ -99,6 +133,38 @@ public: \param replacor Replace old solutions by new ones \param pop_continuator Stopping criterion based on the population features */ + edoAdaptiveAlgo ( + EOD & distrib, + eoPopEvalFunc < EOType > & evaluator, + eoSelect< EOType > & selector, + edoEstimator< EOD > & estimator, + edoSampler< EOD > & sampler, + eoReplacement< EOType > & replacor, + eoContinue< EOType > & pop_continuator + ) : + _dummy_distrib(), + _distrib( distrib ), + _evaluator(evaluator), + _selector(selector), + _estimator(estimator), + _sampler(sampler), + _replacor(replacor), + _pop_continuator(pop_continuator), + _dummy_continue(), + _distribution_continuator( _dummy_continue ) + {} + + //! constructor without an edoContinue nor a distribution + /*! + Takes algo operators, all are mandatory + + \param evaluation Evaluate a population + \param selector Selection of the best candidate solutions in the population + \param estimator Estimation of the distribution parameters + \param sampler Generate feasible solutions using the distribution + \param replacor Replace old solutions by new ones + \param pop_continuator Stopping criterion based on the population features + */ edoAdaptiveAlgo ( eoPopEvalFunc < EOType > & evaluator, eoSelect< EOType > & selector, @@ -107,7 +173,8 @@ public: eoReplacement< EOType > & replacor, eoContinue< EOType > & pop_continuator ) : - _distrib( EOD() ), + _dummy_distrib(), + _distrib( _dummy_distrib ), _evaluator(evaluator), _selector(selector), _estimator(estimator), @@ -120,6 +187,7 @@ public: + /** Covariance Matrix Adaptation Evolution Strategies * * \param pop the population of candidate solutions @@ -169,6 +237,8 @@ public: protected: + EOD _dummy_distrib; + EOD & _distrib; //! A full evaluation function. diff --git a/edo/src/edoEDA.h b/edo/src/edoEDA.h deleted file mode 100644 index 3e02ce64..00000000 --- a/edo/src/edoEDA.h +++ /dev/null @@ -1,195 +0,0 @@ -/* -The Evolving Distribution Objects framework (EDO) is a template-based, -ANSI-C++ evolutionary computation library which helps you to write your -own estimation of distribution algorithms. - -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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Copyright (C) 2010 Thales group -*/ -/* -Authors: - Johann Dréo - Caner Candan -*/ - -#ifndef _edoEDA_h -#define _edoEDA_h - -#include -#include - -#include - -#include "edoAlgo.h" -#include "edoEstimator.h" -#include "edoModifierMass.h" -#include "edoSampler.h" -#include "edoContinue.h" - -//! edoEDA< D > - -template < typename D > -class edoEDA : public edoAlgo< D > -{ -public: - //! Alias for the type EOT - typedef typename D::EOType EOType; - - //! Alias for the atom type - typedef typename EOType::AtomType AtomType; - - //! Alias for the fitness - typedef typename EOType::Fitness Fitness; - -public: - - //! edoEDA constructor - /*! - Takes algo operators, all are mandatory - - \param evaluation Evaluate a population - \param selector Selection of the best candidate solutions in the population - \param estimator Estimation of the distribution parameters - \param sampler Generate feasible solutions using the distribution - \param replacor Replace old solutions by new ones - \param pop_continuator Stopping criterion based on the population features - \param distribution_continuator Stopping criterion based on the distribution features - */ - edoEDA ( - eoPopEvalFunc < EOType > & evaluator, - eoSelect< EOType > & selector, - edoEstimator< D > & estimator, - edoSampler< D > & sampler, - eoReplacement< EOType > & replacor, - eoContinue< EOType > & pop_continuator, - edoContinue< D > & distribution_continuator - ) : - _evaluator(evaluator), - _selector(selector), - _estimator(estimator), - _sampler(sampler), - _replacor(replacor), - _pop_continuator(pop_continuator), - _dummy_continue(), - _distribution_continuator(distribution_continuator) - {} - - //! edoEDA constructor without an edoContinue - /*! - Takes algo operators, all are mandatory - - \param evaluation Evaluate a population - \param selector Selection of the best candidate solutions in the population - \param estimator Estimation of the distribution parameters - \param sampler Generate feasible solutions using the distribution - \param replacor Replace old solutions by new ones - \param pop_continuator Stopping criterion based on the population features - */ - edoEDA ( - eoPopEvalFunc < EOType > & evaluator, - eoSelect< EOType > & selector, - edoEstimator< D > & estimator, - edoSampler< D > & sampler, - eoReplacement< EOType > & replacor, - eoContinue< EOType > & pop_continuator - ) : - _evaluator(evaluator), - _selector(selector), - _estimator(estimator), - _sampler(sampler), - _replacor(replacor), - _pop_continuator(pop_continuator), - _dummy_continue(), - _distribution_continuator( _dummy_continue ) - {} - - - /** A basic EDA algorithm that iterates over: - * selection, estimation, sampling, bounding, evaluation, replacement - * - * \param pop the population of candidate solutions - * \return void - */ - void operator ()(eoPop< EOType > & pop) - { - assert(pop.size() > 0); - - eoPop< EOType > current_pop; - eoPop< EOType > selected_pop; - - // FIXME one must instanciate a first distrib here because there is no empty constructor, see if it is possible to instanciate Distributions without parameters - D distrib = _estimator(pop); - - // Evaluating a first time the candidate solutions - // The first pop is not supposed to be evaluated (@see eoPopLoopEval). - _evaluator( current_pop, pop ); - - do { - // (1) Selection of the best points in the population - //selected_pop.clear(); // FIXME is it necessary to clear? - _selector(pop, selected_pop); - assert( selected_pop.size() > 0 ); - // TODO: utiliser selected_pop ou pop ??? - - // (2) Estimation of the distribution parameters - distrib = _estimator(selected_pop); - - // (3) sampling - // The sampler produces feasible solutions (@see edoSampler that - // encapsulate an edoBounder) - current_pop.clear(); - for( unsigned int i = 0; i < pop.size(); ++i ) { - current_pop.push_back( _sampler(distrib) ); - } - - // (4) Evaluate new solutions - _evaluator( pop, current_pop ); - - // (5) Replace old solutions by new ones - _replacor(pop, current_pop); // e.g. copy current_pop in pop - - } while( _distribution_continuator( distrib ) && _pop_continuator( pop ) ); - } // operator() - -private: - - //! A full evaluation function. - eoPopEvalFunc < EOType > & _evaluator; - - //! A EOType selector - eoSelect < EOType > & _selector; - - //! A EOType estimator. It is going to estimate distribution parameters. - edoEstimator< D > & _estimator; - - //! A D sampler - edoSampler< D > & _sampler; - - //! A EOType replacor - eoReplacement < EOType > & _replacor; - - //! A EOType population continuator - eoContinue < EOType > & _pop_continuator; - - //! A D continuator that always return true - edoDummyContinue _dummy_continue; - - //! A D continuator - edoContinue < D > & _distribution_continuator; - -}; - -#endif // !_edoEDA_h