git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@190 331e1502-861f-0410-8da2-ba01fb791d7f

This commit is contained in:
legrand 2007-02-23 13:21:14 +00:00
commit 9cf132205f
36 changed files with 3389 additions and 0 deletions

View file

@ -0,0 +1,283 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// MOEO.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEO_H_
#define MOEO_H_
#include <iostream>
#include <stdexcept>
#include <string>
#include <EO.h>
/**
* Base class allowing to represent a solution (an individual) for multi-objective optimization.
* The template argument MOEOObjectiveVector allows to represent the solution in the objective space (it can be a moeoObjectiveVector object).
* The template argument MOEOFitness is an object reflecting the quality of the solution in term of convergence (the fitness of a solution is always to be maximized).
* The template argument MOEODiversity is an object reflecting the quality of the solution in term of diversity (the diversity of a solution is always to be maximized).
* All template arguments must have a void and a copy constructor.
* Besides, note that, contrary to the mono-objective case (and to EO) where the fitness value of a solution is confused with its objective value,
* the fitness value differs of the objectives values in the multi-objective case.
*
* !!!!!!!!!!!!!!!!! !!!!!
* operator '<' et '>' ???
* !!!!!!!!!!!!!!!!!!!!!!!
*/
template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity > class MOEO:public EO <
MOEOFitness
>
{
public:
/** the objective vector type of a solution */
typedef MOEOObjectiveVector ObjectiveVector;
/** the fitness type of a solution */
typedef MOEOFitness Fitness;
/** the diversity type of a solution */
typedef MOEODiversity Diversity;
/**
* Ctor
*/
MOEO ()
{
// default values for every parameters
objectiveVectorValue = ObjectiveVector ();
fitnessValue = Fitness ();
diversityValue = Diversity ();
// invalidate all
invalidate ();
}
/**
* Virtual dtor
*/
virtual ~ MOEO ()
{
};
/**
* Returns the objective vector of the current solution
*/
ObjectiveVector objectiveVector () const
{
if (invalidObjectiveVector ())
{
throw std::runtime_error ("invalid objective vector");
}
return objectiveVectorValue;
}
/**
* Sets the objective vector of the current solution
* @param _objectiveVectorValue the new objective vector
*/
void objectiveVector (const ObjectiveVector & _objectiveVectorValue)
{
objectiveVectorValue = _objectiveVectorValue;
invalidObjectiveVectorValue = false;
}
/**
* Sets the objective vector as invalid
*/
void invalidateObjectiveVector ()
{
invalidObjectiveVectorValue = true;
}
/**
* Returns true if the objective vector is invalid, false otherwise
*/
bool invalidObjectiveVector () const
{
return invalidObjectiveVectorValue;
}
/**
* Returns the fitness value of the current solution
*/
Fitness fitness () const
{
if (invalidFitness ())
{
throw std::runtime_error ("invalid fitness");
}
return fitnessValue;
}
/**
* Sets the fitness value of the current solution
* @param _fitnessValue the new fitness value
*/
void fitness (const Fitness & _fitnessValue)
{
fitnessValue = _fitnessValue;
invalidFitnessValue = false;
}
/**
* Sets the fitness value as invalid
*/
void invalidateFitness ()
{
invalidFitnessValue = true;
}
/**
* Returns true if the fitness value is invalid, false otherwise
*/
bool invalidFitness () const
{
return invalidFitnessValue;
}
/**
* Returns the diversity value of the current solution
*/
Diversity diversity () const
{
if (invalidDiversity ())
{
throw std::runtime_error ("invalid diversity");
}
return diversityValue;
}
/**
* Sets the diversity value of the current solution
* @param _diversityValue the new diversity value
*/
void diversity (const Diversity & _diversityValue)
{
diversityValue = _diversityValue;
invalidDiversityValue = false;
}
/**
* Sets the diversity value as invalid
*/
void invalidateDiversity ()
{
invalidDiversityValue = true;
}
/**
* Returns true if the diversity value is invalid, false otherwise
*/
bool invalidDiversity () const
{
return invalidDiversityValue;
}
/**
* Sets the objective vector, the fitness value and the diversity value as invalid
*/
void invalidate ()
{
invalidateObjectiveVector ();
invalidateFitness ();
invalidateDiversity ();
}
/**
* Returns true if the fitness value is invalid, false otherwise
*/
bool invalid () const
{
return invalidObjectiveVector ();
}
/**
* Return the class id (the class name as a std::string)
*/
virtual std::string className () const
{
return "MOEO";
}
/**
* Writing object
* @param _os output stream
*/
virtual void printOn (std::ostream & _os) const
{
if (invalidObjectiveVector ())
{
_os << "INVALID\t";
}
else
{
_os << objectiveVectorValue << '\t';
}
}
/**
* Reading object
* @param _is input stream
*/
virtual void readFrom (std::istream & _is)
{
std::string objectiveVector_str;
int pos = _is.tellg ();
_is >> objectiveVector_str;
if (objectiveVector_str == "INVALID")
{
invalidateObjectiveVector ();
}
else
{
invalidObjectiveVectorValue = false;
_is.seekg (pos); // rewind
_is >> objectiveVectorValue;
}
}
private:
/** the objective vector of this solution */
ObjectiveVector objectiveVectorValue;
/** true if the objective vector is invalid */
bool invalidObjectiveVectorValue;
/** the fitness value of this solution */
Fitness fitnessValue;
/** true if the fitness value is invalid */
bool invalidFitnessValue;
/** the diversity value of this solution */
Diversity diversityValue;
/** true if the diversity value is invalid */
bool invalidDiversityValue;
};
#endif /*MOEO_H_ */

View file

@ -0,0 +1 @@
# Nothing to compile !

View file

