delete files for new sub-dirs
git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@367 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
parent
b5fb3b32bb
commit
c20c1918ec
42 changed files with 0 additions and 5260 deletions
|
|
@ -1,291 +0,0 @@
|
||||||
// -*- 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.
|
|
||||||
* Using some specific representations, you will have to define a copy constructor if the default one is not what you want.
|
|
||||||
* In the same cases, you will also have to define the affectation operator (operator=).
|
|
||||||
* Then, you will explicitly have to call the parent copy constructor and the parent affectation operator at the beginning of the corresponding implementation.
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity >
|
|
||||||
class MOEO : public EO < MOEOObjectiveVector >
|
|
||||||
{
|
|
||||||
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 (MOEO)");
|
|
||||||
}
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the objective vector of the current solution is smaller than the objective vector of _other on the first objective,
|
|
||||||
* then on the second, and so on (can be usefull for sorting/printing).
|
|
||||||
* You should implement another function in the sub-class of MOEO to have another sorting mecanism.
|
|
||||||
* @param _other the other MOEO object to compare with
|
|
||||||
*/
|
|
||||||
bool operator<(const MOEO & _other) const
|
|
||||||
{
|
|
||||||
return objectiveVector() < _other.objectiveVector();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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_*/
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
||||||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// moeoAchievementFitnessAssignment.h
|
|
||||||
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
|
|
||||||
/*
|
|
||||||
This library...
|
|
||||||
|
|
||||||
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
|
|
||||||
*/
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef MOEOACHIEVEMENTFITNESSASSIGNMENT_H_
|
|
||||||
#define MOEOACHIEVEMENTFITNESSASSIGNMENT_H_
|
|
||||||
|
|
||||||
#include <eoPop.h>
|
|
||||||
#include <moeoFitnessAssignment.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980).
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoAchievementFitnessAssignment : public moeoScalarFitnessAssignment < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** the objective vector type of the solutions */
|
|
||||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default ctor
|
|
||||||
* @param _reference reference point vector
|
|
||||||
* @param _lambdas weighted coefficients vector
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
// consistency check
|
|
||||||
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";
|
|
||||||
spn = 0.0001;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor with default values for lambdas (1/nObjectives)
|
|
||||||
* @param _reference reference point vector
|
|
||||||
* @param _spn arbitrary small positive number (0 < _spn << 1)
|
|
||||||
*/
|
|
||||||
moeoAchievementFitnessAssignment(ObjectiveVector & _reference, double _spn=0.0001) : reference(_reference), spn(_spn)
|
|
||||||
{
|
|
||||||
// compute the default values for lambdas
|
|
||||||
lambdas = vector < double > (ObjectiveVector::nObjectives());
|
|
||||||
for (unsigned i=0 ; i<lambdas.size(); i++)
|
|
||||||
{
|
|
||||||
lambdas[i] = 1.0 / ObjectiveVector::nObjectives();
|
|
||||||
}
|
|
||||||
// consistency check
|
|
||||||
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";
|
|
||||||
spn = 0.0001;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the fitness values for every solution contained in the population _pop
|
|
||||||
* @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
|
|
||||||
*/
|
|
||||||
void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
|
|
||||||
{
|
|
||||||
// nothing to do ;-)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the reference point
|
|
||||||
* @param _reference the new reference point
|
|
||||||
*/
|
|
||||||
void setReference(const ObjectiveVector & _reference)
|
|
||||||
{
|
|
||||||
reference = _reference;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/** the reference point */
|
|
||||||
ObjectiveVector reference;
|
|
||||||
/** the weighted coefficients vector */
|
|
||||||
vector < double > lambdas;
|
|
||||||
/** an arbitrary small positive number (0 < _spn << 1) */
|
|
||||||
double spn;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a big value (regarded as infinite)
|
|
||||||
*/
|
|
||||||
double inf() const
|
|
||||||
{
|
|
||||||
return std::numeric_limits<double>::max();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Computes the fitness value for a solution
|
|
||||||
* @param _moeo the solution
|
|
||||||
*/
|
|
||||||
void compute(MOEOT & _moeo)
|
|
||||||
{
|
|
||||||
unsigned nobj = MOEOT::ObjectiveVector::nObjectives();
|
|
||||||
double temp;
|
|
||||||
double min = inf();
|
|
||||||
double sum = 0;
|
|
||||||
for (unsigned obj=0; obj<nobj; obj++)
|
|
||||||
{
|
|
||||||
temp = lambdas[obj] * (reference[obj] - _moeo.objectiveVector()[obj]);
|
|
||||||
min = std::min(min, temp);
|
|
||||||
sum += temp;
|
|
||||||
}
|
|
||||||
_moeo.fitness(min + spn*sum);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOACHIEVEMENTFITNESSASSIGNMENT_H_*/
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// moeoAlgo.h
|
|
||||||
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
|
|
||||||
/*
|
|
||||||
This library...
|
|
||||||
|
|
||||||
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
|
|
||||||
*/
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef MOEOALGO_H_
|
|
||||||
#define MOEOALGO_H_
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract class for multi-objective algorithms.
|
|
||||||
*/
|
|
||||||
class moeoAlgo
|
|
||||||
{};
|
|
||||||
|
|
||||||
#endif /*MOEOALGO_H_*/
|
|
||||||
|
|
@ -1,180 +0,0 @@
|
||||||
// -*- 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>
|
|
||||||
#include <moeoObjectiveVectorComparator.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 _objectiveVector is dominated by the ith individual of the archive...
|
|
||||||
if ( comparator(_objectiveVector, operator[](i).objectiveVector()) )
|
|
||||||
{
|
|
||||||
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).objectiveVector() == _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 the jth solution contained in the archive is dominated by _moeo
|
|
||||||
if ( comparator(operator[](j).objectiveVector(), _moeo.objectiveVector()) )
|
|
||||||
{
|
|
||||||
operator[](j) = back();
|
|
||||||
pop_back();
|
|
||||||
}
|
|
||||||
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 _moeo is dominated by the jth solution contained in the archive
|
|
||||||
if ( comparator(_moeo.objectiveVector(), operator[](j).objectiveVector()) )
|
|
||||||
{
|
|
||||||
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]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the current archive contains the same objective vectors
|
|
||||||
* than the given archive _arch
|
|
||||||
* @param _arch the given archive
|
|
||||||
*/
|
|
||||||
bool equals (const moeoArchive < MOEOT > & _arch)
|
|
||||||
{
|
|
||||||
for (unsigned i=0; i<size(); i++)
|
|
||||||
{
|
|
||||||
if (! _arch.contains(operator[](i).objectiveVector()))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (unsigned i=0; i<_arch.size() ; i++)
|
|
||||||
{
|
|
||||||
if (! contains(_arch[i].objectiveVector()))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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_ */
|
|
||||||
|
|
@ -1,93 +0,0 @@
|
||||||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// moeoArchiveObjectiveVectorSavingUpdater.h
|
|
||||||
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
|
|
||||||
/*
|
|
||||||
This library...
|
|
||||||
|
|
||||||
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
|
|
||||||
*/
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_
|
|
||||||
#define MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_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 objective vectors of the solutions contained in an archive into a file at each generation.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoArchiveObjectiveVectorSavingUpdater : public eoUpdater
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor
|
|
||||||
* @param _arch local archive
|
|
||||||
* @param _filename target filename
|
|
||||||
* @param _count put this variable to true if you want a new file to be created each time () is called and to false if you only want the file to be updated
|
|
||||||
* @param _id own ID
|
|
||||||
*/
|
|
||||||
moeoArchiveObjectiveVectorSavingUpdater (moeoArchive<MOEOT> & _arch, const std::string & _filename, bool _count = false, int _id = -1) :
|
|
||||||
arch(_arch), filename(_filename), count(_count), counter(0), id(_id)
|
|
||||||
{}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves the fitness of the archive's members into the file
|
|
||||||
*/
|
|
||||||
void operator()() {
|
|
||||||
char buff[MAX_BUFFER_SIZE];
|
|
||||||
if (count)
|
|
||||||
{
|
|
||||||
if (id == -1)
|
|
||||||
{
|
|
||||||
sprintf (buff, "%s.%u", filename.c_str(), counter ++);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf (buff, "%s.%u.%u", filename.c_str(), id, counter ++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (id == -1)
|
|
||||||
{
|
|
||||||
sprintf (buff, "%s", filename.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf (buff, "%s.%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<MOEOT> & arch;
|
|
||||||
/** target filename */
|
|
||||||
std::string filename;
|
|
||||||
/** this variable is set to true if a new file have to be created each time () is called and to false if the file only HAVE to be updated */
|
|
||||||
bool count;
|
|
||||||
/** counter */
|
|
||||||
unsigned counter;
|
|
||||||
/** own ID */
|
|
||||||
int id;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_*/
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// moeoArchiveUpdater.h
|
|
||||||
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
|
|
||||||
/*
|
|
||||||
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 MOEOT >
|
|
||||||
class moeoArchiveUpdater : public eoUpdater
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor
|
|
||||||
* @param _arch an archive of non-dominated solutions
|
|
||||||
* @param _pop the main population
|
|
||||||
*/
|
|
||||||
moeoArchiveUpdater(moeoArchive < MOEOT > & _arch, const eoPop < MOEOT > & _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 < MOEOT > & arch;
|
|
||||||
/** the main population */
|
|
||||||
const eoPop < MOEOT > & pop;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOARCHIVEUPDATER_H_*/
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
// -*- 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 <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 Type >
|
|
||||||
class moeoCombinedLS : public moeoLS < MOEOT, Type >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor
|
|
||||||
* @param _first_mols the first multi-objective local search to add
|
|
||||||
*/
|
|
||||||
moeoCombinedLS(moeoLS < MOEOT, Type > & _first_mols)
|
|
||||||
{
|
|
||||||
combinedLS.push_back (& _first_mols);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a new local search to combine
|
|
||||||
* @param _mols the multi-objective local search to add
|
|
||||||
*/
|
|
||||||
void add(moeoLS < MOEOT, Type > & _mols)
|
|
||||||
{
|
|
||||||
combinedLS.push_back(& _mols);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gives a new solution in order to explore the neigborhood.
|
|
||||||
* The new non-dominated solutions are added to the archive
|
|
||||||
* @param _type the object to apply the local search to
|
|
||||||
* @param _arch the archive of non-dominated solutions
|
|
||||||
*/
|
|
||||||
void operator () (Type _type, moeoArchive < MOEOT > & _arch)
|
|
||||||
{
|
|
||||||
for (unsigned i=0; i<combinedLS.size(); i++)
|
|
||||||
combinedLS[i] -> operator()(_type, _arch);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/** the vector that contains the combined LS */
|
|
||||||
std::vector< moeoLS < MOEOT, Type > * > combinedLS;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOCOMBINEDLS_H_*/
|
|
||||||
|
|
@ -1,182 +0,0 @@
|
||||||
// -*- 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>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Functor allowing to compare two solutions.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoComparator : public eoBF < const MOEOT &, const MOEOT &, const bool >
|
|
||||||
{};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 < _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 cmp(_moeo1.objectiveVector(), _moeo2.objectiveVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/** the objective vector type of the solutions */
|
|
||||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
|
||||||
/** the corresponding comparator for objective vectors */
|
|
||||||
moeoObjectiveObjectiveVectorComparator < ObjectiveVector > cmp;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Functor allowing to compare two solutions according to one objective.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoOneObjectiveComparator : public moeoComparator < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor.
|
|
||||||
* @param _obj the index of objective
|
|
||||||
*/
|
|
||||||
moeoOneObjectiveComparator(unsigned _obj) : obj(_obj)
|
|
||||||
{
|
|
||||||
if (obj > MOEOT::ObjectiveVector::nObjectives())
|
|
||||||
{
|
|
||||||
throw std::runtime_error("Problem with the index of objective in moeoOneObjectiveComparator");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if _moeo1 < _moeo2 on the obj objective
|
|
||||||
* @param _moeo1 the first solution
|
|
||||||
* @param _moeo2 the second solution
|
|
||||||
*/
|
|
||||||
const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
|
||||||
{
|
|
||||||
return _moeo1.objectiveVector()[obj] < _moeo2.objectiveVector()[obj];
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
/** the index of objective */
|
|
||||||
unsigned obj;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 < _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 < _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 their fitness and diversity values, each according to its aggregative value.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoAggregativeComparator : public moeoComparator < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor.
|
|
||||||
* @param _weightFitness the weight for fitness
|
|
||||||
* @param _weightDiversity the weight for diversity
|
|
||||||
*/
|
|
||||||
moeoAggregativeComparator(double _weightFitness = 1.0, double _weightDiversity = 1.0) : weightFitness(_weightFitness), weightDiversity(_weightDiversity)
|
|
||||||
{}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if _moeo1 < _moeo2 according to the aggregation of their fitness and diversity values
|
|
||||||
* @param _moeo1 the first solution
|
|
||||||
* @param _moeo2 the second solution
|
|
||||||
*/
|
|
||||||
const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
|
||||||
{
|
|
||||||
return ( weightFitness * _moeo1.fitness() + weightDiversity * _moeo1.diversity() ) < ( weightFitness * _moeo2.fitness() + weightDiversity * _moeo2.diversity() );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
/** the weight for fitness */
|
|
||||||
double weightFitness;
|
|
||||||
/** the weight for diversity */
|
|
||||||
double weightDiversity;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif /*MOEOCOMPARATOR_H_*/
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
// -*- 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 <eoFunctor.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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_*/
|
|
||||||
|
|
@ -1,238 +0,0 @@
|
||||||
// -*- 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 <eoPop.h>
|
|
||||||
#include <moeoComparator.h>
|
|
||||||
#include <moeoDiversityAssignment.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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<double>::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 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)
|
|
||||||
{
|
|
||||||
cout << "WARNING : updateByDeleting not implemented in moeoCrowdingDiversityAssignment" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the distance values
|
|
||||||
* @param _pop the population
|
|
||||||
*/
|
|
||||||
virtual void setDistances (eoPop < MOEOT > & _pop)
|
|
||||||
{
|
|
||||||
double min, max, distance;
|
|
||||||
unsigned nObjectives = MOEOT::ObjectiveVector::nObjectives();
|
|
||||||
// set diversity to 0
|
|
||||||
for (unsigned i=0; i<_pop.size(); i++)
|
|
||||||
{
|
|
||||||
_pop[i].diversity(0);
|
|
||||||
}
|
|
||||||
// for each objective
|
|
||||||
for (unsigned obj=0; obj<nObjectives; obj++)
|
|
||||||
{
|
|
||||||
// comparator
|
|
||||||
moeoOneObjectiveComparator < MOEOT > comp(obj);
|
|
||||||
// sort
|
|
||||||
std::sort(_pop.begin(), _pop.end(), comp);
|
|
||||||
// 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 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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)
|
|
||||||
{
|
|
||||||
cout << "WARNING : updateByDeleting not implemented in moeoFrontByFrontCrowdingDistanceDiversityAssignment" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
using moeoCrowdingDistanceDiversityAssignment < MOEOT >::inf;
|
|
||||||
using moeoCrowdingDistanceDiversityAssignment < MOEOT >::tiny;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the distance values
|
|
||||||
* @param _pop the population
|
|
||||||
*/
|
|
||||||
void setDistances (eoPop < MOEOT > & _pop)
|
|
||||||
{
|
|
||||||
unsigned a,b;
|
|
||||||
double min, max, distance;
|
|
||||||
unsigned nObjectives = MOEOT::ObjectiveVector::nObjectives();
|
|
||||||
// set diversity to 0 for every individual
|
|
||||||
for (unsigned 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 i=a; i<=b; i++)
|
|
||||||
{
|
|
||||||
_pop[i].diversity(inf());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// else...
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// for each objective
|
|
||||||
for (unsigned obj=0; obj<nObjectives; obj++)
|
|
||||||
{
|
|
||||||
// sort in the descending order using the values of the objective 'obj'
|
|
||||||
moeoOneObjectiveComparator < MOEOT > 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 i=a+1; i<b; i++)
|
|
||||||
{
|
|
||||||
distance = (_pop[i-1].objectiveVector()[obj] - _pop[i+1].objectiveVector()[obj]) / (max-min);
|
|
||||||
_pop[i].diversity(_pop[i].diversity() + distance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// go to the next front
|
|
||||||
a = b+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the index of the last individual having the same fitness value than _pop[_start]
|
|
||||||
* @param _pop the population
|
|
||||||
* @param _start the index to start from
|
|
||||||
*/
|
|
||||||
unsigned lastIndex (eoPop < MOEOT > & _pop, unsigned _start)
|
|
||||||
{
|
|
||||||
unsigned i=_start;
|
|
||||||
while ( (i<_pop.size()-1) && (_pop[i].fitness()==_pop[i+1].fitness()) )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_*/
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
// -*- 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 <moeoComparator.h>
|
|
||||||
#include <moeoSelectOne.h>
|
|
||||||
#include <moeoSelectors.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Selection strategy that selects ONE individual by deterministic tournament.
|
|
||||||
*/
|
|
||||||
template < class MOEOT > class moeoDetTournamentSelect:public moeoSelectOne < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Full Ctor.
|
|
||||||
* @param _comparator the comparator (used to compare 2 individuals)
|
|
||||||
* @param _tSize the number of individuals in the tournament (default: 2)
|
|
||||||
*/
|
|
||||||
moeoDetTournamentSelect (moeoComparator < MOEOT > & _comparator, unsigned _tSize = 2) : 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 _tSize the number of individuals in the tournament (default: 2)
|
|
||||||
*/
|
|
||||||
moeoDetTournamentSelect (unsigned _tSize = 2) : comparator (defaultComparator), tSize (_tSize)
|
|
||||||
{
|
|
||||||
// consistency check
|
|
||||||
if (tSize < 2)
|
|
||||||
{
|
|
||||||
std::
|
|
||||||
cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n";
|
|
||||||
tSize = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the tournament to the given population
|
|
||||||
* @param _pop the population
|
|
||||||
*/
|
|
||||||
const MOEOT & operator() (const eoPop < MOEOT > &_pop)
|
|
||||||
{
|
|
||||||
// use the selector
|
|
||||||
return mo_deterministic_tournament (_pop, tSize, comparator);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/** the comparator (used to compare 2 individuals) */
|
|
||||||
moeoComparator < MOEOT > & comparator;
|
|
||||||
/** a fitness then diversity comparator can be used as default */
|
|
||||||
moeoFitnessThenDiversityComparator < MOEOT > defaultComparator;
|
|
||||||
/** the number of individuals in the tournament */
|
|
||||||
unsigned tSize;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEODETTOURNAMENTSELECT_H_ */
|
|
||||||
|
|
@ -1,93 +0,0 @@
|
||||||
// -*- 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 >
|
|
||||||
{
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 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 /*MOEODIVERSITYASSIGNMENT_H_*/
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
// -*- 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>
|
|
||||||
#include <moeoAlgo.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract class for multi-objective evolutionary algorithms.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoEA : public moeoAlgo, public eoAlgo < MOEOT > {};
|
|
||||||
|
|
||||||
|
|
||||||
#endif /*MOEOEA_H_*/
|
|
||||||
|
|
@ -1,218 +0,0 @@
|
||||||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// moeoEasyEA.h
|
|
||||||
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
|
|
||||||
/*
|
|
||||||
This library...
|
|
||||||
|
|
||||||
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
|
|
||||||
*/
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef _MOEOEASYEA_H
|
|
||||||
#define _MOEOEASYEA_H
|
|
||||||
|
|
||||||
#include <apply.h>
|
|
||||||
#include <eoPopEvalFunc.h>
|
|
||||||
#include <eoContinue.h>
|
|
||||||
#include <eoTransform.h>
|
|
||||||
#include <eoBreed.h>
|
|
||||||
#include <eoMergeReduce.h>
|
|
||||||
|
|
||||||
#include <moeoEA.h>
|
|
||||||
#include <moeoReplacement.h>
|
|
||||||
#include <eoSelect.h>
|
|
||||||
#include <moeoFitnessAssignment.h>
|
|
||||||
#include <moeoDiversityAssignment.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An easy class to design multi-objective evolutionary algorithms.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoEasyEA: public moeoEA < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor taking a breed and merge.
|
|
||||||
* @param _continuator the stopping criteria
|
|
||||||
* @param _eval the evaluation functions
|
|
||||||
* @param _breed the breeder
|
|
||||||
* @param _replace the replacement strategy
|
|
||||||
* @param _fitnessEval the fitness evaluation scheme
|
|
||||||
* @param _diversityEval the diversity evaluation scheme
|
|
||||||
* @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
|
|
||||||
*/
|
|
||||||
moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, moeoReplacement < MOEOT > & _replace,
|
|
||||||
moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
|
|
||||||
:
|
|
||||||
continuator(_continuator), eval (_eval), loopEval(_eval), popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
|
|
||||||
fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor taking a breed, a merge and a eoPopEval.
|
|
||||||
* @param _continuator the stopping criteria
|
|
||||||
* @param _popEval the evaluation functions for the whole population
|
|
||||||
* @param _breed the breeder
|
|
||||||
* @param _replace the replacement strategy
|
|
||||||
* @param _fitnessEval the fitness evaluation scheme
|
|
||||||
* @param _diversityEval the diversity evaluation scheme
|
|
||||||
* @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
|
|
||||||
*/
|
|
||||||
moeoEasyEA(eoContinue < MOEOT > & _continuator, eoPopEvalFunc < MOEOT > & _popEval, eoBreed < MOEOT > & _breed, moeoReplacement < MOEOT > & _replace,
|
|
||||||
moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
|
|
||||||
:
|
|
||||||
continuator(_continuator), eval (dummyEval), loopEval(dummyEval), popEval(_popEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
|
|
||||||
fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor taking a breed, a merge and a reduce.
|
|
||||||
* @param _continuator the stopping criteria
|
|
||||||
* @param _eval the evaluation functions
|
|
||||||
* @param _breed the breeder
|
|
||||||
* @param _merge the merge scheme
|
|
||||||
* @param _reduce the reduce scheme
|
|
||||||
* @param _fitnessEval the fitness evaluation scheme
|
|
||||||
* @param _diversityEval the diversity evaluation scheme
|
|
||||||
* @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
|
|
||||||
*/
|
|
||||||
moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, eoMerge < MOEOT > & _merge, eoReduce< MOEOT > & _reduce,
|
|
||||||
moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
|
|
||||||
:
|
|
||||||
continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(_merge,_reduce), replace(mergeReduce),
|
|
||||||
fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor taking a select, a transform and a replacement.
|
|
||||||
* @param _continuator the stopping criteria
|
|
||||||
* @param _eval the evaluation functions
|
|
||||||
* @param _select the selection scheme
|
|
||||||
* @param _transform the tranformation scheme
|
|
||||||
* @param _replace the replacement strategy
|
|
||||||
* @param _fitnessEval the fitness evaluation scheme
|
|
||||||
* @param _diversityEval the diversity evaluation scheme
|
|
||||||
* @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
|
|
||||||
*/
|
|
||||||
moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoSelect < MOEOT > & _select, eoTransform < MOEOT > & _transform, moeoReplacement < MOEOT > & _replace,
|
|
||||||
moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
|
|
||||||
:
|
|
||||||
continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
|
|
||||||
fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor taking a select, a transform, a merge and a reduce.
|
|
||||||
* @param _continuator the stopping criteria
|
|
||||||
* @param _eval the evaluation functions
|
|
||||||
* @param _select the selection scheme
|
|
||||||
* @param _transform the tranformation scheme
|
|
||||||
* @param _merge the merge scheme
|
|
||||||
* @param _reduce the reduce scheme
|
|
||||||
* @param _fitnessEval the fitness evaluation scheme
|
|
||||||
* @param _diversityEval the diversity evaluation scheme
|
|
||||||
* @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
|
|
||||||
*/
|
|
||||||
moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoSelect < MOEOT > & _select, eoTransform < MOEOT > & _transform, eoMerge < MOEOT > & _merge, eoReduce< MOEOT > & _reduce,
|
|
||||||
moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
|
|
||||||
:
|
|
||||||
continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(_merge,_reduce), replace(mergeReduce),
|
|
||||||
fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies a few generation of evolution to the population _pop.
|
|
||||||
* @param _pop the population
|
|
||||||
*/
|
|
||||||
virtual void operator()(eoPop < MOEOT > & _pop)
|
|
||||||
{
|
|
||||||
eoPop < MOEOT > offspring, empty_pop;
|
|
||||||
popEval(empty_pop, _pop); // A first eval of pop.
|
|
||||||
bool firstTime = true;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
unsigned pSize = _pop.size();
|
|
||||||
offspring.clear(); // new offspring
|
|
||||||
// fitness and diversity assignment (if you want to or if it is the first generation)
|
|
||||||
if (evalFitAndDivBeforeSelection || firstTime)
|
|
||||||
{
|
|
||||||
firstTime = false;
|
|
||||||
fitnessEval(_pop);
|
|
||||||
diversityEval(_pop);
|
|
||||||
}
|
|
||||||
breed(_pop, offspring);
|
|
||||||
popEval(_pop, offspring); // eval of parents + offspring if necessary
|
|
||||||
replace(_pop, offspring); // after replace, the new pop. is in _pop
|
|
||||||
if (pSize > _pop.size())
|
|
||||||
{
|
|
||||||
throw std::runtime_error("Population shrinking!");
|
|
||||||
}
|
|
||||||
else if (pSize < _pop.size())
|
|
||||||
{
|
|
||||||
throw std::runtime_error("Population growing!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (std::exception& e)
|
|
||||||
{
|
|
||||||
std::string s = e.what();
|
|
||||||
s.append( " in moeoEasyEA");
|
|
||||||
throw std::runtime_error( s );
|
|
||||||
}
|
|
||||||
} while (continuator(_pop));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/** the stopping criteria */
|
|
||||||
eoContinue < MOEOT > & continuator;
|
|
||||||
/** the evaluation functions */
|
|
||||||
eoEvalFunc < MOEOT > & eval;
|
|
||||||
/** to evaluate the whole population */
|
|
||||||
eoPopLoopEval < MOEOT > loopEval;
|
|
||||||
/** to evaluate the whole population */
|
|
||||||
eoPopEvalFunc < MOEOT > & popEval;
|
|
||||||
/** breed: a select followed by a transform */
|
|
||||||
eoSelectTransform < MOEOT > selectTransform;
|
|
||||||
/** the breeder */
|
|
||||||
eoBreed < MOEOT > & breed;
|
|
||||||
/** replacement: a merge followed by a reduce */
|
|
||||||
eoMergeReduce < MOEOT > mergeReduce;
|
|
||||||
/** the replacment strategy */
|
|
||||||
moeoReplacement < MOEOT > & replace;
|
|
||||||
/** the fitness assignment strategy */
|
|
||||||
moeoFitnessAssignment < MOEOT > & fitnessEval;
|
|
||||||
/** the diversity assignment strategy */
|
|
||||||
moeoDiversityAssignment < MOEOT > & diversityEval;
|
|
||||||
/** if this parameter is set to 'true', the fitness and the diversity of the whole population will be re-evaluated before the selection process */
|
|
||||||
bool evalFitAndDivBeforeSelection;
|
|
||||||
/** a dummy eval */
|
|
||||||
class eoDummyEval : public eoEvalFunc < MOEOT >
|
|
||||||
{ public: /** the dummy functor */
|
|
||||||
void operator()(MOEOT &) {}} dummyEval;
|
|
||||||
/** a dummy select */
|
|
||||||
class eoDummySelect : public eoSelect < MOEOT >
|
|
||||||
{ public: /** the dummy functor */
|
|
||||||
void operator()(const eoPop < MOEOT > &, eoPop < MOEOT > &) {} } dummySelect;
|
|
||||||
/** a dummy transform */
|
|
||||||
class eoDummyTransform : public eoTransform < MOEOT >
|
|
||||||
{ public: /** the dummy functor */
|
|
||||||
void operator()(eoPop < MOEOT > &) {} } dummyTransform;
|
|
||||||
/** a dummy merge */
|
|
||||||
eoNoElitism < MOEOT > dummyMerge;
|
|
||||||
/** a dummy reduce */
|
|
||||||
eoTruncate < MOEOT > dummyReduce;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOEASYEA_H_*/
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
// -*- 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 that consists in keeping the N best individuals.
|
|
||||||
*/
|
|
||||||
template < class MOEOT > class moeoElitistReplacement:public moeoReplacement < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Full constructor.
|
|
||||||
* @param _fitnessAssignment the fitness assignment strategy
|
|
||||||
* @param _diversityAssignment the diversity assignment strategy
|
|
||||||
* @param _comparator the comparator (used to compare 2 individuals)
|
|
||||||
*/
|
|
||||||
moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment, moeoComparator < MOEOT > & _comparator) :
|
|
||||||
fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (_comparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor without comparator. A moeoFitThenDivComparator is used as default.
|
|
||||||
* @param _fitnessAssignment the fitness assignment strategy
|
|
||||||
* @param _diversityAssignment the diversity assignment strategy
|
|
||||||
*/
|
|
||||||
moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment) :
|
|
||||||
fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (defaultComparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor without moeoDiversityAssignement. A dummy diversity is used as default.
|
|
||||||
* @param _fitnessAssignment the fitness assignment strategy
|
|
||||||
* @param _comparator the comparator (used to compare 2 individuals)
|
|
||||||
*/
|
|
||||||
moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoComparator < MOEOT > & _comparator) :
|
|
||||||
fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (_comparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor without moeoDiversityAssignement nor moeoComparator.
|
|
||||||
* A moeoFitThenDivComparator and a dummy diversity are used as default.
|
|
||||||
* @param _fitnessAssignment the fitness assignment strategy
|
|
||||||
*/
|
|
||||||
moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment) :
|
|
||||||
fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (defaultComparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replaces 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 the offspring population
|
|
||||||
*/
|
|
||||||
void operator () (eoPop < MOEOT > &_parents, eoPop < MOEOT > &_offspring)
|
|
||||||
{
|
|
||||||
unsigned sz = _parents.size ();
|
|
||||||
// merges offspring and parents into a global population
|
|
||||||
_parents.reserve (_parents.size () + _offspring.size ());
|
|
||||||
copy (_offspring.begin (), _offspring.end (), back_inserter (_parents));
|
|
||||||
// evaluates the fitness and the diversity of this global population
|
|
||||||
fitnessAssignment (_parents);
|
|
||||||
diversityAssignment (_parents);
|
|
||||||
// sorts the whole population according to the comparator
|
|
||||||
std::sort(_parents.begin(), _parents.end(), comparator);
|
|
||||||
// finally, resize this global population
|
|
||||||
_parents.resize (sz);
|
|
||||||
// and clear the offspring population
|
|
||||||
_offspring.clear ();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/** the fitness assignment strategy */
|
|
||||||
moeoFitnessAssignment < MOEOT > & fitnessAssignment;
|
|
||||||
/** the diversity assignment strategy */
|
|
||||||
moeoDiversityAssignment < MOEOT > & diversityAssignment;
|
|
||||||
/** a dummy diversity assignment can be used as default */
|
|
||||||
moeoDummyDiversityAssignment < MOEOT > defaultDiversity;
|
|
||||||
/** a fitness then diversity comparator can be used as default */
|
|
||||||
moeoFitnessThenDiversityComparator < MOEOT > defaultComparator;
|
|
||||||
/** this object is used to compare solutions in order to sort the population */
|
|
||||||
class Cmp
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Ctor.
|
|
||||||
* @param _comparator the comparator
|
|
||||||
*/
|
|
||||||
Cmp(moeoComparator < MOEOT > & _comp) : comp(_comp)
|
|
||||||
{}
|
|
||||||
/**
|
|
||||||
* Returns true if _moeo1 is greater than _moeo2 according to the comparator
|
|
||||||
* _moeo1 the first individual
|
|
||||||
* _moeo2 the first individual
|
|
||||||
*/
|
|
||||||
bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
|
||||||
{
|
|
||||||
return comp(_moeo2,_moeo1);
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
/** the comparator */
|
|
||||||
moeoComparator < MOEOT > & comp;
|
|
||||||
} comparator;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOELITISTREPLACEMENT_H_ */
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
||||||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// moeoEnvironmentalReplacement.h
|
|
||||||
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
|
|
||||||
/*
|
|
||||||
This library...
|
|
||||||
|
|
||||||
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
|
|
||||||
*/
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef MOEOENVIRONMENTALREPLACEMENT_H_
|
|
||||||
#define MOEOENVIRONMENTALREPLACEMENT_H_
|
|
||||||
|
|
||||||
#include <moeoReplacement.h>
|
|
||||||
#include <moeoComparator.h>
|
|
||||||
#include <moeoFitnessAssignment.h>
|
|
||||||
#include <moeoDiversityAssignment.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1
|
|
||||||
* and by updating the fitness and diversity values after each deletion.
|
|
||||||
*/
|
|
||||||
template < class MOEOT > class moeoEnvironmentalReplacement:public moeoReplacement < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** The type for objective vector */
|
|
||||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Full constructor.
|
|
||||||
* @param _fitnessAssignment the fitness assignment strategy
|
|
||||||
* @param _diversityAssignment the diversity assignment strategy
|
|
||||||
* @param _comparator the comparator (used to compare 2 individuals)
|
|
||||||
*/
|
|
||||||
moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment, moeoComparator < MOEOT > & _comparator) :
|
|
||||||
fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (_comparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor without comparator. A moeoFitThenDivComparator is used as default.
|
|
||||||
* @param _fitnessAssignment the fitness assignment strategy
|
|
||||||
* @param _diversityAssignment the diversity assignment strategy
|
|
||||||
*/
|
|
||||||
moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment) :
|
|
||||||
fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (defaultComparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor without moeoDiversityAssignement. A dummy diversity is used as default.
|
|
||||||
* @param _fitnessAssignment the fitness assignment strategy
|
|
||||||
* @param _comparator the comparator (used to compare 2 individuals)
|
|
||||||
*/
|
|
||||||
moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoComparator < MOEOT > & _comparator) :
|
|
||||||
fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (_comparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor without moeoDiversityAssignement nor moeoComparator.
|
|
||||||
* A moeoFitThenDivComparator and a dummy diversity are used as default.
|
|
||||||
* @param _fitnessAssignment the fitness assignment strategy
|
|
||||||
*/
|
|
||||||
moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment) :
|
|
||||||
fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (defaultComparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replaces 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 the offspring population
|
|
||||||
*/
|
|
||||||
void operator () (eoPop < MOEOT > &_parents, eoPop < MOEOT > &_offspring)
|
|
||||||
{
|
|
||||||
unsigned sz = _parents.size();
|
|
||||||
// merges offspring and parents into a global population
|
|
||||||
_parents.reserve (_parents.size() + _offspring.size());
|
|
||||||
copy (_offspring.begin(), _offspring.end(), back_inserter(_parents));
|
|
||||||
// evaluates the fitness and the diversity of this global population
|
|
||||||
fitnessAssignment (_parents);
|
|
||||||
diversityAssignment (_parents);
|
|
||||||
// remove individuals 1 by 1 and update the fitness values
|
|
||||||
unsigned worstIdx;
|
|
||||||
ObjectiveVector worstObjVec;
|
|
||||||
while (_parents.size() > sz)
|
|
||||||
{
|
|
||||||
// the individual to delete
|
|
||||||
worstIdx = std::min_element(_parents.begin(), _parents.end(), comparator) - _parents.begin();
|
|
||||||
worstObjVec = _parents[worstIdx].objectiveVector();
|
|
||||||
// remove the woorst individual
|
|
||||||
_parents[worstIdx] = _parents.back();
|
|
||||||
_parents.pop_back();
|
|
||||||
// update of the fitness and diversity values
|
|
||||||
fitnessAssignment.updateByDeleting(_parents, worstObjVec);
|
|
||||||
diversityAssignment.updateByDeleting(_parents, worstObjVec);
|
|
||||||
|
|
||||||
}
|
|
||||||
// clear the offspring population
|
|
||||||
_offspring.clear ();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/** the fitness assignment strategy */
|
|
||||||
moeoFitnessAssignment < MOEOT > & fitnessAssignment;
|
|
||||||
/** the diversity assignment strategy */
|
|
||||||
moeoDiversityAssignment < MOEOT > & diversityAssignment;
|
|
||||||
/** a dummy diversity assignment can be used as default */
|
|
||||||
moeoDummyDiversityAssignment < MOEOT > defaultDiversity;
|
|
||||||
/** a fitness then diversity comparator can be used as default */
|
|
||||||
moeoFitnessThenDiversityComparator < MOEOT > defaultComparator;
|
|
||||||
/** this object is used to compare solutions in order to sort the population */
|
|
||||||
class Cmp
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Ctor.
|
|
||||||
* @param _comparator the comparator
|
|
||||||
*/
|
|
||||||
Cmp(moeoComparator < MOEOT > & _comp) : comp(_comp)
|
|
||||||
{}
|
|
||||||
/**
|
|
||||||
* Returns true if _moeo1 is greater than _moeo2 according to the comparator
|
|
||||||
* _moeo1 the first individual
|
|
||||||
* _moeo2 the first individual
|
|
||||||
*/
|
|
||||||
bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
|
||||||
{
|
|
||||||
return comp(_moeo1,_moeo2);
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
/** the comparator */
|
|
||||||
moeoComparator < MOEOT > & comp;
|
|
||||||
} comparator;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOENVIRONMENTALREPLACEMENT_H_ */
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
// -*- 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_*/
|
|
||||||
|
|
@ -1,223 +0,0 @@
|
||||||
// -*- 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 <moeoComparator.h>
|
|
||||||
#include <moeoFitnessAssignment.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:
|
|
||||||
|
|
||||||
/** the objective vector type of the solutions */
|
|
||||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default ctor
|
|
||||||
*/
|
|
||||||
moeoFastNonDominatedSortingFitnessAssignment() : comparator(paretoComparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ctor where you can choose your own way to compare objective vectors
|
|
||||||
* @param _comparator the functor used to compare objective vectors
|
|
||||||
*/
|
|
||||||
moeoFastNonDominatedSortingFitnessAssignment(moeoObjectiveVectorComparator < ObjectiveVector > & _comparator) : comparator(_comparator)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the 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 implement)
|
|
||||||
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 moeoNonDominatedSortingFitnessAssignment");
|
|
||||||
}
|
|
||||||
// a higher fitness is better, so the values need to be inverted
|
|
||||||
double max = _pop[0].fitness();
|
|
||||||
for (unsigned i=1 ; i<_pop.size() ; i++)
|
|
||||||
{
|
|
||||||
max = std::max(max, _pop[i].fitness());
|
|
||||||
}
|
|
||||||
for (unsigned i=0 ; i<_pop.size() ; i++)
|
|
||||||
{
|
|
||||||
_pop[i].fitness(max - _pop[i].fitness());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the fitness 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)
|
|
||||||
{
|
|
||||||
for (unsigned i=0; i<_pop.size(); i++)
|
|
||||||
{
|
|
||||||
// if _pop[i] is dominated by _objVec
|
|
||||||
if ( comparator(_pop[i].objectiveVector(), _objVec) )
|
|
||||||
{
|
|
||||||
_pop[i].fitness(_pop[i].fitness()+1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/** Functor to compare two objective vectors */
|
|
||||||
moeoObjectiveVectorComparator < ObjectiveVector > & comparator;
|
|
||||||
/** Functor to compare two objective vectors according to Pareto dominance relation */
|
|
||||||
moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the fitness values for mono-objective problems
|
|
||||||
* @param _pop the population
|
|
||||||
*/
|
|
||||||
void oneObjective (eoPop < MOEOT > & _pop)
|
|
||||||
{
|
|
||||||
// Functor to compare two solutions on the first objective, then on the second, and so on
|
|
||||||
moeoObjectiveComparator < MOEOT > objComparator;
|
|
||||||
// sorts the population in the ascending order
|
|
||||||
std::sort(_pop.begin(), _pop.end(), objComparator);
|
|
||||||
// assign fitness values
|
|
||||||
unsigned rank = 1;
|
|
||||||
_pop[_pop.size()-1].fitness(rank);
|
|
||||||
for (unsigned i=_pop.size()-2; i>=0; i--)
|
|
||||||
{
|
|
||||||
if (_pop[i].objectiveVector() != _pop[i+1].objectiveVector())
|
|
||||||
{
|
|
||||||
rank++;
|
|
||||||
}
|
|
||||||
_pop[i].fitness(rank);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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()+2);
|
|
||||||
// used to store the number of the first front
|
|
||||||
F[1].reserve(_pop.size());
|
|
||||||
for (unsigned p=0; p<_pop.size(); p++)
|
|
||||||
{
|
|
||||||
for (unsigned q=0; q<_pop.size(); q++)
|
|
||||||
{
|
|
||||||
// if q is dominated by p
|
|
||||||
if ( comparator(_pop[q].objectiveVector(), _pop[p].objectiveVector()) )
|
|
||||||
{
|
|
||||||
// add q to the set of solutions dominated by p
|
|
||||||
S[p].push_back(q);
|
|
||||||
}
|
|
||||||
// if p is dominated by q
|
|
||||||
else if ( comparator(_pop[p].objectiveVector(), _pop[q].objectiveVector()) )
|
|
||||||
{
|
|
||||||
// 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_*/
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
||||||
// -*- 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 >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** The type for objective vector */
|
|
||||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the fitness 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 fitness 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());
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* moeoDummyFitnessAssignment is a moeoFitnessAssignment that gives the value '0' as the individual's fitness for a whole population if it is invalid.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoDummyFitnessAssignment : public moeoFitnessAssignment < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/** The type for objective vector */
|
|
||||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the fitness 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++)
|
|
||||||
{
|
|
||||||
if (_pop[idx].invalidFitness())
|
|
||||||
{
|
|
||||||
// set the diversity to 0
|
|
||||||
_pop[idx].fitness(0.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the fitness 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... ;-)
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 >
|
|
||||||
{};
|
|
||||||
|
|
||||||
|
|
||||||
#endif /*MOEOFITNESSASSIGNMENT_H_*/
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// moeoGenerationalReplacement.h
|
|
||||||
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
|
|
||||||
/*
|
|
||||||
This library...
|
|
||||||
|
|
||||||
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
|
|
||||||
*/
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef MOEOGENERATIONALREPLACEMENT_H_
|
|
||||||
#define MOEOGENERATIONALREPLACEMENT_H_
|
|
||||||
|
|
||||||
#include <eoReplacement.h>
|
|
||||||
#include <moeoReplacement.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generational replacement: only the new individuals are preserved.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoGenerationalReplacement : public moeoReplacement < MOEOT >, public eoGenerationalReplacement < MOEOT >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Swaps _parents and _offspring
|
|
||||||
* @param _parents the parents population
|
|
||||||
* @param _offspring the offspring population
|
|
||||||
*/
|
|
||||||
void operator()(eoPop < MOEOT > & _parents, eoPop < MOEOT > & _offspring)
|
|
||||||
{
|
|
||||||
eoGenerationalReplacement < MOEOT >::operator ()(_parents, _offspring);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*MOEOGENERATIONALREPLACEMENT_H_*/
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue