add achievement fitness assignment scheme

git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@309 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
liefooga 2007-06-18 15:39:15 +00:00
commit fca8cf40ea

View file

@ -24,67 +24,67 @@ class moeoAchievementFitnessAssignment : public moeoScalarFitnessAssignment < MO
{ {
public: public:
/** the objective vector type of the solutions */ /** the objective vector type of the solutions */
typedef typename MOEOT::ObjectiveVector ObjectiveVector; typedef typename MOEOT::ObjectiveVector ObjectiveVector;
/** /**
* Default ctor * Default ctor
* @param _reference reference point vector * @param _reference reference point vector
* @param _lambdas weighted coefficients vector * @param _lambdas weighted coefficients vector
* @param _spn arbitrary small positive number (0 < _spn << 1) * @param _spn arbitrary small positive number (0 < _spn << 1)
*/ */
moeoAchievementFitnessAssignment(ObjectiveVector & _reference, vector < double > & _lambdas, double _spn=0.0001) : reference(_reference), lambdas(_lambdas), spn(_spn) moeoAchievementFitnessAssignment(ObjectiveVector & _reference, vector < double > & _lambdas, double _spn=0.0001) : reference(_reference), lambdas(_lambdas), spn(_spn)
{ {
// consistency check // consistency check
if ((spn < 0.0) || (spn > 1.0)) if ((spn < 0.0) || (spn > 1.0))
{ {
std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n"; std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n";
spn = 0.0001; spn = 0.0001;
} }
} }
/** /**
* Ctor with default values for lambdas (1/nObjectives) * Ctor with default values for lambdas (1/nObjectives)
* @param _reference reference point vector * @param _reference reference point vector
* @param _spn arbitrary small positive number (0 < _spn << 1) * @param _spn arbitrary small positive number (0 < _spn << 1)
*/ */
moeoAchievementFitnessAssignment(ObjectiveVector & _reference, double _spn=0.0001) : reference(_reference), spn(_spn) moeoAchievementFitnessAssignment(ObjectiveVector & _reference, double _spn=0.0001) : reference(_reference), spn(_spn)
{ {
// compute the default values for lambdas // compute the default values for lambdas
lambdas = vector < double > (ObjectiveVector::nObjectives()); lambdas = vector < double > (ObjectiveVector::nObjectives());
for (unsigned i=0 ; i<lambdas.size(); i++) for (unsigned i=0 ; i<lambdas.size(); i++)
{ {
lambdas[i] = 1.0 / ObjectiveVector::nObjectives(); lambdas[i] = 1.0 / ObjectiveVector::nObjectives();
} }
// consistency check // consistency check
if ((spn < 0.0) || (spn > 1.0)) if ((spn < 0.0) || (spn > 1.0))
{ {
std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n"; std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n";
spn = 0.0001; spn = 0.0001;
} }
} }
/** /**
* Sets the fitness values for every solution contained in the population _pop * Sets the fitness values for every solution contained in the population _pop
* @param _pop the population * @param _pop the population
*/
virtual void operator()(eoPop < MOEOT > & _pop)
{
for (unsigned i=0; i<_pop.size() ; i++)
{
compute(_pop[i]);
}
}
/**
* Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account (nothing to do).
* @param _pop the population
* @param _objVec the objective vector
*/ */
virtual void operator()(eoPop < MOEOT > & _pop)
{
for (unsigned i=0; i<_pop.size() ; i++)
{
compute(_pop[i]);
}
}
/**
* Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account (nothing to do).
* @param _pop the population
* @param _objVec the objective vector
*/
void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
{ {
// nothing to do ;-) // nothing to do ;-)
@ -96,19 +96,19 @@ public:
* @param _reference the new reference point * @param _reference the new reference point
*/ */
void setReference(const ObjectiveVector & _reference) void setReference(const ObjectiveVector & _reference)
{ {
reference = _reference; reference = _reference;
} }
private: private:
/** the reference point */ /** the reference point */
ObjectiveVector reference; ObjectiveVector reference;
/** the weighted coefficients vector */ /** the weighted coefficients vector */
vector < double > lambdas; vector < double > lambdas;
/** an arbitrary small positive number (0 < _spn << 1) */ /** an arbitrary small positive number (0 < _spn << 1) */
double spn; double spn;
/** /**
@ -120,24 +120,24 @@ private:
} }
/** /**
* Computes the fitness value for a solution * Computes the fitness value for a solution
* @param _moeo the solution * @param _moeo the solution
*/ */
void compute(MOEOT & _moeo) void compute(MOEOT & _moeo)
{ {
unsigned nobj = MOEOT::ObjectiveVector::nObjectives(); unsigned nobj = MOEOT::ObjectiveVector::nObjectives();
double temp; double temp;
double min = inf(); double min = inf();
double sum = 0; double sum = 0;
for (unsigned obj=0; obj<nobj; obj++) for (unsigned obj=0; obj<nobj; obj++)
{ {
temp = lambdas[obj] * (reference[obj] - _moeo.objectiveVector()[obj]); temp = lambdas[obj] * (reference[obj] - _moeo.objectiveVector()[obj]);
min = std::min(min, temp); min = std::min(min, temp);
sum += temp; sum += temp;
} }
_moeo.fitness(min + spn*sum); _moeo.fitness(min + spn*sum);
} }
}; };