@ -0,0 +1,39 @@
// -*- 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 <metric/moeoMetric.h>
/**
*
*/
template < class MOEOT >
class moeoAdditiveEpsilonBinaryMetric : public moeoSolutionVsSolutionBinaryMetric < MOEOT, double >
{
public:
/** the objective vector type of a solution */
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
moeoAdditiveEpsilonBinaryMetric();
double operator()(const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2)
{
}
};
#endif /*MOEOADDITIVEEPSILONBINARYMETRIC_H_*/

View file

@ -0,0 +1,88 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoBinaryMetricSavingUpdater.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOBINARYMETRICSAVINGUPDATER_H_
#define MOEOBINARYMETRICSAVINGUPDATER_H_
#include <fstream>
#include <string>
#include <eoPop.h>
#include <utils/eoUpdater.h>
#include <metric/moeoMetric.h>
/**
* This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive)
* with the objective vectors of the population (or archive) of the generation (n-1) into a file
*/
template < class MOEOT >
class moeoBinaryMetricSavingUpdater : public eoUpdater
{
public:
/**
* The objective vector type of a solution
*/
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
/**
* Ctor
* @param _metric the binary metric comparing two Pareto sets
* @param _pop the main population
* @param _filename the target filename
*/
moeoBinaryMetricSavingUpdater (moeoVectorVsVectorBinaryMetric < ObjectiveVector, double > & _metric, const eoPop < MOEOT > & _pop, std::string _filename) :
metric(_metric), pop(_pop), filename(_filename), counter(1)
{}
/**
* Saves the metric's value for the current generation
*/
void operator()() {
if (pop.size()) {
if (firstGen) {
firstGen = false;
}
else {
// creation of the two Pareto sets
std::vector < ObjectiveVector > from;
std::vector < ObjectiveVector > to;
for (unsigned i=0; i<pop.size(); i++)
from.push_back(pop[i].objectiveVector());
for (unsigned i=0 ; i<oldPop.size(); i++)
to.push_back(oldPop[i].objectiveVector());
// writing the result into the file
std::ofstream f (filename.c_str(), std::ios::app);
f << counter++ << ' ' << metric(from,to) << std::endl;
f.close();
}
oldPop = pop;
}
}
private:
/** binary metric comparing two Pareto sets */
moeoVectorVsVectorBinaryMetric < ObjectiveVector, double > & metric;
/** main population */
const eoPop < MOEOT > & pop;
/** (n-1) population */
eoPop< MOEOT > oldPop;
/** target filename */
std::string filename;
/** is it the first generation ? */
bool firstGen;
/** counter */
unsigned counter;
};
#endif /*MOEOBINARYMETRICSAVINGUPDATER_H_*/

View file

@ -0,0 +1,98 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoContributionMetric.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOCONTRIBUTIONMETRIC_H_
#define MOEOCONTRIBUTIONMETRIC_H_
#include <metric/moeoMetric.h>
/**
* The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set
* (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc. of the 2000 Congress on Evolutionary Computation, IEEE Press, pp. 317-324)
*/
template < class ObjectiveVector >
class moeoContributionMetric : public moeoVectorVsVectorBinaryMetric < ObjectiveVector, double >
{
public:
/**
* Returns the contribution of the Pareto set '_set1' relatively to the Pareto set '_set2'
* @param _set1 the first Pareto set
* @param _set2 the second Pareto set
*/
double operator()(const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
unsigned c = card_C(_set1, _set2);
unsigned w1 = card_W(_set1, _set2);
unsigned n1 = card_N(_set1, _set2);
unsigned w2 = card_W(_set2, _set1);
unsigned n2 = card_N(_set2, _set1);
return (double) (c / 2.0 + w1 + n1) / (c + w1 + n1 + w2 + n2);
}
private:
/**
* Returns the number of solutions both in '_set1' and '_set2'
* @param _set1 the first Pareto set
* @param _set2 the second Pareto set
*/
unsigned card_C (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
unsigned c=0;
for (unsigned i=0; i<_set1.size(); i++)
for (unsigned j=0; j<_set2.size(); j++)
if (_set1[i] == _set2[j]) {
c++;
break;
}
return c;
}
/**
* Returns the number of solutions in '_set1' dominating at least one solution of '_set2'
* @param _set1 the first Pareto set
* @param _set2 the second Pareto set
*/
unsigned card_W (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
unsigned w=0;
for (unsigned i=0; i<_set1.size(); i++)
for (unsigned j=0; j<_set2.size(); j++)
if (_set1[i].dominates(_set2[j])) {
w++;
break;
}
return w;
}
/**
* Returns the number of solutions in '_set1' having no relation of dominance with those from '_set2'
* @param _set1 the first Pareto set
* @param _set2 the second Pareto set
*/
unsigned card_N (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
unsigned n=0;
for (unsigned i=0; i<_set1.size(); i++) {
bool domin_rel = false;
for (unsigned j=0; j<_set2.size(); j++)
if (_set1[i].dominates(_set2[j]) || _set2[j].dominates(_set1 [i])) {
domin_rel = true;
break;
}
if (! domin_rel)
n++;
}
return n;
}
};
#endif /*MOEOCONTRIBUTIONMETRIC_H_*/

View file

