diff --git a/branches/paradiseo-moeo-1.0/src/diversity/moeoCrowdingDistanceDiversityAssignment.h b/branches/paradiseo-moeo-1.0/src/diversity/moeoCrowdingDistanceDiversityAssignment.h new file mode 100755 index 000000000..bece3da4f --- /dev/null +++ b/branches/paradiseo-moeo-1.0/src/diversity/moeoCrowdingDistanceDiversityAssignment.h @@ -0,0 +1,122 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoCrowdingDistanceDiversityAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_ +#define MOEOCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_ + +#include +#include +#include + +/** + * Diversity assignment sheme based on crowding distance proposed in: + * K. Deb, A. Pratap, S. Agarwal, T. Meyarivan, "A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II", IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). + */ +template < class MOEOT > +class moeoCrowdingDistanceDiversityAssignment : public moeoDiversityAssignment < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Returns a big value (regarded as infinite) + */ + double inf() const + { + return std::numeric_limits::max(); + } + + + /** + * Returns a very small value that can be used to avoid extreme cases (where the min bound == the max bound) + */ + double tiny() const + { + return 1e-6; + } + + + /** + * Computes diversity values for every solution contained in the population _pop + * @param _pop the population + */ + void operator()(eoPop < MOEOT > & _pop) + { + if (_pop.size() <= 2) + { + for (unsigned int i=0; i<_pop.size(); i++) + { + _pop[i].diversity(inf()); + } + } + else + { + setDistances(_pop); + } + } + + + /** + * @warning NOT IMPLEMENTED, DO NOTHING ! + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + * @warning NOT IMPLEMENTED, DO NOTHING ! + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + std::cout << "WARNING : updateByDeleting not implemented in moeoCrowdingDiversityAssignment" << std::endl; + } + + +protected: + + /** + * Sets the distance values + * @param _pop the population + */ + virtual void setDistances (eoPop < MOEOT > & _pop) + { + double min, max, distance; + unsigned int nObjectives = MOEOT::ObjectiveVector::nObjectives(); + // set diversity to 0 + for (unsigned int i=0; i<_pop.size(); i++) + { + _pop[i].diversity(0); + } + // for each objective + for (unsigned int obj=0; obj objComp(obj); + // sort + std::sort(_pop.begin(), _pop.end(), objComp); + // min & max + min = _pop[0].objectiveVector()[obj]; + max = _pop[_pop.size()-1].objectiveVector()[obj]; + // set the diversity value to infiny for min and max + _pop[0].diversity(inf()); + _pop[_pop.size()-1].diversity(inf()); + for (unsigned int i=1; i<_pop.size()-1; i++) + { + distance = (_pop[i+1].objectiveVector()[obj] - _pop[i-1].objectiveVector()[obj]) / (max-min); + _pop[i].diversity(_pop[i].diversity() + distance); + } + } + } + +}; + +#endif /*MOEOCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_*/ diff --git a/branches/paradiseo-moeo-1.0/src/diversity/moeoDiversityAssignment.h b/branches/paradiseo-moeo-1.0/src/diversity/moeoDiversityAssignment.h new file mode 100644 index 000000000..05151be7a --- /dev/null +++ b/branches/paradiseo-moeo-1.0/src/diversity/moeoDiversityAssignment.h @@ -0,0 +1,51 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoDiversityAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEODIVERSITYASSIGNMENT_H_ +#define MOEODIVERSITYASSIGNMENT_H_ + +#include +#include + +/** + * Functor that sets the diversity values of a whole population. + */ +template < class MOEOT > +class moeoDiversityAssignment : public eoUF < eoPop < MOEOT > &, void > +{ +public: + + /** The type for objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + */ + virtual void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) = 0; + + + /** + * Updates the diversity values of the whole population _pop by taking the deletion of the individual _moeo into account. + * @param _pop the population + * @param _moeo the individual + */ + void updateByDeleting(eoPop < MOEOT > & _pop, MOEOT & _moeo) + { + updateByDeleting(_pop, _moeo.objectiveVector()); + } + +}; + +#endif /*MOEODIVERSITYASSIGNMENT_H_*/ diff --git a/branches/paradiseo-moeo-1.0/src/diversity/moeoDummyDiversityAssignment.h b/branches/paradiseo-moeo-1.0/src/diversity/moeoDummyDiversityAssignment.h new file mode 100644 index 000000000..b7305801c --- /dev/null +++ b/branches/paradiseo-moeo-1.0/src/diversity/moeoDummyDiversityAssignment.h @@ -0,0 +1,59 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoDummyDiversityAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEODUMMYDIVERSITYASSIGNMENT_H_ +#define MOEODUMMYDIVERSITYASSIGNMENT_H_ + +#include + +/** + * 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 > +{ +public: + + /** The type for objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * 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 int idx = 0; idx<_pop.size (); idx++) + { + if (_pop[idx].invalidDiversity()) + { + // set the diversity to 0 + _pop[idx].diversity(0.0); + } + } + } + + + /** + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + // nothing to do... ;-) + } + +}; + +#endif /*MOEODUMMYDIVERSITYASSIGNMENT_H_*/ diff --git a/branches/paradiseo-moeo-1.0/src/diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h b/branches/paradiseo-moeo-1.0/src/diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h new file mode 100644 index 000000000..b4d35ac6e --- /dev/null +++ b/branches/paradiseo-moeo-1.0/src/diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h @@ -0,0 +1,133 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoFrontByFrontCrowdingDistanceDiversityAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_ +#define MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_ + +#include +#include + +/** + * Diversity assignment sheme based on crowding distance proposed in: + * K. Deb, A. Pratap, S. Agarwal, T. Meyarivan, "A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II", IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). + * Tis strategy assigns diversity values FRONT BY FRONT. It is, for instance, used in NSGA-II. + */ +template < class MOEOT > +class moeoFrontByFrontCrowdingDistanceDiversityAssignment : public moeoCrowdingDistanceDiversityAssignment < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * @warning NOT IMPLEMENTED, DO NOTHING ! + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + * @warning NOT IMPLEMENTED, DO NOTHING ! + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + std::cout << "WARNING : updateByDeleting not implemented in moeoFrontByFrontCrowdingDistanceDiversityAssignment" << std::endl; + } + + +private: + + using moeoCrowdingDistanceDiversityAssignment < MOEOT >::inf; + using moeoCrowdingDistanceDiversityAssignment < MOEOT >::tiny; + + /** + * Sets the distance values + * @param _pop the population + */ + void setDistances (eoPop < MOEOT > & _pop) + { + unsigned int a,b; + double min, max, distance; + unsigned int nObjectives = MOEOT::ObjectiveVector::nObjectives(); + // set diversity to 0 for every individual + for (unsigned int i=0; i<_pop.size(); i++) + { + _pop[i].diversity(0.0); + } + // sort the whole pop according to fitness values + moeoFitnessThenDiversityComparator < MOEOT > fitnessComparator; + std::sort(_pop.begin(), _pop.end(), fitnessComparator); + // compute the crowding distance values for every individual "front" by "front" (front : from a to b) + a = 0; // the front starts at a + while (a < _pop.size()) + { + b = lastIndex(_pop,a); // the front ends at b + // if there is less than 2 individuals in the front... + if ((b-a) < 2) + { + for (unsigned int i=a; i<=b; i++) + { + _pop[i].diversity(inf()); + } + } + // else... + else + { + // for each objective + for (unsigned int obj=0; obj objComp(obj); + std::sort(_pop.begin()+a, _pop.begin()+b+1, objComp); + // min & max + min = _pop[b].objectiveVector()[obj]; + max = _pop[a].objectiveVector()[obj]; + // avoid extreme case + if (min == max) + { + min -= tiny(); + max += tiny(); + } + // set the diversity value to infiny for min and max + _pop[a].diversity(inf()); + _pop[b].diversity(inf()); + // set the diversity values for the other individuals + for (unsigned int i=a+1; i & _pop, unsigned int _start) + { + unsigned int i=_start; + while ( (i<_pop.size()-1) && (_pop[i].fitness()==_pop[i+1].fitness()) ) + { + i++; + } + return i; + } + +}; + +#endif /*MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_*/ diff --git a/branches/paradiseo-moeo-1.0/src/diversity/moeoFrontByFrontSharingDiversityAssignment.h b/branches/paradiseo-moeo-1.0/src/diversity/moeoFrontByFrontSharingDiversityAssignment.h new file mode 100644 index 000000000..dea3b342d --- /dev/null +++ b/branches/paradiseo-moeo-1.0/src/diversity/moeoFrontByFrontSharingDiversityAssignment.h @@ -0,0 +1,106 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoFrontByFrontSharingDiversityAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOFRONTBYFRONTSHARINGDIVERSITYASSIGNMENT_H_ +#define MOEOFRONTBYFRONTSHARINGDIVERSITYASSIGNMENT_H_ + +#include + +/** + * Sharing assignment scheme on the way it is used in NSGA. + */ +template < class MOEOT > +class moeoFrontByFrontSharingDiversityAssignment : public moeoSharingDiversityAssignment < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Ctor + * @param _distance the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space) + * @param _nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed) + * @param _alpha parameter used to regulate the shape of the sharing function + */ + moeoFrontByFrontSharingDiversityAssignment(moeoDistance & _distance, double _nicheSize = 0.5, double _alpha = 2.0) : moeoSharingDiversityAssignment < MOEOT >(_distance, _nicheSize, _alpha) + {} + + + /** + * Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default + * @param _nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed) + * @param _alpha parameter used to regulate the shape of the sharing function + */ + moeoFrontByFrontSharingDiversityAssignment(double _nicheSize = 0.5, double _alpha = 2.0) : moeoSharingDiversityAssignment < MOEOT >(_nicheSize, _alpha) + {} + + + /** + * @warning NOT IMPLEMENTED, DO NOTHING ! + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + * @warning NOT IMPLEMENTED, DO NOTHING ! + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + std::cout << "WARNING : updateByDeleting not implemented in moeoSharingDiversityAssignment" << std::endl; + } + + +private: + + using moeoSharingDiversityAssignment < MOEOT >::distance; + using moeoSharingDiversityAssignment < MOEOT >::nicheSize; + using moeoSharingDiversityAssignment < MOEOT >::sh; + using moeoSharingDiversityAssignment < MOEOT >::operator(); + + + /** + * Sets similarities FRONT BY FRONT for every solution contained in the population _pop + * @param _pop the population + */ + void setSimilarities(eoPop < MOEOT > & _pop) + { + // compute distances between every individuals + moeoDistanceMatrix < MOEOT , double > dMatrix (_pop.size(), distance); + dMatrix(_pop); + // sets the distance to bigger than the niche size for every couple of solutions that do not belong to the same front + for (unsigned int i=0; i<_pop.size(); i++) + { + for (unsigned int j=0; j +#include +#include +#include +#include +#include + +/** + * Sharing assignment scheme originally porposed by: + * D. E. Goldberg, "Genetic Algorithms in Search, Optimization and Machine Learning", Addision-Wesley, MA, USA (1989). + */ +template < class MOEOT > +class moeoSharingDiversityAssignment : public moeoDiversityAssignment < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Ctor + * @param _distance the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space) + * @param _nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed) + * @param _alpha parameter used to regulate the shape of the sharing function + */ + moeoSharingDiversityAssignment(moeoDistance & _distance, double _nicheSize = 0.5, double _alpha = 1.0) : distance(_distance), nicheSize(_nicheSize), alpha(_alpha) + {} + + + /** + * Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default + * @param _nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed) + * @param _alpha parameter used to regulate the shape of the sharing function + */ + moeoSharingDiversityAssignment(double _nicheSize = 0.5, double _alpha = 1.0) : distance(defaultDistance), nicheSize(_nicheSize), alpha(_alpha) + {} + + + /** + * Sets diversity values for every solution contained in the population _pop + * @param _pop the population + */ + void operator()(eoPop < MOEOT > & _pop) + { + // 1 - set simuilarities + setSimilarities(_pop); + // 2 - a higher diversity is better, so the values need to be inverted + moeoDiversityThenFitnessComparator < MOEOT > divComparator; + double max = std::max_element(_pop.begin(), _pop.end(), divComparator)->diversity(); + for (unsigned int i=0 ; i<_pop.size() ; i++) + { + _pop[i].diversity(max - _pop[i].diversity()); + } + } + + + /** + * @warning NOT IMPLEMENTED, DO NOTHING ! + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + * @warning NOT IMPLEMENTED, DO NOTHING ! + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + std::cout << "WARNING : updateByDeleting not implemented in moeoSharingDiversityAssignment" << std::endl; + } + + +protected: + + /** the distance used to compute the neighborhood of solutions */ + moeoDistance < MOEOT , double > & distance; + /** euclidean distancein the objective space (can be used as default) */ + moeoEuclideanDistance < MOEOT > defaultDistance; + /** neighborhood size in terms of radius distance */ + double nicheSize; + /** parameter used to regulate the shape of the sharing function */ + double alpha; + + + /** + * Sets similarities for every solution contained in the population _pop + * @param _pop the population + */ + virtual void setSimilarities(eoPop < MOEOT > & _pop) + { + // compute distances between every individuals + moeoDistanceMatrix < MOEOT , double > dMatrix (_pop.size(), distance); + dMatrix(_pop); + // compute similarities + double sum; + for (unsigned int i=0; i<_pop.size(); i++) + { + sum = 0.0; + for (unsigned int j=0; j<_pop.size(); j++) + { + sum += sh(dMatrix[i][j]); + } + _pop[i].diversity(sum); + } + } + + + /** + * Sharing function + * @param _dist the distance value + */ + double sh(double _dist) + { + double result; + if (_dist < nicheSize) + { + result = 1.0 - pow(_dist / nicheSize, alpha); + } + else + { + result = 0.0; + } + return result; + } + +}; + + +#endif /*MOEOSHARINGDIVERSITYASSIGNMENT_H_*/