diff --git a/branches/paradiseo-moeo-1.0/src/MOEO.h b/branches/paradiseo-moeo-1.0/src/MOEO.h index a191aa929..c05ae9df5 100644 --- a/branches/paradiseo-moeo-1.0/src/MOEO.h +++ b/branches/paradiseo-moeo-1.0/src/MOEO.h @@ -115,7 +115,7 @@ public: { if ( invalidFitness() ) { - throw std::runtime_error("invalid fitness"); + // throw std::runtime_error("invalid fitness"); } return fitnessValue; } @@ -157,7 +157,7 @@ public: { if ( invalidDiversity() ) { - throw std::runtime_error("invalid diversity"); + // throw std::runtime_error("invalid diversity"); } return diversityValue; } diff --git a/branches/paradiseo-moeo-1.0/src/do/make_algo.h b/branches/paradiseo-moeo-1.0/src/do/make_algo.h index d21b3af9a..64973ae9c 100644 --- a/branches/paradiseo-moeo-1.0/src/do/make_algo.h +++ b/branches/paradiseo-moeo-1.0/src/do/make_algo.h @@ -29,11 +29,14 @@ #include #include #include +#include #include #include #include #include #include +#include +#include /** * ... @@ -49,12 +52,21 @@ eoAlgo < MOEOT > & do_make_algo(eoParser & _parser, eoState & _state, eoEvalFunc /* the fitness assignment strategy */ string & fitnessParam = _parser.createParam(string("FastNonDominatedSorting"), "fitness", - "Fitness assignment strategy parameter: FastNonDominatedSorting, ...", 'F', "Evolution Engine").value(); + "Fitness assignment strategy parameter: FastNonDominatedSorting, IndicatorBased...", 'F', "Evolution Engine").value(); moeoFitnessAssignment < MOEOT > * fitnessAssignment; if (fitnessParam == string("FastNonDominatedSorting")) { fitnessAssignment = new moeoFastNonDominatedSortingFitnessAssignment < MOEOT> (); } + /****************************************************************************************************************************/ + else if (fitnessParam == string("IndicatorBased")) + { + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + moeoAdditiveEpsilonBinaryMetric < ObjectiveVector > * e = new moeoAdditiveEpsilonBinaryMetric < ObjectiveVector >; + moeoVectorVsSolutionBinaryMetric < ObjectiveVector, double > * metric = new moeoExponentialVectorVsSolutionBinaryMetric < ObjectiveVector> (e,0.001); + fitnessAssignment = new moeoIndicatorBasedFitnessAssignment < MOEOT> (metric); + } + /****************************************************************************************************************************/ else { string stmp = string("Invalid fitness assignment strategy: ") + fitnessParam; diff --git a/branches/paradiseo-moeo-1.0/src/metric/moeoAdditiveEpsilonBinaryMetric.h b/branches/paradiseo-moeo-1.0/src/metric/moeoAdditiveEpsilonBinaryMetric.h deleted file mode 100644 index 2045ac701..000000000 --- a/branches/paradiseo-moeo-1.0/src/metric/moeoAdditiveEpsilonBinaryMetric.h +++ /dev/null @@ -1,84 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// moeoAdditiveEpsilonBinaryMetric.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MOEOADDITIVEEPSILONBINARYMETRIC_H_ -#define MOEOADDITIVEEPSILONBINARYMETRIC_H_ - -#include - -/** - * Additive epsilon binary metric allowing to compare two objective vectors as proposed in - * Zitzler E., Thiele L., Laumanns M., Fonseca C. M., Grunert da Fonseca V.: - * Performance Assessment of Multiobjective Optimizers: An Analysis and Review. IEEE Transactions on Evolutionary Computation 7(2), pp.117–132 (2003). - */ -template < class ObjectiveVector > -class moeoAdditiveEpsilonBinaryMetric : public moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > -{ -public: - - /** - * Returns the maximum epsilon value by which the objective vector _o1 must be translated in all objectives - * so that it weakly dominates the objective vector _o2 - * @warning don't forget to set the bounds for every objective before the call of this function - * @param _o1 the first objective vector - * @param _o2 the second objective vector - */ - double operator()(const ObjectiveVector & _o1, const ObjectiveVector & _o2) - { - // computation of the epsilon value for the first objective - double result = epsilon(_o1, _o2, 0); - // computation of the epsilon value for the other objectives - double tmp; - for (unsigned i=1; i :: bounds; - - - /** - * Returns the epsilon value by which the objective vector _o1 must be translated in the objective _obj - * so that it dominates the objective vector _o2 - * @param _o1 the first objective vector - * @param _o2 the second objective vector - * @param _obj the index of the objective - */ - double epsilon(const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned _obj) - { - double result; - // if the objective _obj have to be minimized - if (ObjectiveVector::Traits::minimizing(_obj)) - { - // _o1[_obj] - _o2[_obj] - result = ( (_o1[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ) - ( (_o2[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ); - } - // if the objective _obj have to be maximized - else - { - // _o2[_obj] - _o1[_obj] - result = ( (_o2[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ) - ( (_o1[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ); - } - return result; - } - -}; - -#endif /*MOEOADDITIVEEPSILONBINARYMETRIC_H_*/ diff --git a/branches/paradiseo-moeo-1.0/src/metric/moeoHypervolumeBinaryMetric.h b/branches/paradiseo-moeo-1.0/src/metric/moeoHypervolumeBinaryMetric.h deleted file mode 100644 index d0d01fb34..000000000 --- a/branches/paradiseo-moeo-1.0/src/metric/moeoHypervolumeBinaryMetric.h +++ /dev/null @@ -1,139 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// moeoHypervolumeBinaryMetric.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MOEOHYPERVOLUMEBINARYMETRIC_H_ -#define MOEOHYPERVOLUMEBINARYMETRIC_H_ - -#include -#include - -/** - * Hypervolume binary metric allowing to compare two objective vectors as proposed in - * Zitzler E., Künzli S.: Indicator-Based Selection in Multiobjective Search. In Parallel Problem Solving from Nature (PPSN VIII). - * Lecture Notes in Computer Science 3242, Springer, Birmingham, UK pp.832–842 (2004). - * This indicator is based on the hypervolume concept introduced in - * Zitzler, E., Thiele, L.: Multiobjective Optimization Using Evolutionary Algorithms - A Comparative Case Study. - * Parallel Problem Solving from Nature (PPSN-V), pp.292-301 (1998). - */ -template < class ObjectiveVector > -class moeoHypervolumeBinaryMetric : public moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > -{ -public: - - /** - * Ctor - * @param _rho value used to compute the reference point from the worst values for each objective (default : 1.1) - */ - moeoHypervolumeBinaryMetric(double _rho = 1.1) : rho(_rho) - { - // not-a-maximization problem check - for (unsigned i=0; i :: bounds; - /** Functor to compare two objective vectors according to Pareto dominance relation */ - moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator; - - /** - * Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho for the objective _obj. - * @param _o1 the first objective vector - * @param _o2 the second objective vector - * @param _obj the objective index - * @param _flag used for iteration, if _flag=true _o2 is not talen into account (default : false) - */ - double hypervolume(const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned _obj, const bool _flag = false) - { - double result; - double range = rho * bounds[_obj].range(); - double max = bounds[_obj].minimum() + range; - // value of _1 for the objective _obj - double v1 = _o1[_obj]; - // value of _2 for the objective _obj (if _flag=true, v2=max) - double v2; - if (_flag) - { - v2 = max; - } - else - { - v2 = _o2[_obj]; - } - // computation of the volume - if (_obj == 0) - { - if (v1 < v2) - { - result = (v2 - v1) / range; - } - else - { - result = 0; - } - } - else - { - if (v1 < v2) - { - result = ( hypervolume(_o1, _o2, _obj-1, true) * (v2 - v1) / range ) + ( hypervolume(_o1, _o2, _obj-1) * (max - v2) / range ); - } - else - { - result = hypervolume(_o1, _o2, _obj-1) * (max - v2) / range; - } - } - return result; - } - -}; - -#endif /*MOEOHYPERVOLUMEBINARYMETRIC_H_*/ diff --git a/branches/paradiseo-moeo-1.0/src/moeoConvertPopToObjectiveVectors.h b/branches/paradiseo-moeo-1.0/src/moeoConvertPopToObjectiveVectors.h new file mode 100644 index 000000000..2a933dfc0 --- /dev/null +++ b/branches/paradiseo-moeo-1.0/src/moeoConvertPopToObjectiveVectors.h @@ -0,0 +1,42 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoConvertPopToObjectiveVectors.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOPOPTOOBJECTIVEVECTORS_H_ +#define MOEOPOPTOOBJECTIVEVECTORS_H_ + +#include + +/** + * Functor allowing to get a vector of objective vectors from a population + */ +template < class MOEOT, class ObjectiveVector = typename MOEOT::ObjectiveVector > +class moeoConvertPopToObjectiveVectors : public eoUF < const eoPop < MOEOT >, const std::vector < ObjectiveVector > > +{ +public: + + /** + * Returns a vector of the objective vectors from the population _pop + * @param _pop the population + */ + const std::vector < ObjectiveVector > operator()(const eoPop < MOEOT > _pop) + { + std::vector < ObjectiveVector > result; + result.resize(_pop.size()); + for (unsigned i=0; i<_pop.size(); i++) + { + result.push_back(_pop[i].objectiveVector()); + } + return result; + } +}; + +#endif /*MOEOPOPTOOBJECTIVEVECTORS_H_*/ diff --git a/branches/paradiseo-moeo-1.0/src/moeoDetTournamentSelect.h b/branches/paradiseo-moeo-1.0/src/moeoDetTournamentSelect.h index 36e33a974..54e82e189 100644 --- a/branches/paradiseo-moeo-1.0/src/moeoDetTournamentSelect.h +++ b/branches/paradiseo-moeo-1.0/src/moeoDetTournamentSelect.h @@ -13,6 +13,9 @@ #ifndef MOEODETTOURNAMENTSELECT_H_ #define MOEODETTOURNAMENTSELECT_H_ +#include +#include +#include #include #include @@ -20,7 +23,7 @@ * Selection strategy that selects ONE individual by deterministic tournament. */ template < class MOEOT > - class moeoDetTournamentSelect:public moeoSelectOne + class moeoDetTournamentSelect : public moeoSelectOne { public: @@ -31,7 +34,7 @@ public: * @param _comparator the comparator (used to compare 2 individuals) * @param _tSize the number of individuals in the tournament (default: 2) */ - moeoDetTournamentSelect (moeoFitnessAssignment < MOEOT > & _evalFitness, moeoDiversityAssignment < MOEOT > & _evalDiversity, moeoComparator < MOEOT > & _comparator, unsigned _tSize = 2) : + moeoDetTournamentSelect(moeoFitnessAssignment < MOEOT > & _evalFitness, moeoDiversityAssignment < MOEOT > & _evalDiversity, moeoComparator < MOEOT > & _comparator, unsigned _tSize = 2) : evalFitness (_evalFitness), evalDiversity (_evalDiversity), comparator (_comparator), tSize (_tSize) { // consistency check @@ -41,7 +44,7 @@ public: tSize = 2; } } - + /** * Ctor without comparator. A moeoFitnessThenDiversityComparator is used as default. @@ -49,7 +52,7 @@ public: * @param _evalDiversity the diversity assignment strategy * @param _tSize the number of individuals in the tournament (default: 2) */ - moeoDetTournamentSelect (moeoFitnessAssignment < MOEOT > &_evalFitness, moeoDiversityAssignment < MOEOT > &_evalDiversity, unsigned _tSize = 2) : + moeoDetTournamentSelect (moeoFitnessAssignment < MOEOT > & _evalFitness, moeoDiversityAssignment < MOEOT > & _evalDiversity, unsigned _tSize = 2) : evalFitness (_evalFitness),evalDiversity(_evalDiversity),tSize(_tSize) { // a moeoFitThenDivComparator is used as default @@ -113,12 +116,13 @@ public: * Evaluate the fitness and the diversity of each individual of the population _pop. * @param _pop the population */ - void setup (eoPop& _pop) + //void setup (eoPop& _pop) + virtual void setup(const eoPop& _pop) { // eval fitness - evalFitness(_pop); + //evalFitness(_pop); // eval diversity - evalDiversity(_pop); + //evalDiversity(_pop); } @@ -126,7 +130,7 @@ public: * Apply the tournament to the given population * @param _pop the population */ - const MOEOT & operator () (const eoPop < MOEOT > &_pop) + const MOEOT & operator () (const eoPop < MOEOT > &_pop) { // use the selector return mo_deterministic_tournament(_pop,tSize,comparator); diff --git a/branches/paradiseo-moeo-1.0/src/moeoDiversityAssignment.h b/branches/paradiseo-moeo-1.0/src/moeoDiversityAssignment.h index 57f9577d1..de9128902 100644 --- a/branches/paradiseo-moeo-1.0/src/moeoDiversityAssignment.h +++ b/branches/paradiseo-moeo-1.0/src/moeoDiversityAssignment.h @@ -25,7 +25,7 @@ class moeoDiversityAssignment : public eoUF < eoPop < MOEOT > &, void > /** - * moeoDummyDiversityAssignment is a moeoDiversityAssignment that gives the value '0' as the individual's diversity for a whole population. + * moeoDummyDiversityAssignment is a moeoDiversityAssignment that gives the value '0' as the individual's diversity for a whole population if it is invalid. */ template < class MOEOT > class moeoDummyDiversityAssignment : public moeoDiversityAssignment < MOEOT > @@ -33,15 +33,18 @@ class moeoDummyDiversityAssignment : public moeoDiversityAssignment < MOEOT > public: /** - * Sets the diversity to '0' for every individuals of the population _pop + * Sets the diversity to '0' for every individuals of the population _pop if it is invalid * @param _pop the population */ void operator () (eoPop < MOEOT > & _pop) { for (unsigned idx = 0; idx<_pop.size (); idx++) { - // set the diversity to 0 - _pop[idx].diversity(0); + if (_pop[idx].invalidDiversity()) + { + // set the diversity to 0 + _pop[idx].diversity(0.0); + } } } diff --git a/branches/paradiseo-moeo-1.0/src/moeoElitistReplacement.h b/branches/paradiseo-moeo-1.0/src/moeoElitistReplacement.h index b1117a1bb..cb9aaa9be 100644 --- a/branches/paradiseo-moeo-1.0/src/moeoElitistReplacement.h +++ b/branches/paradiseo-moeo-1.0/src/moeoElitistReplacement.h @@ -93,7 +93,12 @@ public: evalFitness (_parents); evalDiversity (_parents); // sorts the whole population according to the comparator - std::sort (_parents.begin (), _parents.end (), comparator); + + /*************************************************************************/ + moeoFitnessThenDiversityComparator < MOEOT > comp; + std::sort (_parents.begin (), _parents.end (), comp); + /*************************************************************************/ + // finally, resize this global population _parents.resize (sz); // and clear the offspring population diff --git a/branches/paradiseo-moeo-1.0/src/moeoIndicatorBasedFitnessAssignment.h b/branches/paradiseo-moeo-1.0/src/moeoIndicatorBasedFitnessAssignment.h new file mode 100644 index 000000000..82f6e76f3 --- /dev/null +++ b/branches/paradiseo-moeo-1.0/src/moeoIndicatorBasedFitnessAssignment.h @@ -0,0 +1,76 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoIndicatorBasedFitnessAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOINDICATORBASEDFITNESSASSIGNMENT_H_ +#define MOEOINDICATORBASEDFITNESSASSIGNMENT_H_ + +#include +#include +#include +#include +#include + +/** + * + */ +template < class MOEOT > +class moeoIndicatorBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > +{ +public: + + /** The type of objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Default ctor + * @param ... + */ + moeoIndicatorBasedFitnessAssignment(moeoVectorVsSolutionBinaryMetric < ObjectiveVector, double > * _metric) : metric(_metric) + {} + + + /** + * Ctor + * @param ... + */ + moeoIndicatorBasedFitnessAssignment(moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > * _solutionVsSolutionMetric, const double _kappa)// : metric(moeoExponentialVectorVsSolutionBinaryMetric < ObjectiveVector > (_solutionVsSolutionMetric, _kappa)) + { + metric = new moeoExponentialVectorVsSolutionBinaryMetric < ObjectiveVector > (_solutionVsSolutionMetric, _kappa); + } + + + /** + * + */ + void operator()(eoPop < MOEOT > & _pop) + { + eoPop < MOEOT > tmp_pop; + moeoConvertPopToObjectiveVectors < MOEOT > convertor; + for (unsigned i=0; i<_pop.size() ; i++) + { + tmp_pop.clear(); + tmp_pop = _pop; + tmp_pop.erase(tmp_pop.begin() + i); + _pop[i].fitness((*metric) (convertor(tmp_pop), _pop[i].objectiveVector())); + } + } + + + + +private: + moeoVectorVsSolutionBinaryMetric < ObjectiveVector, double > * metric; + +}; + +#endif /*MOEOINDICATORBASEDFITNESSASSIGNMENT_H_*/