@ -0,0 +1,177 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoEntropyMetric.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOENTROPYMETRIC_H_
#define MOEOENTROPYMETRIC_H_
#include <metric/moeoMetric.h>
/**
* The entropy gives an idea of the diversity of a Pareto set relatively to another
* (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc. of the 2002 Congress on Evolutionary Computation, IEEE Press, pp. 1155-1156)
*/
template < class ObjectiveVector >
class moeoEntropyMetric : public moeoVectorVsVectorBinaryMetric < ObjectiveVector, double >
{
public:
/**
* Returns the entropy of the Pareto set '_set1' relatively to the Pareto set '_set2'
* @param _set1 the first Pareto set
* @param _set2 the second Pareto set
*/
double operator()(const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
// normalization
std::vector< ObjectiveVector > set1 = _set1;
std::vector< ObjectiveVector > set2= _set2;
removeDominated (set1);
removeDominated (set2);
prenormalize (set1);
normalize (set1);
normalize (set2);
// making of PO*
std::vector< ObjectiveVector > star; // rotf :-)
computeUnion (set1, set2, star);
removeDominated (star);
// making of PO1 U PO*
std::vector< ObjectiveVector > union_set1_star; // rotf again ...
computeUnion (set1, star, union_set1_star);
unsigned C = union_set1_star.size();
float omega=0;
float entropy=0;
for (unsigned i=0 ; i<C ; i++) {
unsigned N_i = howManyInNicheOf (union_set1_star, union_set1_star[i], star.size());
unsigned n_i = howManyInNicheOf (set1, union_set1_star[i], star.size());
if (n_i > 0) {
omega += 1.0 / N_i;
entropy += (float) n_i / (N_i * C) * log (((float) n_i / C) / log (2.0));
}
}
entropy /= - log (omega);
entropy *= log (2.0);
return entropy;
}
private:
/** vector of min values */
std::vector<double> vect_min_val;
/** vector of max values */
std::vector<double> vect_max_val;
/**
* Removes the dominated individuals contained in _f
* @param _f a Pareto set
*/
void removeDominated(std::vector < ObjectiveVector > & _f) {
for (unsigned i=0 ; i<_f.size(); i++) {
bool dom = false;
for (unsigned j=0; j<_f.size(); j++)
if (i != j && _f[j].dominates(_f[i])) {
dom = true;
break;
}
if (dom) {
_f[i] = _f.back();
_f.pop_back();
i--;
}
}
}
/**
* Prenormalization
* @param _f a Pareto set
*/
void prenormalize (const std::vector< ObjectiveVector > & _f) {
vect_min_val.clear();
vect_max_val.clear();
for (unsigned char i=0 ; i<ObjectiveVector::nObjectives(); i++) {
float min_val = _f.front()[i], max_val = min_val;
for (unsigned j=1 ; j<_f.size(); j++) {
if (_f[j][i] < min_val)
min_val = _f[j][i];
if (_f[j][i]>max_val)
max_val = _f[j][i];
}
vect_min_val.push_back(min_val);
vect_max_val.push_back (max_val);
}
}
/**
* Normalization
* @param _f a Pareto set
*/
void normalize (std::vector< ObjectiveVector > & _f) {
for (unsigned i=0 ; i<ObjectiveVector::nObjectives(); i++)
for (unsigned j=0; j<_f.size(); j++)
_f[j][i] = (_f[j][i] - vect_min_val[i]) / (vect_max_val[i] - vect_min_val[i]);
}
/**
* Computation of the union of _f1 and _f2 in _f
* @param _f1 the first Pareto set
* @param _f2 the second Pareto set
* @param _f the final Pareto set
*/
void computeUnion(const std::vector< ObjectiveVector > & _f1, const std::vector< ObjectiveVector > & _f2, std::vector< ObjectiveVector > & _f) {
_f = _f1 ;
for (unsigned i=0; i<_f2.size(); i++) {
bool b = false;
for (unsigned j=0; j<_f1.size(); j ++)
if (_f1[j] == _f2[i]) {
b = true;
break;
}
if (! b)
_f.push_back(_f2[i]);
}
}
/**
* How many in niche
*/
unsigned howManyInNicheOf (const std::vector< ObjectiveVector > & _f, const ObjectiveVector & _s, unsigned _size) {
unsigned n=0;
for (unsigned i=0 ; i<_f.size(); i++) {
if (euclidianDistance(_f[i], _s) < (_s.size() / (double) _size))
n++;
}
return n;
}
/**
* Euclidian distance
*/
double euclidianDistance (const ObjectiveVector & _set1, const ObjectiveVector & _to, unsigned _deg = 2) {
double dist=0;
for (unsigned i=0; i<_set1.size(); i++)
dist += pow(fabs(_set1[i] - _to[i]), (int)_deg);
return pow(dist, 1.0 / _deg);
}
};
#endif /*MOEOENTROPYMETRIC_H_*/

View file

@ -0,0 +1,81 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoMetric.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOMETRIC_H_
#define MOEOMETRIC_H_
#include <eoFunctor.h>
/**
* Base class for performance metrics (also known as quality indicators).
*/
class moeoMetric : public eoFunctorBase
{};
/**
* Base class for unary metrics.
*/
template < class A, class R >
class moeoUnaryMetric : public eoUF < A, R >, public moeoMetric
{};
/**
* Base class for binary metrics.
*/
template < class A1, class A2, class R >
class moeoBinaryMetric : public eoBF < A1, A2, R >, public moeoMetric
{};
/**
* Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector.
*/
template < class ObjectiveVector, class R >
class moeoSolutionUnaryMetric : public moeoUnaryMetric < const ObjectiveVector &, R >
{};
/**
* Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors)
*/
template < class ObjectiveVector, class R >
class moeoVectorUnaryMetric : public moeoUnaryMetric < const std::vector < ObjectiveVector > &, R >
{};
/**
* Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors.
*/
template < class ObjectiveVector, class R >
class moeoSolutionVsSolutionBinaryMetric : public moeoBinaryMetric < const ObjectiveVector &, const ObjectiveVector &, R >
{};
/**
* Base class for binary metrics dedicated to the performance comparison between a Pareto set (a vector of objective vectors) and a single solution's objective vector.
*/
template < class ObjectiveVector, class R >
class moeoVectorVsSolutionBinaryMetric : public moeoBinaryMetric < const std::vector < ObjectiveVector > &, const ObjectiveVector &, R >
{};
/**
* Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors)
*/
template < class ObjectiveVector, class R >
class moeoVectorVsVectorBinaryMetric : public moeoBinaryMetric < const std::vector < ObjectiveVector > &, const std::vector < ObjectiveVector > &, R >
{};
#endif /*MOEOMETRIC_H_*/

