// -*- 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 /** * Default is exponential */ template < class MOEOT > class moeoIndicatorBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > { public: /** The type of objective vector */ typedef typename MOEOT::ObjectiveVector ObjectiveVector; /** * Ctor * @param ... */ moeoIndicatorBasedFitnessAssignment(moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > * _metric, const double _kappa) : metric(_metric), kappa(_kappa) {} /** * */ void operator()(eoPop < MOEOT > & _pop) { // 1 - setting of the bounds setup(_pop); // 2 - computing every indicator values computeValues(_pop); // 3 - setting fitnesses setFitnesses(_pop); } ///////////////////////////////////////////////////////////////////// // A SIMPLIFIER ! => utiliser la fonction d'en dessous ;-) void updateByDeleting(eoPop < MOEOT > & _pop, MOEOT & _moeo) { vector < double > v; v.resize(_pop.size()); for (unsigned i=0; i<_pop.size(); i++) { v[i] = (*metric)(_moeo.objectiveVector(), _pop[i].objectiveVector()); } for (unsigned i=0; i<_pop.size(); i++) { _pop[i].fitness( _pop[i].fitness() + exp(-v[i]/kappa) ); } } void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) { vector < double > v; v.resize(_pop.size()); for (unsigned i=0; i<_pop.size(); i++) { v[i] = (*metric)(_objVec, _pop[i].objectiveVector()); } for (unsigned i=0; i<_pop.size(); i++) { _pop[i].fitness( _pop[i].fitness() + exp(-v[i]/kappa) ); } } // IDEM ! void updateByAdding(eoPop < MOEOT > & _pop, MOEOT & _moeo) { vector < double > v; // update every fitness values to take the new individual into account v.resize(_pop.size()); for (unsigned i=0; i<_pop.size(); i++) { v[i] = (*metric)(_moeo.objectiveVector(), _pop[i].objectiveVector()); } for (unsigned i=0; i<_pop.size(); i++) { _pop[i].fitness( _pop[i].fitness() - exp(-v[i]/kappa) ); } // compute the fitness of the new individual v.clear(); v.resize(_pop.size()); for (unsigned i=0; i<_pop.size(); i++) { v[i] = (*metric)(_pop[i].objectiveVector(), _moeo.objectiveVector()); } double fitness = 0; for (unsigned i=0; i & _pop, ObjectiveVector & _objVec) { vector < double > v; // update every fitness values to take the new individual into account v.resize(_pop.size()); for (unsigned i=0; i<_pop.size(); i++) { v[i] = (*metric)(_objVec, _pop[i].objectiveVector()); } for (unsigned i=0; i<_pop.size(); i++) { _pop[i].fitness( _pop[i].fitness() - exp(-v[i]/kappa) ); } // compute the fitness of the new individual v.clear(); v.resize(_pop.size()); for (unsigned i=0; i<_pop.size(); i++) { v[i] = (*metric)(_pop[i].objectiveVector(), _objVec); } double result = 0; for (unsigned i=0; i * metric; double kappa; std::vector < std::vector > values; /** * Sets the bounds for every objective using the min and the max value for every objective vector of _pop * @param _pop the population */ void setup(const eoPop < MOEOT > & _pop) { double min, max; for (unsigned i=0; i & _pop) { values.clear(); values.resize(_pop.size()); for (unsigned i=0; i<_pop.size(); i++) { values[i].resize(_pop.size()); for (unsigned j=0; j<_pop.size(); j++) { if (i != j) { values[i][j] = (*metric)(_pop[i].objectiveVector(), _pop[j].objectiveVector()); } } } } void setFitnesses(eoPop < MOEOT > & _pop) { for (unsigned i=0; i<_pop.size(); i++) { _pop[i].fitness(computeFitness(i)); } } double computeFitness(const unsigned _idx) { double result = 0; for (unsigned i=0; i