View file

@ -0,0 +1,43 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeo
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEO_
#define MOEO_
#include <eo>
#include <metric/moeoBinaryMetricSavingUpdater.h>
#include <metric/moeoContributionMetric.h>
#include <metric/moeoEntropyMetric.h>
#include <metric/moeoMetric.h>
#include <moeoArchiveFitnessSavingUpdater.h>
#include <moeoArchiveUpdater.h>
#include <moeoArchive.h>
#include <moeoCombinedLS.h>
#include <moeoComparator.h>
#include <moeoDiversityAssignment.h>
#include <moeoEA.h>
#include <moeoEvalFunc.h>
#include <moeoFastNonDominatedSortingFitnessAssignment.h>
#include <moeoGenerationalReplacement.h>
#include <moeoHybridLS.h>
#include <moeoLS.h>
#include <moeoObjectiveVectorComparator.h>
#include <moeoObjectiveVectorTraits.h>
#include <moeoObjectiveVector.h>
#include <moeoRandomSelectOne.h>
#include <moeoReplacement.h>
#include <moeoSelectOneFromPopAndArch.h>
#include <moeoSelectOne.h>
#include <MOEO.h>
#endif /*MOEO_*/

View file

@ -0,0 +1,161 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoArchive.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOARCHIVE_H_
#define MOEOARCHIVE_H_
#include <eoPop.h>
/**
* An archive is a secondary population that stores non-dominated solutions
*/
template < class MOEOT > class moeoArchive:public eoPop < MOEOT >
{
public:
using std::vector < MOEOT >::size;
using std::vector < MOEOT >::operator[];
using std::vector < MOEOT >::back;
using std::vector < MOEOT >::pop_back;
/**
* The type of an objective vector for a solution
*/
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
/**
* Default ctor.
* The moeoObjectiveVectorComparator used to compare solutions is based on Pareto dominance
*/
moeoArchive ():eoPop < MOEOT > (), comparator (paretoComparator)
{
}
/**
* Ctor
* @param _comparator the moeoObjectiveVectorComparator used to compare solutions
*/
moeoArchive (moeoObjectiveVectorComparator < ObjectiveVector > &_comparator):eoPop < MOEOT > (),
comparator
(_comparator)
{
}
/**
* Returns true if the current archive dominates _objectiveVector according to the moeoObjectiveVectorComparator given in the constructor
* @param _objectiveVector the objective vector to compare with the current archive
*/
bool dominates (const ObjectiveVector & _objectiveVector) const
{
for (unsigned i = 0; i < size (); i++)
{
if (comparator (operator[](i).fitness (), _objectiveVector) == 1)
{
return true;
}
}
return false;
}
/**
* Returns true if the current archive already contains a solution with the same objective values than _objectiveVector
* @param _objectiveVector the objective vector to compare with the current archive
*/
bool contains (const ObjectiveVector & _objectiveVector) const
{
for (unsigned i = 0; i < size; i++)
{
if (operator[](i).fitness () == _objectiveVector)
{
return true;
}
}
return false;
}
/**
* Updates the archive with a given individual _moeo
* @param _moeo the given individual
*/
void update (const MOEOT & _moeo)
{
// first step: removing the dominated solutions from the archive
for (unsigned j = 0; j < size ();)
{
// if _moeo.fitness() dominates operator[](j).fitness()
//if ( comparator(_moeo.fitness(), operator[](j).fitness())==1 )
if (comparator
(_moeo.objectiveVector (), operator[](j).objectiveVector ()) == 1)
{
operator[](j) = back ();
pop_back ();
}
//else if (_moeo.fitness() == operator[](j).fitness())
else if (_moeo.objectiveVector () == operator[](j).objectiveVector ())
{
operator[](j) = back ();
pop_back ();
}
else
{
j++;
}
}
// second step: is _moeo dominated?
bool dom = false;
for (unsigned j = 0; j < size (); j++)
{
// if operator[](j).fitness() dominates _moeo.fitness()
//if ( comparator(operator[](j).fitness(), _moeo.fitness())==1 )
if (comparator
(operator[](j).objectiveVector (), _moeo.objectiveVector ()) == 1)
{
dom = true;
break;
}
}
if (!dom)
{
push_back (_moeo);
}
}
/**
* Updates the archive with a given population _pop
* @param _pop the given population
*/
void update (const eoPop < MOEOT > &_pop)
{
for (unsigned i = 0; i < _pop.size (); i++)
{
update (_pop[i]);
}
}
private:
/** The moeoObjectiveVectorComparator used to compare solutions */
moeoObjectiveVectorComparator < ObjectiveVector > &comparator;
/** A moeoObjectiveVectorComparator based on Pareto dominance (used as default) */
moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
};
#endif /*MOEOARCHIVE_H_ */

View file

@ -0,0 +1,73 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoArchiveFitnessSavingUpdater.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOARCHIVEFITNESSSAVINGUPDATER_H_
#define MOEOARCHIVEFITNESSSAVINGUPDATER_H_
#include <fstream>
#include <string>
#include <eoPop.h>
#include <utils/eoUpdater.h>
#include <moeoArchive.h>
#define MAX_BUFFER_SIZE 1000
/**
* This class allows to save the fitnesses of solutions contained in an archive into a file at each generation.
*/
template < class EOT > class moeoArchiveFitnessSavingUpdater:public eoUpdater
{
public:
/**
* Ctor
* @param _arch local archive
* @param _filename target filename
* @param _id own ID
*/
moeoArchiveFitnessSavingUpdater (moeoArchive < EOT > &_arch, const std::string & _filename = "Res/Arch", int _id = -1):arch (_arch), filename (_filename), id (_id),
counter
(0)
{
}
/**
* Saves the fitness of the archive's members into the file
*/
void operator () ()
{
char buff[MAX_BUFFER_SIZE];
if (id == -1)
sprintf (buff, "%s.%u", filename.c_str (), counter++);
else
sprintf (buff, "%s.%u.%u", filename.c_str (), id, counter++);
std::ofstream f (buff);
for (unsigned i = 0; i < arch.size (); i++)
f << arch[i].objectiveVector () << std::endl;
f.close ();
}
private:
/** local archive */
moeoArchive < EOT > &arch;
/** target filename */
std::string filename;
/** own ID */
int id;
/** counter */
unsigned counter;
};
#endif /*MOEOARCHIVEFITNESSSAVINGUPDATER_H_ */

View file

@ -0,0 +1,56 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoArchiveUpdater.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOARCHIVEUPDATER_H_
#define MOEOARCHIVEUPDATER_H_
#include <eoPop.h>
#include <utils/eoUpdater.h>
#include <moeoArchive.h>
/**
* This class allows to update the archive at each generation with newly found non-dominated solutions
*/
template < class EOT > class moeoArchiveUpdater:public eoUpdater
{
public:
/**
* Ctor
* @param _arch an archive of non-dominated solutions
* @param _pop the main population
*/
moeoArchiveUpdater (moeoArchive < EOT > &_arch,
const eoPop < EOT > &_pop):arch (_arch), pop (_pop)
{
}
/**
* Updates the archive with newly found non-dominated solutions contained in the main population
*/
void operator () ()
{
arch.update (pop);
}
private:
/** the archive of non-dominated solutions */
moeoArchive < EOT > &arch;
/** the main population */
const eoPop < EOT > &pop;
};
#endif /*MOEOARCHIVEUPDATER_H_ */

View file

@ -0,0 +1,71 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoCombinedLS.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOCOMBINEDLS_H_
#define MOEOCOMBINEDLS_H_
#include <moeoArchive.h>
#include <moeoEvalFunc.h>
#include <moeoLS.h>
/**
* This class allows to embed a set of local searches that are sequentially applied,
* and so working and updating the same archive of non-dominated solutions
*/
template < class MOEOT > class moeoCombinedLS:public moeoLS < MOEOT >
{
public:
/**
* Ctor
* @param _eval the full evaluator of a solution
* @param _first_ls the first multi-objective local search to add
*/
moeoCombinedLS (moeoEvalFunc < MOEOT > &_eval, moeoLS < MOEOT > &_first_ls):eval
(_eval)
{
combinedLS.push_back (&_first_ls);
}
/**
* Adds a new local search to combine
* @param _ls the multi-objective local search to add
*/
void add (moeoLS < MOEOT > &_ls)
{
combinedMOLS.push_back (&_ls);
}
/**
* Gives a new solution in order to explore the neigborhood.
* The new non-dominated solutions are added to the archive
* @param _eo the solution
* @param _arch the archive of non-dominated solutions
*/
void operator () (const MOEOT & _eo, moeoArchive < MOEOT > &_arch)
{
eval (const_cast < MOEOT & >(_eo));
for (unsigned i = 0; i < combinedLS.size (); i++)
combinedLS[i]->operator ()(_eo, _arch);
}
private:
/** the full evaluator of a solution */
moeoEvalFunc < MOEOT > &eval;
/** the vector that contains the combined LS */
std::vector < moeoLS < MOEOT > *>combinedLS;
};
#endif /*MOEOCOMBINEDLS_H_ */

View file

@ -0,0 +1,185 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoComparator.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOCOMPARATOR_H_
#define MOEOCOMPARATOR_H_
#include <eoFunctor.h>
#include <eoPop.h>
/**
* Functor allowing to compare two solutions
*/
template < class MOEOT > class moeoComparator:public eoBF < const MOEOT &, const MOEOT &,
const bool >
{
public:
// virtual const bool operator () (const MOEOT & _moeo1, const MOEOT & _moeo){}
};
/**
* Functor allowing to compare two solutions according to their first objective value, then their second, and so on
*/
template < class MOEOT > class moeoObjectiveComparator:public moeoComparator <
MOEOT >
{
public:
/**
* Returns true if _moeo1 is smaller than _moeo2 on the first objective, then on the second, and so on
* @param _moeo1 the first solution
* @param _moeo2 the second solution
*/
const bool operator () (const MOEOT & _moeo1, const MOEOT & _moeo2)
{
return _moeo1.objectiveVector () < _moeo2.objectiveVector ();
}
};
/**
* Functor allowing to compare two solutions according to their fitness values
*/
//template < class MOEOT >
//class moeoFitnessComparator : public moeoComparator < MOEOT >
//{
//public:
// /**
// * Returns true if the fitness value of _moeo1 is smaller than the fitness value of _moeo2
// * @param _moeo1 the first solution
// * @param _moeo2 the second solution
// */
// const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
// {
// return _moeo1.fitness() < _moeo2.fitness();
// }
//};
//
//
///**
// * Functor allowing to compare two solutions according to their diversity values
// */
//template < class MOEOT >
//class moeoDiversityComparator : public moeoComparator < MOEOT >
//{
//public:
// /**
// * Returns true if the diversity value of _moeo1 is smaller than the diversity value of _moeo2
// * @param _moeo1 the first solution
// * @param _moeo2 the second solution
// */
// const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
// {
// return _moeo1.diversity() < _moeo2.diversity();
// }
//};
/**
* Functor allowing to compare two solutions according to their fitness values, then according to their diversity values
*/
template < class MOEOT > class moeoFitnessThenDiversityComparator:public moeoComparator <
MOEOT >
{
public:
/**
* Returns true if _moeo1 is smaller than _moeo2 according to their fitness values, then according to their diversity values
* @param _moeo1 the first solution
* @param _moeo2 the second solution
*/
const bool operator () (const MOEOT & _moeo1, const MOEOT & _moeo2)
{
if (_moeo1.fitness () == _moeo2.fitness ())
{
return _moeo1.diversity () < _moeo2.diversity ();
}
else
{
return _moeo1.fitness () < _moeo2.fitness ();
}
}
};
/**
* Functor allowing to compare two solutions according to their diversity values, then according to their fitness values
*/
template < class MOEOT > class moeoDiversityThenFitnessComparator:public moeoComparator <
MOEOT >
{
public:
/**
* Returns true if _moeo1 is smaller than _moeo2 according to their diversity values, then according to their fitness values
* @param _moeo1 the first solution
* @param _moeo2 the second solution
*/
const bool operator () (const MOEOT & _moeo1, const MOEOT & _moeo2)
{
if (_moeo1.diversity () == _moeo2.diversity ())
{
return _moeo1.fitness () < _moeo2.fitness ();
}
else
{
return _moeo1.diversity () < _moeo2.diversity ();
}
}
};
/**
* Functor allowing to compare two solutions according to Pareto dominance relation => USEFULL ???
*
template < class MOEOT >
class moeoParetoDominanceComparator : public moeoComparator < MOEOT >
{
public:
/**
* Returns true if _moeo1 is dominated by _moeo2 according to Pareto dominance relation
* @param _moeo1 the first solution
* @param _moeo2 the second solution
*
const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
{
bool result = false;
typedef typename MOEOT::ObjectiveVector::Traits ObjectiveVectorTraits;
for (unsigned i=0; i<ObjectiveVectorTraits::nObjectives(); i++)
{
// first, we have to check if the 2 objective values are not equal on the ith objective
if ( fabs(_moeo1.objectiveVector()[i] - _moeo2.objectiveVector()[i]) > ObjectiveVectorTraits::tolerance() )
{
// if the ith objective have to be minimized...
if (ObjectiveVectorTraits::minimizing(i))
{
if (_moeo1.objectiveVector()[i] < _moeo2.objectiveVector()[i])
{
return false; // _moeo2 cannot dominate _moeo1
}
result = true;
}
// if the ith objective have to be maximized...
else if (ObjectiveVectorTraits::maximizing(i))
{
if (_moeo1.objectiveVector()[i] > _moeo2.objectiveVector()[i])
{
return false; // _moeo2 cannot dominate _moeo1
}
result = true;
}
}
}
return result;
}
};
*/
#endif /*MOEOCOMPARATOR_H_ */

View file

@ -0,0 +1,157 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoDetTournamentSelect.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEODETTOURNAMENTSELECT_H_
#define MOEODETTOURNAMENTSELECT_H_
#include <moeoSelectOne.h>
#include <moeoSelectors.h>
/**
* moeoDetTournamentSelect: a selection method that selects ONE individual by
* deterministic tournament
*/
template < class MOEOT >
class moeoDetTournamentSelect:public moeoSelectOne <MOEOT>
{
public:
/**
* Full Ctor
* @param _evalFitness the population fitness assignment
* @param _evalDiversity the population diversity assignment
* @param _comparator the comparator to compare the 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):evalFitness (_evalFitness), evalDiversity (_evalDiversity),
comparator (_comparator), tSize (_tSize)
{
// consistency check
if (tSize < 2)
{
std::
cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n";
tSize = 2;
}
}
/**
* Ctor without comparator. A moeoFitnessThenDiversityComparator is used as default.
* @param _evalFitness the population fitness assignment
* @param _evalDiversity the population diversity assignme
* @param _tSize the number of individuals in the tournament (default: 2)
*/
moeoDetTournamentSelect (moeoFitnessAssignment < MOEOT > &_evalFitness, moeoDiversityAssignment < MOEOT > &_evalDiversity, unsigned _tSize = 2)
:evalFitness (_evalFitness),evalDiversity(_evalDiversity),tSize(_tSize)
{
// a moeoFitThenDivComparator is used as default
moeoFitnessThenDiversityComparator < MOEOT > &fitThenDivComparator;
comparator = fitThenDivComparator;
// consistency check
if (tSize < 2)
{
std::
cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n";
tSize = 2;
}
}
/**
* Ctor without diversity assignment. A dummy diversity assignment is used.
* @param _evalFitness the population fitness assignment
* @param _comparator the comparator to compare the individuals
* @param _tSize the number of individuals in the tournament (default: 2)
*/
moeoDetTournamentSelect (moeoFitnessAssignment < MOEOT > &_evalFitness, moeoComparator < MOEOT > &_comparator, unsigned _tSize = 2):evalFitness (_evalFitness), comparator (_comparator),
tSize
(_tSize)
{
// a dummy diversity is used as default
moeoDummyDiversityAssignment < MOEOT > &dummyDiversityAssignment;
evalDiversity = dummyDiversityAssignment;
// consistency check
if (tSize < 2)
{
std::
cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n";
tSize = 2;
}
}
/**
* Ctor without diversity assignment nor comparator. A moeoDummyDiversityAssignment and a moeoFitnessThenDiversityComparator are used as default.
* @param _evalFitness the population fitness assignment
* @param _tSize the number of individuals in the tournament (default: 2)
*/
moeoDetTournamentSelect (moeoFitnessAssignment < MOEOT > &_evalFitness, unsigned _tSize = 2):evalFitness (_evalFitness),
tSize
(_tSize)
{
// a dummy diversity is used as default
moeoDummyDiversityAssignment < MOEOT > &dummyDiversityAssignment;
evalDiversity = dummyDiversityAssignment;
// a moeoFitThenDivComparator is used as default
moeoFitnessThenDiversityComparator < MOEOT > &fitThenDivComparator;
comparator = fitThenDivComparator;
// consistency check
if (tSize < 2)
{
std::
cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n";
tSize = 2;
}
}
/*
* Evaluate the fitness and the diversity of each individual of the population.
*/
void setup (eoPop<MOEOT>& _pop)
{
// eval fitness
evalFitness(_pop);
// eval diversity
evalDiversity(_pop);
}
/**
* Apply the tournament to the given population
*/
const MOEOT & operator () (const eoPop < MOEOT > &_pop)
{
// use the selector
return mo_deterministic_tournament(_pop,tSize,comparator);
}
protected:
moeoFitnessAssignment < MOEOT > &evalFitness;
moeoDiversityAssignment < MOEOT > &evalDiversity;
moeoComparator < MOEOT > &comparator;
unsigned tSize;
};
#endif /*MOEODETTOURNAMENTSELECT_H_ */

View file

@ -0,0 +1,48 @@
// -*- 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 <eoFunctor.h>
#include <eoPop.h>
/**
* Functor that sets the diversity values of a whole population
*/
template < class MOEOT > class moeoDiversityAssignment:public eoUF < eoPop < MOEOT > &,
void >
{
};
/**
* moeoDummyDiversityAssignment is a moeoDiversityAssignment which gives 0 as the diversity for the whole population.
*/
template < class MOEOT > class moeoDummyDiversityAssignment:public moeoDiversityAssignment <
MOEOT >
{
// main operator
void operator () (eoPop < MOEOT > &_pop)
{
for (int idx = 0; idx < _pop.size (); idx++)
{
// set the diversity to 0
_pop[idx].diversity (0);
}
}
};
#endif /*MOEODIVERSITYASSIGNMENT_H_ */

View file

@ -0,0 +1,26 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoEA.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOEA_H_
#define MOEOEA_H_
#include <eoAlgo.h>
/**
* Abstract class for multi-objective evolutionary algorithms
*/
template < class MOEOT > class moeoEA:public eoAlgo < MOEOT >
{
};
#endif /*MOEOEA_H_ */

View file

@ -0,0 +1,114 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoElitistReplacement.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOELITISTREPLACEMENT_H_
#define MOEOELITISTREPLACEMENT_H_
//-----------------------------------------------------------------------------
#include <moeoReplacement.h>
#include <moeoComparator.h>
#include <moeoFitnessAssignment.h>
#include <moeoDiversityAssignment.h>
//-----------------------------------------------------------------------------
/**
* Elitist replacement strategy for multi-objective optimization.
*/
template < class MOEOT > class moeoElitistReplacement:public moeoReplacement <
MOEOT >
{
public:
/** Full constructor */
moeoElitistReplacement (moeoFitnessAssignment < MOEOT > &_evalFitness, moeoDiversityAssignment < MOEOT > &_evalDiversity, moeoComparator < MOEOT > _comparator):evalFitness (_evalFitness), evalDiversity (_evalDiversity),
comparator
(_comparator)
{
}
/** constructor without comparator */
moeoElitistReplacement (moeoFitnessAssignment < MOEOT > &_evalFitness, moeoDiversityAssignment < MOEOT > &_evalDiversity)
:evalFitness (_evalFitness), evalDiversity (_evalDiversity)
{
// a moeoFitThenDivComparator is used as default
moeoFitnessThenDiversityComparator < MOEOT > &fitThenDivComparator;
comparator = fitThenDivComparator;
}
/** Constructor without moeoDiversityAssignement */
moeoElitistReplacement (moeoFitnessAssignment < MOEOT > &_evalFitness, moeoComparator < MOEOT > _comparator):evalFitness (_evalFitness),
comparator
(_comparator)
{
// a dummy diversity is used as default
moeoDummyDiversityAssignment < MOEOT > &dummyDiversityAssignment;
evalDiversity = dummyDiversityAssignment;
}
/** Constructor without moeoDiversityAssignement nor moeoComparator */
moeoElitistReplacement (moeoFitnessAssignment < MOEOT > &_evalFitness):evalFitness
(_evalFitness)
{
// a dummy diversity is used as default
moeoDummyDiversityAssignment < MOEOT > &dummyDiversityAssignment;
evalDiversity = dummyDiversityAssignment;
// a moeoFitThenDivComparator is used as default
moeoFitnessThenDiversityComparator < MOEOT > &fitThenDivComparator;
comparator = fitThenDivComparator;
}
/**
* Replace the first population by adding the individuals of the second one, sorting with a moeoComparator and resizing the whole population obtained.
* @param _parents the population composed of the parents (the population you want to replace)
* @param _offspring
*/
void operator () (eoPop < MOEOT > &_parents, eoPop < MOEOT > &_offspring)
{
unsigned sz = _parents.size ();
// merge offspring and parents into a global population ...
_parents.reserve (_parents.size () + _offspring.size ());
copy (_offspring.begin (), _offspring.end (), back_inserter (_parents));
// evaluate the fitness and the diversity of this global population
evalFitness (_parents);
evalDiversity (_parents);
// ... that we sort according to the comparator
std::sort (_parents.begin (), _parents.end (), comparator);
// finally, resize this global population
_parents.resize (sz);
_offspring.clear ();
}
protected:
moeoFitnessAssignment < MOEOT > &evalFitness;
moeoDiversityAssignment < MOEOT > &evalDiversity;
moeoComparator < MOEOT > &comparator;
};
#endif /*MOEOELITISTREPLACEMENT_H_ */

View file

@ -0,0 +1,25 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoEvalFunc.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOEVALFUNC_H_
#define MOEOEVALFUNC_H_
#include <eoEvalFunc.h>
/*
* Functor that evaluates one MOEO by setting all its objective values.
*/
template < class MOEOT > class moeoEvalFunc:public eoEvalFunc < MOEOT >
{
};
#endif /*MOEOEVALFUNC_H_ */

View file

@ -0,0 +1,183 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoFastNonDominatedSortingFitnessAssignment.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_
#define MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_
#include <eoPop.h>
#include <moeoFitnessAssignment.h>
#include <moeoComparator.h>
#include <moeoObjectiveVectorComparator.h>
/**
* Fitness assignment sheme based on Pareto-dominance count proposed in
* N. Srinivas, K. Deb, "Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms", Evolutionary Computation vol. 2, no. 3, pp. 221-248 (1994)
* and 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).
* This strategy is, for instance, used in NSGA and NSGA-II.
*/
template < class MOEOT > class moeoFastNonDominatedSortingFitnessAssignment:public moeoParetoBasedFitnessAssignment <
MOEOT
>
{
public:
/**
* Ctor
*/
moeoFastNonDominatedSortingFitnessAssignment ()
{
}
/**
* Computes fitness values for every solution contained in the population _pop
* @param _pop the population
*/
void operator () (eoPop < MOEOT > &_pop)
{
// number of objectives for the problem under consideration
unsigned nObjectives = MOEOT::ObjectiveVector::nObjectives ();
if (nObjectives == 1)
{
// one objective
oneObjective (_pop);
}
else if (nObjectives == 2)
{
// two objectives (the two objectives function is still to do)
mObjectives (_pop);
}
else if (nObjectives > 2)
{
// more than two objectives
mObjectives (_pop);
}
else
{
// problem with the number of objectives
throw std::
runtime_error
("Problem with the number of objectives in moeoFastNonDominatedSortingFitnessAssignment");
}
}
private:
/** the objective vector type of the solutions */
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
/** Functor to compare two objective vectors according to Pareto dominance relation */
moeoParetoObjectiveVectorComparator < ObjectiveVector > comparator;
/** Functor to compare two solutions on the first objective, then on the second, and so on */
moeoObjectiveComparator < MOEOT > objComparator;
/**
* Sets the fitness values for mono-objective problems
* @param _pop the population
*/
void oneObjective (eoPop < MOEOT > &_pop)
{
std::sort (_pop.begin (), _pop.end (), objComparator);
for (unsigned i = 0; i < _pop.size (); i++)
{
_pop[i].fitness (i + 1);
}
}
/**
* Sets the fitness values for bi-objective problems with a complexity of O(n log n), where n stands for the population size
* @param _pop the population
*/
void twoObjectives (eoPop < MOEOT > &_pop)
{
//... TO DO !
}
/**
* Sets the fitness values for problems with more than two objectives with a complexity of O(n² log n), where n stands for the population size
* @param _pop the population
*/
void mObjectives (eoPop < MOEOT > &_pop)
{
// S[i] = indexes of the individuals dominated by _pop[i]
std::vector < std::vector < unsigned >>S (_pop.size ());
// n[i] = number of individuals that dominate the individual _pop[i]
std::vector < unsigned >n (_pop.size (), 0);
// fronts: F[i] = indexes of the individuals contained in the ith front
std::vector < std::vector < unsigned >>F (_pop.size () + 1);
// used to store the number of the first front
F[1].reserve (_pop.size ());
// flag to comparae solutions
int comparatorFlag;
for (unsigned p = 0; p < _pop.size (); p++)
{
for (unsigned q = 0; q < _pop.size (); q++)
{
// comparison of the 2 solutions according to Pareto dominance
comparatorFlag =
comparator (_pop[p].objectiveVector (),
_pop[q].objectiveVector ());
// if p dominates q
if (comparatorFlag == 1)
{
// add q to the set of solutions dominated by p
S[p].push_back (q);
}
// if q dominates p
else if (comparatorFlag == -1)
{
// increment the domination counter of p
n[p]++;
}
}
// if no individual dominates p
if (n[p] == 0)
{
// p belongs to the first front
_pop[p].fitness (1);
F[1].push_back (p);
}
}
// front counter
unsigned counter = 1;
unsigned p, q;
while (!F[counter].empty ())
{
// used to store the number of the next front
F[counter + 1].reserve (_pop.size ());
for (unsigned i = 0; i < F[counter].size (); i++)
{
p = F[counter][i];
for (unsigned j = 0; j < S[p].size (); j++)
{
q = S[p][j];
n[q]--;
// if no individual dominates q anymore
if (n[q] == 0)
{
// q belongs to the next front
_pop[q].fitness (counter + 1);
F[counter + 1].push_back (q);
}
}
}
counter++;
}
}
};
#endif /*MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_ */

View file

@ -0,0 +1,62 @@
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
//-----------------------------------------------------------------------------
// moeoFitnessAssignment.h
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
/*
This library...
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
*/
//-----------------------------------------------------------------------------
#ifndef MOEOFITNESSASSIGNMENT_H_
#define MOEOFITNESSASSIGNMENT_H_
#include <eoFunctor.h>
#include <eoPop.h>
/**
* Functor that sets the fitness values of a whole population
*/
template < class MOEOT > class moeoFitnessAssignment:public eoUF < eoPop < MOEOT > &,
void >
{
};
/**
* moeoScalarFitnessAssignment is a moeoFitnessAssignment for scalar strategies
*/
template < class MOEOT > class moeoScalarFitnessAssignment:public moeoFitnessAssignment <
MOEOT >
{
};
/**
* moeoCriterionBasedFitnessAssignment is a moeoFitnessAssignment for criterion-based strategies
*/
template < class MOEOT > class moeoCriterionBasedFitnessAssignment:public moeoFitnessAssignment <
MOEOT >
{
};
/**
* moeoParetoBasedFitnessAssignment is a moeoFitnessAssignment for Pareto-based strategies
*/
template < class MOEOT > class moeoParetoBasedFitnessAssignment:public moeoFitnessAssignment <
MOEOT >
{
void operator () (eoPop < MOEOT > &_pop)
{
// do nothing for the moment ...
}
};
#endif /*MOEOFITNESSASSIGNMENT_H_ */

Some files were not shown because too many files have changed in this diff Show more