Modifications 22/02/2007
git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@183 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
parent
dccd731ad3
commit
8312d91a84
19 changed files with 930 additions and 805 deletions
|
|
@ -31,250 +31,253 @@
|
||||||
* operator '<' et '>' ???
|
* operator '<' et '>' ???
|
||||||
* !!!!!!!!!!!!!!!!!!!!!!!
|
* !!!!!!!!!!!!!!!!!!!!!!!
|
||||||
*/
|
*/
|
||||||
template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity >
|
template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity > class MOEO:public EO <
|
||||||
class MOEO : public EO < MOEOFitness >
|
MOEOFitness
|
||||||
|
>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** the objective vector type of a solution */
|
/** the objective vector type of a solution */
|
||||||
typedef MOEOObjectiveVector ObjectiveVector;
|
typedef MOEOObjectiveVector ObjectiveVector;
|
||||||
|
|
||||||
/** the fitness type of a solution */
|
/** the fitness type of a solution */
|
||||||
typedef MOEOFitness Fitness;
|
typedef MOEOFitness Fitness;
|
||||||
|
|
||||||
/** the diversity type of a solution */
|
/** the diversity type of a solution */
|
||||||
typedef MOEODiversity Diversity;
|
typedef MOEODiversity Diversity;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor
|
* Ctor
|
||||||
*/
|
*/
|
||||||
MOEO()
|
MOEO ()
|
||||||
{
|
{
|
||||||
// default values for every parameters
|
// default values for every parameters
|
||||||
objectiveVectorValue = ObjectiveVector();
|
objectiveVectorValue = ObjectiveVector ();
|
||||||
fitnessValue = Fitness();
|
fitnessValue = Fitness ();
|
||||||
diversityValue = Diversity();
|
diversityValue = Diversity ();
|
||||||
// invalidate all
|
// invalidate all
|
||||||
invalidate();
|
invalidate ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual dtor
|
* Virtual dtor
|
||||||
*/
|
*/
|
||||||
virtual ~MOEO() {};
|
virtual ~ MOEO ()
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the objective vector of the current solution
|
* Returns the objective vector of the current solution
|
||||||
*/
|
*/
|
||||||
ObjectiveVector objectiveVector() const
|
ObjectiveVector objectiveVector () const
|
||||||
{
|
{
|
||||||
if ( invalidObjectiveVector() )
|
if (invalidObjectiveVector ())
|
||||||
{
|
{
|
||||||
throw std::runtime_error("invalid objective vector");
|
throw std::runtime_error ("invalid objective vector");
|
||||||
}
|
}
|
||||||
return objectiveVectorValue;
|
return objectiveVectorValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the objective vector of the current solution
|
* Sets the objective vector of the current solution
|
||||||
* @param _objectiveVectorValue the new objective vector
|
* @param _objectiveVectorValue the new objective vector
|
||||||
*/
|
*/
|
||||||
void objectiveVector(const ObjectiveVector & _objectiveVectorValue)
|
void objectiveVector (const ObjectiveVector & _objectiveVectorValue)
|
||||||
{
|
{
|
||||||
objectiveVectorValue = _objectiveVectorValue;
|
objectiveVectorValue = _objectiveVectorValue;
|
||||||
invalidObjectiveVectorValue = false;
|
invalidObjectiveVectorValue = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the objective vector as invalid
|
* Sets the objective vector as invalid
|
||||||
*/
|
*/
|
||||||
void invalidateObjectiveVector()
|
void invalidateObjectiveVector ()
|
||||||
{
|
{
|
||||||
invalidObjectiveVectorValue = true;
|
invalidObjectiveVectorValue = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the objective vector is invalid, false otherwise
|
* Returns true if the objective vector is invalid, false otherwise
|
||||||
*/
|
*/
|
||||||
bool invalidObjectiveVector() const
|
bool invalidObjectiveVector () const
|
||||||
{
|
{
|
||||||
return invalidObjectiveVectorValue;
|
return invalidObjectiveVectorValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the fitness value of the current solution
|
* Returns the fitness value of the current solution
|
||||||
*/
|
*/
|
||||||
Fitness fitness() const
|
Fitness fitness () const
|
||||||
{
|
{
|
||||||
if ( invalidFitness() )
|
if (invalidFitness ())
|
||||||
{
|
{
|
||||||
throw std::runtime_error("invalid fitness");
|
throw std::runtime_error ("invalid fitness");
|
||||||
}
|
}
|
||||||
return fitnessValue;
|
return fitnessValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the fitness value of the current solution
|
* Sets the fitness value of the current solution
|
||||||
* @param _fitnessValue the new fitness value
|
* @param _fitnessValue the new fitness value
|
||||||
*/
|
*/
|
||||||
void fitness(const Fitness & _fitnessValue)
|
void fitness (const Fitness & _fitnessValue)
|
||||||
{
|
{
|
||||||
fitnessValue = _fitnessValue;
|
fitnessValue = _fitnessValue;
|
||||||
invalidFitnessValue = false;
|
invalidFitnessValue = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the fitness value as invalid
|
* Sets the fitness value as invalid
|
||||||
*/
|
*/
|
||||||
void invalidateFitness()
|
void invalidateFitness ()
|
||||||
{
|
{
|
||||||
invalidFitnessValue = true;
|
invalidFitnessValue = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the fitness value is invalid, false otherwise
|
* Returns true if the fitness value is invalid, false otherwise
|
||||||
*/
|
*/
|
||||||
bool invalidFitness() const
|
bool invalidFitness () const
|
||||||
{
|
{
|
||||||
return invalidFitnessValue;
|
return invalidFitnessValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the diversity value of the current solution
|
* Returns the diversity value of the current solution
|
||||||
*/
|
*/
|
||||||
Diversity diversity() const
|
Diversity diversity () const
|
||||||
{
|
{
|
||||||
if ( invalidDiversity() )
|
if (invalidDiversity ())
|
||||||
{
|
{
|
||||||
throw std::runtime_error("invalid diversity");
|
throw std::runtime_error ("invalid diversity");
|
||||||
}
|
}
|
||||||
return diversityValue;
|
return diversityValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the diversity value of the current solution
|
* Sets the diversity value of the current solution
|
||||||
* @param _diversityValue the new diversity value
|
* @param _diversityValue the new diversity value
|
||||||
*/
|
*/
|
||||||
void diversity(const Diversity & _diversityValue)
|
void diversity (const Diversity & _diversityValue)
|
||||||
{
|
{
|
||||||
diversityValue = _diversityValue;
|
diversityValue = _diversityValue;
|
||||||
invalidDiversityValue = false;
|
invalidDiversityValue = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the diversity value as invalid
|
* Sets the diversity value as invalid
|
||||||
*/
|
*/
|
||||||
void invalidateDiversity()
|
void invalidateDiversity ()
|
||||||
{
|
{
|
||||||
invalidDiversityValue = true;
|
invalidDiversityValue = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the diversity value is invalid, false otherwise
|
* Returns true if the diversity value is invalid, false otherwise
|
||||||
*/
|
*/
|
||||||
bool invalidDiversity() const
|
bool invalidDiversity () const
|
||||||
{
|
{
|
||||||
return invalidDiversityValue;
|
return invalidDiversityValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the objective vector, the fitness value and the diversity value as invalid
|
* Sets the objective vector, the fitness value and the diversity value as invalid
|
||||||
*/
|
*/
|
||||||
void invalidate()
|
void invalidate ()
|
||||||
{
|
{
|
||||||
invalidateObjectiveVector();
|
invalidateObjectiveVector ();
|
||||||
invalidateFitness();
|
invalidateFitness ();
|
||||||
invalidateDiversity();
|
invalidateDiversity ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the fitness value is invalid, false otherwise
|
* Returns true if the fitness value is invalid, false otherwise
|
||||||
*/
|
*/
|
||||||
bool invalid() const
|
bool invalid () const
|
||||||
{
|
{
|
||||||
return invalidObjectiveVector();
|
return invalidObjectiveVector ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the class id (the class name as a std::string)
|
* Return the class id (the class name as a std::string)
|
||||||
*/
|
*/
|
||||||
virtual std::string className() const
|
virtual std::string className () const
|
||||||
{
|
{
|
||||||
return "MOEO";
|
return "MOEO";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writing object
|
* Writing object
|
||||||
* @param _os output stream
|
* @param _os output stream
|
||||||
*/
|
*/
|
||||||
virtual void printOn(std::ostream & _os) const
|
virtual void printOn (std::ostream & _os) const
|
||||||
{
|
{
|
||||||
if ( invalidObjectiveVector() )
|
if (invalidObjectiveVector ())
|
||||||
{
|
{
|
||||||
_os << "INVALID\t";
|
_os << "INVALID\t";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_os << objectiveVectorValue << '\t';
|
_os << objectiveVectorValue << '\t';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reading object
|
* Reading object
|
||||||
* @param _is input stream
|
* @param _is input stream
|
||||||
*/
|
*/
|
||||||
virtual void readFrom(std::istream & _is)
|
virtual void readFrom (std::istream & _is)
|
||||||
{
|
{
|
||||||
std::string objectiveVector_str;
|
std::string objectiveVector_str;
|
||||||
int pos = _is.tellg();
|
int pos = _is.tellg ();
|
||||||
_is >> objectiveVector_str;
|
_is >> objectiveVector_str;
|
||||||
if (objectiveVector_str == "INVALID")
|
if (objectiveVector_str == "INVALID")
|
||||||
{
|
{
|
||||||
invalidateObjectiveVector();
|
invalidateObjectiveVector ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
invalidObjectiveVectorValue = false;
|
invalidObjectiveVectorValue = false;
|
||||||
_is.seekg(pos); // rewind
|
_is.seekg (pos); // rewind
|
||||||
_is >> objectiveVectorValue;
|
_is >> objectiveVectorValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** the objective vector of this solution */
|
/** the objective vector of this solution */
|
||||||
ObjectiveVector objectiveVectorValue;
|
ObjectiveVector objectiveVectorValue;
|
||||||
/** true if the objective vector is invalid */
|
/** true if the objective vector is invalid */
|
||||||
bool invalidObjectiveVectorValue;
|
bool invalidObjectiveVectorValue;
|
||||||
/** the fitness value of this solution */
|
/** the fitness value of this solution */
|
||||||
Fitness fitnessValue;
|
Fitness fitnessValue;
|
||||||
/** true if the fitness value is invalid */
|
/** true if the fitness value is invalid */
|
||||||
bool invalidFitnessValue;
|
bool invalidFitnessValue;
|
||||||
/** the diversity value of this solution */
|
/** the diversity value of this solution */
|
||||||
Diversity diversityValue;
|
Diversity diversityValue;
|
||||||
/** true if the diversity value is invalid */
|
/** true if the diversity value is invalid */
|
||||||
bool invalidDiversityValue;
|
bool invalidDiversityValue;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*MOEO_H_*/
|
#endif /*MOEO_H_ */
|
||||||
|
|
|
||||||
|
|
@ -14,140 +14,147 @@
|
||||||
#define MOEOARCHIVE_H_
|
#define MOEOARCHIVE_H_
|
||||||
|
|
||||||
#include <eoPop.h>
|
#include <eoPop.h>
|
||||||
#include <moeoObjectiveVectorComparator.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An archive is a secondary population that stores non-dominated solutions.
|
* An archive is a secondary population that stores non-dominated solutions
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoArchive:public eoPop < MOEOT >
|
||||||
class moeoArchive : public eoPop < MOEOT >
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
using std::vector < MOEOT > :: size;
|
using std::vector < MOEOT >::size;
|
||||||
using std::vector < MOEOT > :: operator[];
|
using std::vector < MOEOT >::operator[];
|
||||||
using std::vector < MOEOT > :: back;
|
using std::vector < MOEOT >::back;
|
||||||
using std::vector < MOEOT > :: pop_back;
|
using std::vector < MOEOT >::pop_back;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The type of an objective vector for a solution
|
* The type of an objective vector for a solution
|
||||||
*/
|
*/
|
||||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default ctor.
|
* Default ctor.
|
||||||
* The moeoObjectiveVectorComparator used to compare solutions is based on Pareto dominance
|
* The moeoObjectiveVectorComparator used to compare solutions is based on Pareto dominance
|
||||||
*/
|
*/
|
||||||
moeoArchive() : eoPop < MOEOT >(), comparator(paretoComparator)
|
moeoArchive ():eoPop < MOEOT > (), comparator (paretoComparator)
|
||||||
{}
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor
|
* Ctor
|
||||||
* @param _comparator the moeoObjectiveVectorComparator used to compare solutions
|
* @param _comparator the moeoObjectiveVectorComparator used to compare solutions
|
||||||
*/
|
*/
|
||||||
moeoArchive(moeoObjectiveVectorComparator < ObjectiveVector > & _comparator) : eoPop < MOEOT >(), comparator(_comparator)
|
moeoArchive (moeoObjectiveVectorComparator < ObjectiveVector > &_comparator):eoPop < MOEOT > (),
|
||||||
{}
|
comparator
|
||||||
|
(_comparator)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the current archive dominates _objectiveVector according to the moeoObjectiveVectorComparator given in the constructor
|
* 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
|
* @param _objectiveVector the objective vector to compare with the current archive
|
||||||
*/
|
*/
|
||||||
bool dominates (const ObjectiveVector & _objectiveVector) const
|
bool dominates (const ObjectiveVector & _objectiveVector) const
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i<size(); i++)
|
for (unsigned i = 0; i < size (); i++)
|
||||||
{
|
{
|
||||||
if ( comparator(operator[](i).fitness(), _objectiveVector) == 1 )
|
if (comparator (operator[](i).fitness (), _objectiveVector) == 1)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the current archive already contains a solution with the same objective values than _objectiveVector
|
* 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
|
* @param _objectiveVector the objective vector to compare with the current archive
|
||||||
*/
|
*/
|
||||||
bool contains (const ObjectiveVector & _objectiveVector) const
|
bool contains (const ObjectiveVector & _objectiveVector) const
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i<size(); i++)
|
for (unsigned i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
if (operator[](i).fitness() == _objectiveVector)
|
if (operator[](i).fitness () == _objectiveVector)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the archive with a given individual _moeo
|
* Updates the archive with a given individual _moeo
|
||||||
* @param _moeo the given individual
|
* @param _moeo the given individual
|
||||||
*/
|
*/
|
||||||
void update (const MOEOT & _moeo)
|
void update (const MOEOT & _moeo)
|
||||||
{
|
{
|
||||||
// first step: removing the dominated solutions from the archive
|
// first step: removing the dominated solutions from the archive
|
||||||
for (unsigned j=0; j<size();)
|
for (unsigned j = 0; j < size ();)
|
||||||
{
|
{
|
||||||
// if _moeo dominates the jth solution contanied in the archive
|
// if _moeo.fitness() dominates operator[](j).fitness()
|
||||||
if ( comparator(_moeo.objectiveVector(), operator[](j).objectiveVector())==1 )
|
//if ( comparator(_moeo.fitness(), operator[](j).fitness())==1 )
|
||||||
{
|
if (comparator
|
||||||
operator[](j) = back();
|
(_moeo.objectiveVector (), operator[](j).objectiveVector ()) == 1)
|
||||||
pop_back();
|
{
|
||||||
}
|
operator[](j) = back ();
|
||||||
else if (_moeo.objectiveVector() == operator[](j).objectiveVector())
|
pop_back ();
|
||||||
{
|
}
|
||||||
operator[](j) = back();
|
//else if (_moeo.fitness() == operator[](j).fitness())
|
||||||
pop_back();
|
else if (_moeo.objectiveVector () == operator[](j).objectiveVector ())
|
||||||
}
|
{
|
||||||
else
|
operator[](j) = back ();
|
||||||
{
|
pop_back ();
|
||||||
j++;
|
}
|
||||||
}
|
else
|
||||||
}
|
{
|
||||||
// second step: is _moeo dominated?
|
j++;
|
||||||
bool dom = false;
|
}
|
||||||
for (unsigned j=0; j<size(); j++)
|
}
|
||||||
{
|
// second step: is _moeo dominated?
|
||||||
// if the jth solution contanied in the archive dominates _moeo
|
bool dom = false;
|
||||||
if ( comparator(operator[](j).objectiveVector(), _moeo.objectiveVector()) == 1 )
|
for (unsigned j = 0; j < size (); j++)
|
||||||
{
|
{
|
||||||
dom = true;
|
// if operator[](j).fitness() dominates _moeo.fitness()
|
||||||
break;
|
//if ( comparator(operator[](j).fitness(), _moeo.fitness())==1 )
|
||||||
}
|
if (comparator
|
||||||
}
|
(operator[](j).objectiveVector (), _moeo.objectiveVector ()) == 1)
|
||||||
if (!dom)
|
{
|
||||||
{
|
dom = true;
|
||||||
push_back(_moeo);
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!dom)
|
||||||
|
{
|
||||||
|
push_back (_moeo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the archive with a given population _pop
|
* Updates the archive with a given population _pop
|
||||||
* @param _pop the given population
|
* @param _pop the given population
|
||||||
*/
|
*/
|
||||||
void update (const eoPop < MOEOT > & _pop)
|
void update (const eoPop < MOEOT > &_pop)
|
||||||
{
|
{
|
||||||
for (unsigned i=0; i<_pop.size(); i++)
|
for (unsigned i = 0; i < _pop.size (); i++)
|
||||||
{
|
{
|
||||||
update(_pop[i]);
|
update (_pop[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** The moeoObjectiveVectorComparator used to compare solutions */
|
/** The moeoObjectiveVectorComparator used to compare solutions */
|
||||||
moeoObjectiveVectorComparator < ObjectiveVector > & comparator;
|
moeoObjectiveVectorComparator < ObjectiveVector > &comparator;
|
||||||
/** A moeoObjectiveVectorComparator based on Pareto dominance (used as default) */
|
/** A moeoObjectiveVectorComparator based on Pareto dominance (used as default) */
|
||||||
moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
|
moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,7 @@
|
||||||
/**
|
/**
|
||||||
* This class allows to save the fitnesses of solutions contained in an archive into a file at each generation.
|
* This class allows to save the fitnesses of solutions contained in an archive into a file at each generation.
|
||||||
*/
|
*/
|
||||||
template <class EOT>
|
template < class EOT > class moeoArchiveFitnessSavingUpdater:public eoUpdater
|
||||||
class moeoArchiveFitnessSavingUpdater : public eoUpdater
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -35,21 +34,25 @@ public:
|
||||||
* @param _filename target filename
|
* @param _filename target filename
|
||||||
* @param _id own ID
|
* @param _id own ID
|
||||||
*/
|
*/
|
||||||
moeoArchiveFitnessSavingUpdater (moeoArchive<EOT> & _arch, const std::string & _filename = "Res/Arch", int _id = -1) : arch(_arch), filename(_filename), id(_id), counter(0)
|
moeoArchiveFitnessSavingUpdater (moeoArchive < EOT > &_arch, const std::string & _filename = "Res/Arch", int _id = -1):arch (_arch), filename (_filename), id (_id),
|
||||||
{}
|
counter
|
||||||
|
(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves the fitness of the archive's members into the file
|
* Saves the fitness of the archive's members into the file
|
||||||
*/
|
*/
|
||||||
void operator()() {
|
void operator () ()
|
||||||
|
{
|
||||||
char buff[MAX_BUFFER_SIZE];
|
char buff[MAX_BUFFER_SIZE];
|
||||||
if (id == -1)
|
if (id == -1)
|
||||||
sprintf (buff, "%s.%u", filename.c_str(), counter ++);
|
sprintf (buff, "%s.%u", filename.c_str (), counter++);
|
||||||
else
|
else
|
||||||
sprintf (buff, "%s.%u.%u", filename.c_str(), id, counter ++);
|
sprintf (buff, "%s.%u.%u", filename.c_str (), id, counter++);
|
||||||
std::ofstream f(buff);
|
std::ofstream f (buff);
|
||||||
for (unsigned i = 0; i < arch.size (); i++)
|
for (unsigned i = 0; i < arch.size (); i++)
|
||||||
f << arch[i].objectiveVector() << std::endl;
|
f << arch[i].objectiveVector () << std::endl;
|
||||||
f.close ();
|
f.close ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,14 +60,14 @@ public:
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** local archive */
|
/** local archive */
|
||||||
moeoArchive<EOT> & arch;
|
moeoArchive < EOT > &arch;
|
||||||
/** target filename */
|
/** target filename */
|
||||||
std::string filename;
|
std::string filename;
|
||||||
/** own ID */
|
/** own ID */
|
||||||
int id;
|
int id;
|
||||||
/** counter */
|
/** counter */
|
||||||
unsigned counter;
|
unsigned counter;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*MOEOARCHIVEFITNESSSAVINGUPDATER_H_*/
|
#endif /*MOEOARCHIVEFITNESSSAVINGUPDATER_H_ */
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,9 @@
|
||||||
#include <moeoArchive.h>
|
#include <moeoArchive.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class allows to update the archive at each generation with newly found non-dominated solutions.
|
* This class allows to update the archive at each generation with newly found non-dominated solutions
|
||||||
*/
|
*/
|
||||||
template < class EOT >
|
template < class EOT > class moeoArchiveUpdater:public eoUpdater
|
||||||
class moeoArchiveUpdater : public eoUpdater
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -30,25 +29,28 @@ public:
|
||||||
* @param _arch an archive of non-dominated solutions
|
* @param _arch an archive of non-dominated solutions
|
||||||
* @param _pop the main population
|
* @param _pop the main population
|
||||||
*/
|
*/
|
||||||
moeoArchiveUpdater(moeoArchive <EOT> & _arch, const eoPop<EOT> & _pop) : arch(_arch), pop(_pop)
|
moeoArchiveUpdater (moeoArchive < EOT > &_arch,
|
||||||
{}
|
const eoPop < EOT > &_pop):arch (_arch), pop (_pop)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the archive with newly found non-dominated solutions contained in the main population
|
* Updates the archive with newly found non-dominated solutions contained in the main population
|
||||||
*/
|
*/
|
||||||
void operator()() {
|
void operator () ()
|
||||||
arch.update(pop);
|
{
|
||||||
|
arch.update (pop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** the archive of non-dominated solutions */
|
/** the archive of non-dominated solutions */
|
||||||
moeoArchive<EOT> & arch;
|
moeoArchive < EOT > &arch;
|
||||||
/** the main population */
|
/** the main population */
|
||||||
const eoPop<EOT> & pop;
|
const eoPop < EOT > &pop;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*MOEOARCHIVEUPDATER_H_*/
|
#endif /*MOEOARCHIVEUPDATER_H_ */
|
||||||
|
|
|
||||||
|
|
@ -19,53 +19,53 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class allows to embed a set of local searches that are sequentially applied,
|
* 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.
|
* and so working and updating the same archive of non-dominated solutions
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoCombinedLS:public moeoLS < MOEOT >
|
||||||
class moeoCombinedLS : public moeoLS < MOEOT >
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor
|
* Ctor
|
||||||
* @param _eval the full evaluator of a solution
|
* @param _eval the full evaluator of a solution
|
||||||
* @param _first_mols the first multi-objective local search to add
|
* @param _first_ls the first multi-objective local search to add
|
||||||
*/
|
*/
|
||||||
moeoCombinedLS(moeoEvalFunc < MOEOT > & _eval, moeoLS < MOEOT > & _first_mols) : eval (_eval)
|
moeoCombinedLS (moeoEvalFunc < MOEOT > &_eval, moeoLS < MOEOT > &_first_ls):eval
|
||||||
{
|
(_eval)
|
||||||
combinedLS.push_back (& _first_mols);
|
{
|
||||||
}
|
combinedLS.push_back (&_first_ls);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a new local search to combine
|
* Adds a new local search to combine
|
||||||
* @param _mols the multi-objective local search to add
|
* @param _ls the multi-objective local search to add
|
||||||
*/
|
*/
|
||||||
void add(moeoLS < MOEOT > & _mols)
|
void add (moeoLS < MOEOT > &_ls)
|
||||||
{
|
{
|
||||||
combinedMOLS.push_back(& _mols);
|
combinedMOLS.push_back (&_ls);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gives a new solution in order to explore the neigborhood.
|
* Gives a new solution in order to explore the neigborhood.
|
||||||
* The new non-dominated solutions are added to the archive
|
* The new non-dominated solutions are added to the archive
|
||||||
* @param _moeo the solution
|
* @param _eo the solution
|
||||||
* @param _arch the archive of non-dominated solutions
|
* @param _arch the archive of non-dominated solutions
|
||||||
*/
|
*/
|
||||||
void operator () (const MOEOT & _moeo, moeoArchive < MOEOT > & _arch)
|
void operator () (const MOEOT & _eo, moeoArchive < MOEOT > &_arch)
|
||||||
{
|
{
|
||||||
eval(const_cast < MOEOT & > (_moeo));
|
eval (const_cast < MOEOT & >(_eo));
|
||||||
for (unsigned i=0; i<combinedLS.size(); i++)
|
for (unsigned i = 0; i < combinedLS.size (); i++)
|
||||||
combinedLS[i] -> operator()(_moeo, _arch);
|
combinedLS[i]->operator ()(_eo, _arch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** the full evaluator of a solution */
|
/** the full evaluator of a solution */
|
||||||
moeoEvalFunc < MOEOT > & eval;
|
moeoEvalFunc < MOEOT > &eval;
|
||||||
/** the vector that contains the combined LS */
|
/** the vector that contains the combined LS */
|
||||||
std::vector< moeoLS < MOEOT > * > combinedLS;
|
std::vector < moeoLS < MOEOT > *>combinedLS;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*MOEOCOMBINEDLS_H_*/
|
#endif /*MOEOCOMBINEDLS_H_ */
|
||||||
|
|
|
||||||
|
|
@ -14,20 +14,24 @@
|
||||||
#define MOEOCOMPARATOR_H_
|
#define MOEOCOMPARATOR_H_
|
||||||
|
|
||||||
#include <eoFunctor.h>
|
#include <eoFunctor.h>
|
||||||
|
#include <eoPop.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functor allowing to compare two solutions.
|
* Functor allowing to compare two solutions
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoComparator:public eoBF < const MOEOT &, const MOEOT &,
|
||||||
class moeoComparator : public eoBF < const MOEOT &, const MOEOT &, const bool >
|
const bool >
|
||||||
{};
|
{
|
||||||
|
public:
|
||||||
|
// virtual const bool operator () (const MOEOT & _moeo1, const MOEOT & _moeo){}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functor allowing to compare two solutions according to their first objective value, then their second, and so on.
|
* Functor allowing to compare two solutions according to their first objective value, then their second, and so on
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoObjectiveComparator:public moeoComparator <
|
||||||
class moeoObjectiveComparator : public moeoComparator < MOEOT >
|
MOEOT >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
|
|
@ -35,56 +39,56 @@ public:
|
||||||
* @param _moeo1 the first solution
|
* @param _moeo1 the first solution
|
||||||
* @param _moeo2 the second solution
|
* @param _moeo2 the second solution
|
||||||
*/
|
*/
|
||||||
const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
const bool operator () (const MOEOT & _moeo1, const MOEOT & _moeo2)
|
||||||
{
|
{
|
||||||
return _moeo1.objectiveVector() < _moeo2.objectiveVector();
|
return _moeo1.objectiveVector () < _moeo2.objectiveVector ();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functor allowing to compare two solutions according to their fitness values.
|
* Functor allowing to compare two solutions according to their fitness values
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
//template < class MOEOT >
|
||||||
class moeoFitnessComparator : public moeoComparator < MOEOT >
|
//class moeoFitnessComparator : public moeoComparator < MOEOT >
|
||||||
{
|
//{
|
||||||
public:
|
//public:
|
||||||
/**
|
// /**
|
||||||
* Returns true if the fitness value of _moeo1 is smaller than the fitness value of _moeo2
|
// * Returns true if the fitness value of _moeo1 is smaller than the fitness value of _moeo2
|
||||||
* @param _moeo1 the first solution
|
// * @param _moeo1 the first solution
|
||||||
* @param _moeo2 the second solution
|
// * @param _moeo2 the second solution
|
||||||
*/
|
// */
|
||||||
const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
// const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
||||||
{
|
// {
|
||||||
return _moeo1.fitness() < _moeo2.fitness();
|
// return _moeo1.fitness() < _moeo2.fitness();
|
||||||
}
|
// }
|
||||||
};
|
//};
|
||||||
|
//
|
||||||
|
//
|
||||||
|
///**
|
||||||
|
// * Functor allowing to compare two solutions according to their diversity values
|
||||||
|
// */
|
||||||
|
//template < class MOEOT >
|
||||||
|
//class moeoDiversityComparator : public moeoComparator < MOEOT >
|
||||||
|
//{
|
||||||
|
//public:
|
||||||
|
// /**
|
||||||
|
// * Returns true if the diversity value of _moeo1 is smaller than the diversity value of _moeo2
|
||||||
|
// * @param _moeo1 the first solution
|
||||||
|
// * @param _moeo2 the second solution
|
||||||
|
// */
|
||||||
|
// const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
||||||
|
// {
|
||||||
|
// return _moeo1.diversity() < _moeo2.diversity();
|
||||||
|
// }
|
||||||
|
//};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functor allowing to compare two solutions according to their diversity values.
|
* Functor allowing to compare two solutions according to their fitness values, then according to their diversity values
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoFitnessThenDiversityComparator:public moeoComparator <
|
||||||
class moeoDiversityComparator : public moeoComparator < MOEOT >
|
MOEOT >
|
||||||
{
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Returns true if the diversity value of _moeo1 is smaller than the diversity value of _moeo2
|
|
||||||
* @param _moeo1 the first solution
|
|
||||||
* @param _moeo2 the second solution
|
|
||||||
*/
|
|
||||||
const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
|
||||||
{
|
|
||||||
return _moeo1.diversity() < _moeo2.diversity();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Functor allowing to compare two solutions according to their fitness values, then according to their diversity values.
|
|
||||||
*/
|
|
||||||
template < class MOEOT >
|
|
||||||
class moeoFitnessThenDiversityComparator : public moeoComparator < MOEOT >
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
|
|
@ -92,25 +96,25 @@ public:
|
||||||
* @param _moeo1 the first solution
|
* @param _moeo1 the first solution
|
||||||
* @param _moeo2 the second solution
|
* @param _moeo2 the second solution
|
||||||
*/
|
*/
|
||||||
const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
const bool operator () (const MOEOT & _moeo1, const MOEOT & _moeo2)
|
||||||
{
|
{
|
||||||
if (_moeo1.fitness() == _moeo2.fitness())
|
if (_moeo1.fitness () == _moeo2.fitness ())
|
||||||
{
|
{
|
||||||
return _moeo1.diversity() < _moeo2.diversity();
|
return _moeo1.diversity () < _moeo2.diversity ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return _moeo1.fitness() < _moeo2.fitness();
|
return _moeo1.fitness () < _moeo2.fitness ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functor allowing to compare two solutions according to their diversity values, then according to their fitness values.
|
* Functor allowing to compare two solutions according to their diversity values, then according to their fitness values
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoDiversityThenFitnessComparator:public moeoComparator <
|
||||||
class moeoDiversityThenFitnessComparator : public moeoComparator < MOEOT >
|
MOEOT >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
|
|
@ -118,22 +122,22 @@ public:
|
||||||
* @param _moeo1 the first solution
|
* @param _moeo1 the first solution
|
||||||
* @param _moeo2 the second solution
|
* @param _moeo2 the second solution
|
||||||
*/
|
*/
|
||||||
const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
|
const bool operator () (const MOEOT & _moeo1, const MOEOT & _moeo2)
|
||||||
{
|
{
|
||||||
if (_moeo1.diversity() == _moeo2.diversity())
|
if (_moeo1.diversity () == _moeo2.diversity ())
|
||||||
{
|
{
|
||||||
return _moeo1.fitness() < _moeo2.fitness();
|
return _moeo1.fitness () < _moeo2.fitness ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return _moeo1.diversity() < _moeo2.diversity();
|
return _moeo1.diversity () < _moeo2.diversity ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functor allowing to compare two solutions according to Pareto dominance relation. => USEFULL ???
|
* Functor allowing to compare two solutions according to Pareto dominance relation => USEFULL ???
|
||||||
*
|
*
|
||||||
template < class MOEOT >
|
template < class MOEOT >
|
||||||
class moeoParetoDominanceComparator : public moeoComparator < MOEOT >
|
class moeoParetoDominanceComparator : public moeoComparator < MOEOT >
|
||||||
|
|
@ -178,4 +182,4 @@ public:
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#endif /*MOEOCOMPARATOR_H_*/
|
#endif /*MOEOCOMPARATOR_H_ */
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,32 @@
|
||||||
#include <eoPop.h>
|
#include <eoPop.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functor that sets the diversity values of a whole population.
|
* Functor that sets the diversity values of a whole population
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoDiversityAssignment:public eoUF < eoPop < MOEOT > &,
|
||||||
class moeoDiversityAssignment : public eoUF < eoPop < MOEOT > &, void >
|
void >
|
||||||
{};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
#endif /*MOEODIVERSITYASSIGNMENT_H_*/
|
|
||||||
|
/**
|
||||||
|
* moeoDummyDiversityAssignment is a moeoDiversityAssignment which gives 0 as the diversity for the whole population.
|
||||||
|
*/
|
||||||
|
template < class MOEOT > class moeoDummyDiversityAssignment:public moeoDiversityAssignment <
|
||||||
|
MOEOT >
|
||||||
|
{
|
||||||
|
// main operator
|
||||||
|
void operator () (eoPop < MOEOT > &_pop)
|
||||||
|
{
|
||||||
|
for (int idx = 0; idx < _pop.size (); idx++)
|
||||||
|
{
|
||||||
|
// set the diversity to 0
|
||||||
|
_pop[idx].diversity (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*MOEODIVERSITYASSIGNMENT_H_ */
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,11 @@
|
||||||
#include <eoAlgo.h>
|
#include <eoAlgo.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract class for multi-objective evolutionary algorithms.
|
* Abstract class for multi-objective evolutionary algorithms
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoEA:public eoAlgo < MOEOT >
|
||||||
class moeoEA : public eoAlgo < MOEOT > {};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /*MOEOEA_H_*/
|
#endif /*MOEOEA_H_ */
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,8 @@
|
||||||
/*
|
/*
|
||||||
* Functor that evaluates one MOEO by setting all its objective values.
|
* Functor that evaluates one MOEO by setting all its objective values.
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoEvalFunc:public eoEvalFunc < MOEOT >
|
||||||
class moeoEvalFunc : public eoEvalFunc< MOEOT > {};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
#endif /*MOEOEVALFUNC_H_*/
|
#endif /*MOEOEVALFUNC_H_ */
|
||||||
|
|
|
||||||
|
|
@ -14,163 +14,170 @@
|
||||||
#define MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_
|
#define MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_
|
||||||
|
|
||||||
#include <eoPop.h>
|
#include <eoPop.h>
|
||||||
#include <moeoComparator.h>
|
|
||||||
#include <moeoFitnessAssignment.h>
|
#include <moeoFitnessAssignment.h>
|
||||||
|
#include <moeoComparator.h>
|
||||||
#include <moeoObjectiveVectorComparator.h>
|
#include <moeoObjectiveVectorComparator.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fitness assignment sheme based on Pareto-dominance count proposed in:
|
* 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)*
|
* N. Srinivas, K. Deb, "Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms", Evolutionary Computation vol. 2, no. 3, pp. 221-248 (1994)
|
||||||
* and in:
|
* 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)*.
|
* 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.
|
* This strategy is, for instance, used in NSGA and NSGA-II.
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoFastNonDominatedSortingFitnessAssignment:public moeoParetoBasedFitnessAssignment <
|
||||||
class moeoFastNonDominatedSortingFitnessAssignment : public moeoParetoBasedFitnessAssignment < MOEOT >
|
MOEOT
|
||||||
|
>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor
|
* Ctor
|
||||||
*/
|
*/
|
||||||
moeoFastNonDominatedSortingFitnessAssignment() {}
|
moeoFastNonDominatedSortingFitnessAssignment ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Computes fitness values for every solution contained in the population _pop
|
* Computes fitness values for every solution contained in the population _pop
|
||||||
* @param _pop the population
|
* @param _pop the population
|
||||||
*/
|
*/
|
||||||
void operator()(eoPop < MOEOT > & _pop)
|
void operator () (eoPop < MOEOT > &_pop)
|
||||||
{
|
{
|
||||||
// number of objectives for the problem under consideration
|
// number of objectives for the problem under consideration
|
||||||
unsigned nObjectives = MOEOT::ObjectiveVector::nObjectives();
|
unsigned nObjectives = MOEOT::ObjectiveVector::nObjectives ();
|
||||||
if (nObjectives == 1)
|
if (nObjectives == 1)
|
||||||
{
|
{
|
||||||
// one objective
|
// one objective
|
||||||
oneObjective(_pop);
|
oneObjective (_pop);
|
||||||
}
|
}
|
||||||
else if (nObjectives == 2)
|
else if (nObjectives == 2)
|
||||||
{
|
{
|
||||||
// two objectives (the two objectives function is still to implement)
|
// two objectives (the two objectives function is still to do)
|
||||||
mObjectives(_pop);
|
mObjectives (_pop);
|
||||||
}
|
}
|
||||||
else if (nObjectives > 2)
|
else if (nObjectives > 2)
|
||||||
{
|
{
|
||||||
// more than two objectives
|
// more than two objectives
|
||||||
mObjectives(_pop);
|
mObjectives (_pop);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// problem with the number of objectives
|
// problem with the number of objectives
|
||||||
throw std::runtime_error("Problem with the number of objectives in moeoFastNonDominatedSortingFitnessAssignment");
|
throw std::
|
||||||
}
|
runtime_error
|
||||||
}
|
("Problem with the number of objectives in moeoFastNonDominatedSortingFitnessAssignment");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** the objective vector type of the solutions */
|
/** the objective vector type of the solutions */
|
||||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
||||||
/** Functor to compare two objective vectors according to Pareto dominance relation */
|
/** Functor to compare two objective vectors according to Pareto dominance relation */
|
||||||
moeoParetoObjectiveVectorComparator < ObjectiveVector > comparator;
|
moeoParetoObjectiveVectorComparator < ObjectiveVector > comparator;
|
||||||
/** Functor to compare two solutions on the first objective, then on the second, and so on */
|
/** Functor to compare two solutions on the first objective, then on the second, and so on */
|
||||||
moeoObjectiveComparator < MOEOT > objComparator;
|
moeoObjectiveComparator < MOEOT > objComparator;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the fitness values for mono-objective problems
|
* Sets the fitness values for mono-objective problems
|
||||||
* @param _pop the population
|
* @param _pop the population
|
||||||
*/
|
*/
|
||||||
void oneObjective (eoPop < MOEOT > & _pop)
|
void oneObjective (eoPop < MOEOT > &_pop)
|
||||||
{
|
{
|
||||||
std::sort(_pop.begin(), _pop.end(), objComparator);
|
std::sort (_pop.begin (), _pop.end (), objComparator);
|
||||||
for (unsigned i=0; i<_pop.size(); i++)
|
for (unsigned i = 0; i < _pop.size (); i++)
|
||||||
{
|
{
|
||||||
_pop[i].fitness(i+1);
|
_pop[i].fitness (i + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the fitness values for bi-objective problems with a complexity of O(n log n), where n stands for the population size
|
* 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
|
* @param _pop the population
|
||||||
*/
|
*/
|
||||||
void twoObjectives (eoPop < MOEOT > & _pop)
|
void twoObjectives (eoPop < MOEOT > &_pop)
|
||||||
{
|
{
|
||||||
//... TO DO !
|
//... 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
|
* 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
|
* @param _pop the population
|
||||||
*/
|
*/
|
||||||
void mObjectives (eoPop < MOEOT > & _pop)
|
void mObjectives (eoPop < MOEOT > &_pop)
|
||||||
{
|
{
|
||||||
// S[i] = indexes of the individuals dominated by _pop[i]
|
// S[i] = indexes of the individuals dominated by _pop[i]
|
||||||
std::vector < std::vector<unsigned> > S(_pop.size());
|
std::vector < std::vector < unsigned >>S (_pop.size ());
|
||||||
// n[i] = number of individuals that dominate the individual _pop[i]
|
// n[i] = number of individuals that dominate the individual _pop[i]
|
||||||
std::vector < unsigned > n(_pop.size(), 0);
|
std::vector < unsigned >n (_pop.size (), 0);
|
||||||
// fronts: F[i] = indexes of the individuals contained in the ith front
|
// fronts: F[i] = indexes of the individuals contained in the ith front
|
||||||
std::vector < std::vector<unsigned> > F(_pop.size()+1);
|
std::vector < std::vector < unsigned >>F (_pop.size () + 1);
|
||||||
// used to store the number of the first front
|
// used to store the number of the first front
|
||||||
F[1].reserve(_pop.size());
|
F[1].reserve (_pop.size ());
|
||||||
// flag to comparae solutions
|
// flag to comparae solutions
|
||||||
int comparatorFlag;
|
int comparatorFlag;
|
||||||
for (unsigned p=0; p<_pop.size(); p++)
|
for (unsigned p = 0; p < _pop.size (); p++)
|
||||||
{
|
{
|
||||||
for (unsigned q=0; q<_pop.size(); q++)
|
for (unsigned q = 0; q < _pop.size (); q++)
|
||||||
{
|
{
|
||||||
// comparison of the 2 solutions according to Pareto dominance
|
// comparison of the 2 solutions according to Pareto dominance
|
||||||
comparatorFlag = comparator(_pop[p].objectiveVector(), _pop[q].objectiveVector());
|
comparatorFlag =
|
||||||
// if p dominates q
|
comparator (_pop[p].objectiveVector (),
|
||||||
if (comparatorFlag == 1)
|
_pop[q].objectiveVector ());
|
||||||
{
|
// if p dominates q
|
||||||
// add q to the set of solutions dominated by p
|
if (comparatorFlag == 1)
|
||||||
S[p].push_back(q);
|
{
|
||||||
}
|
// add q to the set of solutions dominated by p
|
||||||
// if q dominates p
|
S[p].push_back (q);
|
||||||
else if (comparatorFlag == -1)
|
}
|
||||||
{
|
// if q dominates p
|
||||||
// increment the domination counter of p
|
else if (comparatorFlag == -1)
|
||||||
n[p]++;
|
{
|
||||||
}
|
// increment the domination counter of p
|
||||||
}
|
n[p]++;
|
||||||
// if no individual dominates p
|
}
|
||||||
if (n[p] == 0)
|
}
|
||||||
{
|
// if no individual dominates p
|
||||||
// p belongs to the first front
|
if (n[p] == 0)
|
||||||
_pop[p].fitness(1);
|
{
|
||||||
F[1].push_back(p);
|
// p belongs to the first front
|
||||||
}
|
_pop[p].fitness (1);
|
||||||
}
|
F[1].push_back (p);
|
||||||
// front counter
|
}
|
||||||
unsigned counter=1;
|
}
|
||||||
unsigned p,q;
|
// front counter
|
||||||
while (! F[counter].empty())
|
unsigned counter = 1;
|
||||||
{
|
unsigned p, q;
|
||||||
// used to store the number of the next front
|
while (!F[counter].empty ())
|
||||||
F[counter+1].reserve(_pop.size());
|
{
|
||||||
for (unsigned i=0; i<F[counter].size(); i++)
|
// used to store the number of the next front
|
||||||
{
|
F[counter + 1].reserve (_pop.size ());
|
||||||
p = F[counter][i];
|
for (unsigned i = 0; i < F[counter].size (); i++)
|
||||||
for (unsigned j=0; j<S[p].size(); j++)
|
{
|
||||||
{
|
p = F[counter][i];
|
||||||
q = S[p][j];
|
for (unsigned j = 0; j < S[p].size (); j++)
|
||||||
n[q]--;
|
{
|
||||||
// if no individual dominates q anymore
|
q = S[p][j];
|
||||||
if (n[q] == 0)
|
n[q]--;
|
||||||
{
|
// if no individual dominates q anymore
|
||||||
// q belongs to the next front
|
if (n[q] == 0)
|
||||||
_pop[q].fitness(counter+1);
|
{
|
||||||
F[counter+1].push_back(q);
|
// q belongs to the next front
|
||||||
}
|
_pop[q].fitness (counter + 1);
|
||||||
}
|
F[counter + 1].push_back (q);
|
||||||
}
|
}
|
||||||
counter++;
|
}
|
||||||
}
|
}
|
||||||
}
|
counter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_*/
|
#endif /*MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_ */
|
||||||
|
|
|
||||||
|
|
@ -17,35 +17,46 @@
|
||||||
#include <eoPop.h>
|
#include <eoPop.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functor that sets the fitness values of a whole population.
|
* Functor that sets the fitness values of a whole population
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoFitnessAssignment:public eoUF < eoPop < MOEOT > &,
|
||||||
class moeoFitnessAssignment : public eoUF < eoPop < MOEOT > &, void >
|
void >
|
||||||
{};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* moeoScalarFitnessAssignment is a moeoFitnessAssignment for scalar strategies.
|
* moeoScalarFitnessAssignment is a moeoFitnessAssignment for scalar strategies
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoScalarFitnessAssignment:public moeoFitnessAssignment <
|
||||||
class moeoScalarFitnessAssignment : public moeoFitnessAssignment < MOEOT >
|
MOEOT >
|
||||||
{};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* moeoCriterionBasedFitnessAssignment is a moeoFitnessAssignment for criterion-based strategies.
|
* moeoCriterionBasedFitnessAssignment is a moeoFitnessAssignment for criterion-based strategies
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoCriterionBasedFitnessAssignment:public moeoFitnessAssignment <
|
||||||
class moeoCriterionBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT >
|
MOEOT >
|
||||||
{};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* moeoParetoBasedFitnessAssignment is a moeoFitnessAssignment for Pareto-based strategies.
|
* moeoParetoBasedFitnessAssignment is a moeoFitnessAssignment for Pareto-based strategies
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoParetoBasedFitnessAssignment:public moeoFitnessAssignment <
|
||||||
class moeoParetoBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT >
|
MOEOT >
|
||||||
{};
|
{
|
||||||
|
void operator () (eoPop < MOEOT > &_pop)
|
||||||
|
{
|
||||||
|
// do nothing for the moment ...
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /*MOEOFITNESSASSIGNMENT_H_*/
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*MOEOFITNESSASSIGNMENT_H_ */
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,12 @@
|
||||||
#include <moeoGenerationalReplacement.h>
|
#include <moeoGenerationalReplacement.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generational replacement: only the new individuals are preserved.
|
* Generational replacement: only the new individuals are preserved
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoGenerationalReplacement:public moeoReplacement < MOEOT >,
|
||||||
class moeoGenerationalReplacement : public moeoReplacement < MOEOT >, public eoGenerationalReplacement < MOEOT > {};
|
public eoGenerationalReplacement <
|
||||||
|
MOEOT >
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
#endif /*MOEOGENERATIONALREPLACEMENT_H_*/
|
#endif /*MOEOGENERATIONALREPLACEMENT_H_ */
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,7 @@
|
||||||
* This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive
|
* This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive
|
||||||
* at every generation until a stopping criteria is verified.
|
* at every generation until a stopping criteria is verified.
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoHybridLS:public eoUpdater
|
||||||
class moeoHybridLS : public eoUpdater
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -33,42 +32,45 @@ public:
|
||||||
* Ctor
|
* Ctor
|
||||||
* @param _term stopping criteria
|
* @param _term stopping criteria
|
||||||
* @param _select selector
|
* @param _select selector
|
||||||
* @param _mols a multi-objective local search
|
* @param _ls a multi-objective local search
|
||||||
* @param _arch the archive
|
* @param _arch the archive
|
||||||
*/
|
*/
|
||||||
eoHybridLS (eoContinue < MOEOT > & _term, eoSelect < MOEOT > & _select, moeoLS < MOEOT > & _mols, moeoArchive < MOEOT > & _arch) : term(_term), select(_select), mols(_mols), arch(_arch)
|
eoHybridLS (eoContinue < MOEOT > &_term, eoSelect < MOEOT > &_select, moeoLS < MOEOT > &_ls, moeoArchive < MOEOT > &_arch):term (_term), select (_select), ls (_ls),
|
||||||
{}
|
arch
|
||||||
|
(_arch)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the multi-objective local search to selected individuals contained in the archive if the stopping criteria is not verified
|
* Applies the multi-objective local search to selected individuals contained in the archive if the stopping criteria is not verified
|
||||||
*/
|
*/
|
||||||
void operator () ()
|
void operator () ()
|
||||||
{
|
{
|
||||||
if (! cont (arch))
|
if (!cont (arch))
|
||||||
{
|
{
|
||||||
// selection of solutions
|
// selection of solutions
|
||||||
eoPop < MOEOT > selectedSolutions;
|
eoPop < MOEOT > selectedSolutions;
|
||||||
select(arch, selectedSolutions);
|
select (arch, selectedSolutions);
|
||||||
// apply the local search to every selected solution
|
// apply the local search to every selected solution
|
||||||
for (unsigned i=0; i<selectedSolutions.size(); i++)
|
for (unsigned i = 0; i < selectedSolutions.size (); i++)
|
||||||
{
|
{
|
||||||
mols(selectedSolutions[i], arch);
|
ls (selectedSolutions[i], arch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** stopping criteria*/
|
/** stopping criteria*/
|
||||||
eoContinue < MOEOT > & term;
|
eoContinue < MOEOT > &term;
|
||||||
/** selector */
|
/** selector */
|
||||||
eoSelect < MOEOT > & select;
|
eoSelect < MOEOT > &select;
|
||||||
/** multi-objective local search */
|
/** multi-objective local search */
|
||||||
moeoLS < MOEOT > & mols;
|
moeoLS < MOEOT > &ls;
|
||||||
/** archive */
|
/** archive */
|
||||||
moeoArchive < MOEOT > & arch;
|
moeoArchive < MOEOT > &arch;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*MOEOHYBRIDLS_H_*/
|
#endif /*MOEOHYBRIDLS_H_ */
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,9 @@
|
||||||
* Abstract class for local searches applied to multi-objective optimization.
|
* Abstract class for local searches applied to multi-objective optimization.
|
||||||
* Starting from only one solution, it produces a set of new non-dominated solutions.
|
* Starting from only one solution, it produces a set of new non-dominated solutions.
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoLS:public eoBF < const MOEOT &, moeoArchive < MOEOT > &,
|
||||||
class moeoLS: public eoBF < const MOEOT &, moeoArchive < MOEOT > &, void >
|
void >
|
||||||
{};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
#endif /*MOEOLS_H_*/
|
#endif /*MOEOLS_H_ */
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,12 @@
|
||||||
* but it can be replaced at will by any other class that implements the static functions defined therein.
|
* but it can be replaced at will by any other class that implements the static functions defined therein.
|
||||||
* Some static funtions to access to the traits characteristics are re-defined in order not to write a lot of typedef's.
|
* Some static funtions to access to the traits characteristics are re-defined in order not to write a lot of typedef's.
|
||||||
*/
|
*/
|
||||||
template < class ObjectiveVectorTraits >
|
template < class ObjectiveVectorTraits > class moeoObjectiveVector
|
||||||
class moeoObjectiveVector
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** The traits of objective vectors */
|
/** The traits of objective vectors */
|
||||||
typedef ObjectiveVectorTraits Traits;
|
typedef ObjectiveVectorTraits Traits;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -38,37 +37,40 @@ public:
|
||||||
* @param _nObjectives the number of objectives
|
* @param _nObjectives the number of objectives
|
||||||
* @param _bObjectives the min/max vector (true = min / false = max)
|
* @param _bObjectives the min/max vector (true = min / false = max)
|
||||||
*/
|
*/
|
||||||
static void setup(unsigned _nObjectives, std::vector < bool > & _bObjectives)
|
static void setup (unsigned _nObjectives,
|
||||||
{
|
std::vector < bool > &_bObjectives)
|
||||||
ObjectiveVectorTraits::setup(_nObjectives, _bObjectives);
|
{
|
||||||
}
|
ObjectiveVectorTraits::setup (_nObjectives, _bObjectives);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of objectives
|
* Returns the number of objectives
|
||||||
*/
|
*/
|
||||||
static unsigned nObjectives()
|
static unsigned nObjectives ()
|
||||||
{
|
{
|
||||||
return ObjectiveVectorTraits::nObjectives();
|
return ObjectiveVectorTraits::nObjectives ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the _ith objective have to be minimized
|
* Returns true if the _ith objective have to be minimized
|
||||||
* @param _i the index
|
* @param _i the index
|
||||||
*/
|
*/
|
||||||
static bool minimizing(unsigned _i) {
|
static bool minimizing (unsigned _i)
|
||||||
return ObjectiveVectorTraits::minimizing(_i);
|
{
|
||||||
}
|
return ObjectiveVectorTraits::minimizing (_i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the _ith objective have to be maximized
|
* Returns true if the _ith objective have to be maximized
|
||||||
* @param _i the index
|
* @param _i the index
|
||||||
*/
|
*/
|
||||||
static bool maximizing(unsigned _i) {
|
static bool maximizing (unsigned _i)
|
||||||
return ObjectiveVectorTraits::maximizing(_i);
|
{
|
||||||
}
|
return ObjectiveVectorTraits::maximizing (_i);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -77,25 +79,34 @@ public:
|
||||||
* This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles,
|
* This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles,
|
||||||
* i.e. that an objective value is represented using a double, and this for any objective.
|
* i.e. that an objective value is represented using a double, and this for any objective.
|
||||||
*/
|
*/
|
||||||
template < class ObjectiveVectorTraits >
|
template < class ObjectiveVectorTraits > class moeoObjectiveVectorDouble:public moeoObjectiveVector < ObjectiveVectorTraits >,
|
||||||
class moeoObjectiveVectorDouble : public moeoObjectiveVector < ObjectiveVectorTraits >, public std::vector < double >
|
public std::vector <
|
||||||
|
double >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
using std::vector< double >::size;
|
using
|
||||||
using std::vector< double >::operator[];
|
std::vector < double >::size;
|
||||||
|
using
|
||||||
|
std::vector < double >::operator[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor
|
* Ctor
|
||||||
*/
|
*/
|
||||||
moeoObjectiveVectorDouble() : std::vector < double > (ObjectiveVectorTraits::nObjectives(), 0.0) {}
|
moeoObjectiveVectorDouble ():
|
||||||
|
std::vector < double >(ObjectiveVectorTraits::nObjectives (), 0.0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor from a vector of doubles
|
* Ctor from a vector of doubles
|
||||||
* @param _v the std::vector < double >
|
* @param _v the std::vector < double >
|
||||||
*/
|
*/
|
||||||
moeoObjectiveVectorDouble(std::vector <double> & _v) : std::vector < double > (_v) {}
|
moeoObjectiveVectorDouble (std::vector < double >&_v):
|
||||||
|
std::vector < double >(_v)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -103,38 +114,51 @@ public:
|
||||||
* (but it's better to use a moeoObjectiveVectorComparator object to compare solutions)
|
* (but it's better to use a moeoObjectiveVectorComparator object to compare solutions)
|
||||||
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
||||||
*/
|
*/
|
||||||
bool dominates(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
|
bool
|
||||||
{
|
dominates (const moeoObjectiveVectorDouble < ObjectiveVectorTraits >
|
||||||
moeoParetoObjectiveVectorComparator < moeoObjectiveVectorDouble<ObjectiveVectorTraits> > comparator;
|
&_other) const
|
||||||
return comparator(*this, _other)==1;
|
{
|
||||||
}
|
moeoParetoObjectiveVectorComparator <
|
||||||
|
moeoObjectiveVectorDouble <
|
||||||
|
ObjectiveVectorTraits > >
|
||||||
|
comparator;
|
||||||
|
return
|
||||||
|
comparator (*this, _other) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the current objective vector is equal to _other (according to a tolerance value)
|
* Returns true if the current objective vector is equal to _other (according to a tolerance value)
|
||||||
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
||||||
*/
|
*/
|
||||||
bool operator==(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
|
bool
|
||||||
{
|
operator== (const moeoObjectiveVectorDouble < ObjectiveVectorTraits >
|
||||||
for (unsigned i=0; i < size(); i++)
|
&_other) const
|
||||||
{
|
{
|
||||||
if ( fabs(operator[](i) - _other[i]) > ObjectiveVectorTraits::tolerance() )
|
for (unsigned i = 0; i < size (); i++)
|
||||||
{
|
{
|
||||||
return false;
|
if (fabs (operator[](i) - _other[i]) >
|
||||||
}
|
ObjectiveVectorTraits::tolerance ())
|
||||||
}
|
{
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the current objective vector is different than _other (according to a tolerance value)
|
* Returns true if the current objective vector is different than _other (according to a tolerance value)
|
||||||
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
||||||
*/
|
*/
|
||||||
bool operator!=(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
|
bool
|
||||||
{
|
operator!= (const moeoObjectiveVectorDouble < ObjectiveVectorTraits >
|
||||||
return ! operator==(_other);
|
&_other) const
|
||||||
}
|
{
|
||||||
|
return !
|
||||||
|
operator== (_other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -142,24 +166,27 @@ public:
|
||||||
* (can be usefull for sorting/printing)
|
* (can be usefull for sorting/printing)
|
||||||
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
||||||
*/
|
*/
|
||||||
bool operator<(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
|
bool
|
||||||
{
|
operator< (const moeoObjectiveVectorDouble < ObjectiveVectorTraits >
|
||||||
for (unsigned i=0; i < size(); i++)
|
&_other) const
|
||||||
{
|
{
|
||||||
if ( fabs(operator[](i) - _other[i]) > ObjectiveVectorTraits::tolerance() )
|
for (unsigned i = 0; i < size (); i++)
|
||||||
{
|
{
|
||||||
if (operator[](i) < _other[i])
|
if (fabs (operator[](i) - _other[i]) >
|
||||||
{
|
ObjectiveVectorTraits::tolerance ())
|
||||||
return true;
|
{
|
||||||
}
|
if (operator[](i) < _other[i])
|
||||||
else
|
{
|
||||||
{
|
return true;
|
||||||
return false;
|
}
|
||||||
}
|
else
|
||||||
}
|
{
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -167,10 +194,14 @@ public:
|
||||||
* (can be usefull for sorting/printing)
|
* (can be usefull for sorting/printing)
|
||||||
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
||||||
*/
|
*/
|
||||||
bool operator>(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
|
bool
|
||||||
{
|
operator> (const moeoObjectiveVectorDouble < ObjectiveVectorTraits >
|
||||||
return _other < *this;
|
&_other) const
|
||||||
}
|
{
|
||||||
|
return
|
||||||
|
_other < *
|
||||||
|
this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -178,10 +209,14 @@ public:
|
||||||
* (can be usefull for sorting/printing)
|
* (can be usefull for sorting/printing)
|
||||||
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
||||||
*/
|
*/
|
||||||
bool operator<=(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
|
bool
|
||||||
{
|
operator<= (const moeoObjectiveVectorDouble < ObjectiveVectorTraits >
|
||||||
return operator==(_other) || operator<(_other);
|
&_other) const
|
||||||
}
|
{
|
||||||
|
return
|
||||||
|
operator== (_other) ||
|
||||||
|
operator< (_other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -189,10 +224,14 @@ public:
|
||||||
* (can be usefull for sorting/printing)
|
* (can be usefull for sorting/printing)
|
||||||
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
* @param _other the other moeoObjectiveVectorDouble object to compare with
|
||||||
*/
|
*/
|
||||||
bool operator>=(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
|
bool
|
||||||
{
|
operator>= (const moeoObjectiveVectorDouble < ObjectiveVectorTraits >
|
||||||
return operator==(_other) || operator>(_other);
|
&_other) const
|
||||||
}
|
{
|
||||||
|
return
|
||||||
|
operator== (_other) ||
|
||||||
|
operator> (_other);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -203,13 +242,15 @@ public:
|
||||||
* @param _objectiveVector the objective vector to write
|
* @param _objectiveVector the objective vector to write
|
||||||
*/
|
*/
|
||||||
template < class ObjectiveVectorTraits >
|
template < class ObjectiveVectorTraits >
|
||||||
std::ostream & operator<<(std::ostream & _os, const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _objectiveVector)
|
std::ostream & operator<< (std::ostream & _os,
|
||||||
|
const moeoObjectiveVectorDouble <
|
||||||
|
ObjectiveVectorTraits > &_objectiveVector)
|
||||||
{
|
{
|
||||||
for (unsigned i=0; i<_objectiveVector.size(); i++)
|
for (unsigned i = 0; i < _objectiveVector.size (); i++)
|
||||||
{
|
{
|
||||||
_os << _objectiveVector[i] << ' ';
|
_os << _objectiveVector[i] << ' ';
|
||||||
}
|
}
|
||||||
return _os;
|
return _os;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -218,14 +259,16 @@ std::ostream & operator<<(std::ostream & _os, const moeoObjectiveVectorDouble <
|
||||||
* @param _objectiveVector the objective vector to read
|
* @param _objectiveVector the objective vector to read
|
||||||
*/
|
*/
|
||||||
template < class ObjectiveVectorTraits >
|
template < class ObjectiveVectorTraits >
|
||||||
std::istream & operator>>(std::istream & _is, moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _objectiveVector)
|
std::istream & operator>> (std::istream & _is,
|
||||||
|
moeoObjectiveVectorDouble <
|
||||||
|
ObjectiveVectorTraits > &_objectiveVector)
|
||||||
{
|
{
|
||||||
_objectiveVector = moeoObjectiveVectorDouble < ObjectiveVectorTraits > ();
|
_objectiveVector = moeoObjectiveVectorDouble < ObjectiveVectorTraits > ();
|
||||||
for (unsigned i=0; i<_objectiveVector.size(); i++)
|
for (unsigned i = 0; i < _objectiveVector.size (); i++)
|
||||||
{
|
{
|
||||||
_is >> _objectiveVector[i];
|
_is >> _objectiveVector[i];
|
||||||
}
|
}
|
||||||
return _is;
|
return _is;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*MOEOOBJECTIVEVECTOR_H_*/
|
#endif /*MOEOOBJECTIVEVECTOR_H_ */
|
||||||
|
|
|
||||||
|
|
@ -20,16 +20,18 @@
|
||||||
* Abstract class allowing to compare 2 objective vectors.
|
* Abstract class allowing to compare 2 objective vectors.
|
||||||
* The template argument ObjectiveVector have to be a moeoObjectiveVector.
|
* The template argument ObjectiveVector have to be a moeoObjectiveVector.
|
||||||
*/
|
*/
|
||||||
template < class ObjectiveVector >
|
template < class ObjectiveVector > class moeoObjectiveVectorComparator:public eoBF < const ObjectiveVector &, const ObjectiveVector &,
|
||||||
class moeoObjectiveVectorComparator : public eoBF < const ObjectiveVector &, const ObjectiveVector &, int >
|
int >
|
||||||
{};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This functor class allows to compare 2 objective vectors according to Pareto dominance.
|
* This functor class allows to compare 2 objective vectors according to Pareto dominance
|
||||||
*/
|
*/
|
||||||
template < class ObjectiveVector >
|
template < class ObjectiveVector > class moeoParetoObjectiveVectorComparator:public moeoObjectiveVectorComparator <
|
||||||
class moeoParetoObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector >
|
ObjectiveVector
|
||||||
|
>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -38,52 +40,54 @@ public:
|
||||||
* @param _objectiveVector1 the first objective vector
|
* @param _objectiveVector1 the first objective vector
|
||||||
* @param _objectiveVector2 the second objective vector
|
* @param _objectiveVector2 the second objective vector
|
||||||
*/
|
*/
|
||||||
int operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)
|
int operator () (const ObjectiveVector & _objectiveVector1,
|
||||||
{
|
const ObjectiveVector & _objectiveVector2)
|
||||||
bool dom1 = false;
|
{
|
||||||
bool dom2 = false;
|
bool dom1 = false;
|
||||||
for (unsigned i=0; i<ObjectiveVector::nObjectives(); i++)
|
bool dom2 = false;
|
||||||
{
|
for (unsigned i = 0; i < ObjectiveVector::nObjectives (); i++)
|
||||||
// first, we have to check if the 2 objective values are not equal for the ith objective
|
{
|
||||||
if ( fabs(_objectiveVector1[i] - _objectiveVector2[i]) > ObjectiveVector::Traits::tolerance() )
|
// first, we have to check if the 2 objective values are not equal for the ith objective
|
||||||
{
|
if (fabs (_objectiveVector1[i] - _objectiveVector2[i]) >
|
||||||
// if the ith objective have to be minimized...
|
ObjectiveVector::Traits::tolerance ())
|
||||||
if (ObjectiveVector::minimizing(i))
|
{
|
||||||
{
|
// if the ith objective have to be minimized...
|
||||||
if (_objectiveVector1[i] > _objectiveVector2[i])
|
if (ObjectiveVector::minimizing (i))
|
||||||
{
|
{
|
||||||
dom2 = true; //_objectiveVector2[i] is better than _objectiveVector1[i]
|
if (_objectiveVector1[i] > _objectiveVector2[i])
|
||||||
}
|
{
|
||||||
else // _objectiveVector1[i] < _objectiveVector2[i]
|
dom2 = true; //_objectiveVector2[i] is better than _objectiveVector1[i]
|
||||||
{
|
}
|
||||||
dom1 = true; //_objectiveVector1[i] is better than _objectiveVector2[i]
|
else // _objectiveVector1[i] < _objectiveVector2[i]
|
||||||
}
|
{
|
||||||
}
|
dom1 = true; //_objectiveVector1[i] is better than _objectiveVector2[i]
|
||||||
// if the ith objective have to be maximized...
|
}
|
||||||
else if (ObjectiveVector::maximizing(i))
|
}
|
||||||
{
|
// if the ith objective have to be maximized...
|
||||||
if (_objectiveVector1[i] > _objectiveVector2[i])
|
else if (ObjectiveVector::maximizing (i))
|
||||||
{
|
{
|
||||||
dom1 = true; //_objectiveVector1[i] is better than _objectiveVector2[i]
|
if (_objectiveVector1[i] > _objectiveVector2[i])
|
||||||
}
|
{
|
||||||
else // _objectiveVector1[i] < _objectiveVector2[i]
|
dom1 = true; //_objectiveVector1[i] is better than _objectiveVector2[i]
|
||||||
{
|
}
|
||||||
dom2 = true; //_objectiveVector2[i] is better than _objectiveVector1[i]
|
else // _objectiveVector1[i] < _objectiveVector2[i]
|
||||||
}
|
{
|
||||||
}
|
dom2 = true; //_objectiveVector2[i] is better than _objectiveVector1[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dom1 == dom2)
|
}
|
||||||
{
|
}
|
||||||
return 0; // no one dominates the other
|
if (dom1 == dom2)
|
||||||
}
|
{
|
||||||
if (dom1)
|
return 0; // no one dominates the other
|
||||||
{
|
}
|
||||||
return 1; //_objectiveVector1 dominates _objectiveVector2
|
if (dom1)
|
||||||
}
|
{
|
||||||
return -1; //_objectiveVector2 dominates _objectiveVector1
|
return 1; //_objectiveVector1 dominates _objectiveVector2
|
||||||
}
|
}
|
||||||
|
return -1; //_objectiveVector2 dominates _objectiveVector1
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*MOEOOBJECTIVEVECTORCOMPARATOR_H_*/
|
#endif /*MOEOOBJECTIVEVECTORCOMPARATOR_H_ */
|
||||||
|
|
|
||||||
|
|
@ -18,94 +18,105 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A traits class for moeoObjectiveVector to specify the number of objectives and which ones have to be minimized or maximized.
|
* A traits class for moeoObjectiveVector to specify the number of objectives and which ones have to be minimized or maximized
|
||||||
*/
|
*/
|
||||||
class moeoObjectiveVectorTraits
|
class moeoObjectiveVectorTraits
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** The tolerance value (used to compare solutions) */
|
/** The tolerance value (used to compare solutions) */
|
||||||
const static double tol = 1e-6;
|
const static double tol = 1e-6;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parameters setting
|
* Parameters setting
|
||||||
* @param _nObjectives the number of objectives
|
* @param _nObjectives the number of objectives
|
||||||
* @param _bObjectives the min/max vector (true = min / false = max)
|
* @param _bObjectives the min/max vector (true = min / false = max)
|
||||||
*/
|
*/
|
||||||
static void setup(unsigned _nObjectives, std::vector < bool > & _bObjectives)
|
static void setup (unsigned _nObjectives,
|
||||||
{
|
std::vector < bool > &_bObjectives)
|
||||||
// in case the number of objectives was already set to a different value
|
{
|
||||||
if ( nObj && (nObj != _nObjectives) ) {
|
// in case the number of objectives was already set to a different value
|
||||||
std::cout << "WARNING\n";
|
if (nObj && (nObj != _nObjectives))
|
||||||
std::cout << "WARNING : the number of objectives are changing\n";
|
{
|
||||||
std::cout << "ARNING : Make sure all existing objects are destroyed\n";
|
std::cout << "WARNING\n";
|
||||||
std::cout << "WARNING\n";
|
std::cout << "WARNING : the number of objectives are changing\n";
|
||||||
}
|
std::
|
||||||
// number of objectives
|
cout << "WARNING : Make sure all existing objects are destroyed\n";
|
||||||
nObj = _nObjectives;
|
std::cout << "WARNING\n";
|
||||||
// min/max vector
|
}
|
||||||
bObj = _bObjectives;
|
// number of objectives
|
||||||
// in case the number of objectives and the min/max vector size don't match
|
nObj = _nObjectives;
|
||||||
if (nObj != bObj.size())
|
// min/max vector
|
||||||
throw std::runtime_error("Number of objectives and min/max size don't match in moeoObjectiveVectorTraits::setup");
|
bObj = _bObjectives;
|
||||||
}
|
// in case the number of objectives and the min/max vector size don't match
|
||||||
|
if (nObj != bObj.size ())
|
||||||
|
throw std::
|
||||||
|
runtime_error
|
||||||
|
("Number of objectives and min/max size don't match in moeoObjectiveVectorTraits::setup");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of objectives
|
* Returns the number of objectives
|
||||||
*/
|
*/
|
||||||
static unsigned nObjectives()
|
static unsigned nObjectives ()
|
||||||
{
|
{
|
||||||
// in case the number of objectives would not be assigned yet
|
// in case the number of objectives would not be assigned yet
|
||||||
if (! nObj)
|
if (!nObj)
|
||||||
throw std::runtime_error("Number of objectives not assigned in moeoObjectiveVectorTraits");
|
throw std::
|
||||||
return nObj;
|
runtime_error
|
||||||
}
|
("Number of objectives not assigned in moeoObjectiveVectorTraits");
|
||||||
|
return nObj;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the _ith objective have to be minimized
|
* Returns true if the _ith objective have to be minimized
|
||||||
* @param _i the index
|
* @param _i the index
|
||||||
*/
|
*/
|
||||||
static bool minimizing(unsigned _i)
|
static bool minimizing (unsigned _i)
|
||||||
{
|
{
|
||||||
// in case the min/max vector would not be assigned yet
|
// in case the min/max vector would not be assigned yet
|
||||||
if (! bObj[_i])
|
if (!bObj[_i])
|
||||||
throw std::runtime_error("We don't know if the ith objective have to be minimized or maximized in moeoObjectiveVectorTraits");
|
throw std::
|
||||||
// in case there would be a wrong index
|
runtime_error
|
||||||
if (_i >= bObj.size())
|
("We don't know if the ith objective have to be minimized or maximized in moeoObjectiveVectorTraits");
|
||||||
throw std::runtime_error("Wrong index in moeoObjectiveVectorTraits");
|
// in case there would be a wrong index
|
||||||
return bObj[_i];
|
if (_i >= bObj.size ())
|
||||||
}
|
throw std::runtime_error ("Wrong index in moeoObjectiveVectorTraits");
|
||||||
|
return bObj[_i];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the _ith objective have to be maximized
|
* Returns true if the _ith objective have to be maximized
|
||||||
* @param _i the index
|
* @param _i the index
|
||||||
*/
|
*/
|
||||||
static bool maximizing(unsigned _i) {
|
static bool maximizing (unsigned _i)
|
||||||
return (! minimizing(_i));
|
{
|
||||||
}
|
return (!minimizing (_i));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the tolerance value (to compare solutions)
|
* Returns the tolerance value (to compare solutions)
|
||||||
*/
|
*/
|
||||||
static double tolerance()
|
static double tolerance ()
|
||||||
{
|
{
|
||||||
return tol;
|
return tol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** The number of objectives */
|
/** The number of objectives */
|
||||||
static unsigned nObj;
|
static unsigned nObj;
|
||||||
/** The min/max vector */
|
/** The min/max vector */
|
||||||
static std::vector < bool > bObj;
|
static std::vector < bool > bObj;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*MOEOOBJECTIVEVECTORTRAITS_H_*/
|
#endif /*MOEOOBJECTIVEVECTORTRAITS_H_ */
|
||||||
|
|
||||||
|
|
||||||
// The static variables of the moeoObjectiveVectorTraits class need to be allocated
|
// The static variables of the moeoObjectiveVectorTraits class need to be allocated
|
||||||
// (maybe it would have been better to put this on a moeoObjectiveVectorTraits.cpp file)
|
// (maybe it would have been better to put this on a moeoObjectiveVectorTraits.cpp file)
|
||||||
unsigned moeoObjectiveVectorTraits::nObj;
|
unsigned
|
||||||
|
moeoObjectiveVectorTraits::nObj;
|
||||||
std::vector < bool > moeoObjectiveVectorTraits::bObj;
|
std::vector < bool > moeoObjectiveVectorTraits::bObj;
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,10 @@
|
||||||
#include <eoReplacement.h>
|
#include <eoReplacement.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replacement strategy for multi-objective optimization.
|
* Replacement strategy for multi-objective optimization
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoReplacement:public eoReplacement < MOEOT >
|
||||||
class moeoReplacement : public eoReplacement < MOEOT > {};
|
{
|
||||||
|
};
|
||||||
|
|
||||||
#endif /*MOEOREPLACEMENT_H_*/
|
#endif /*MOEOREPLACEMENT_H_ */
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,8 @@
|
||||||
#include <eoSelectOne.h>
|
#include <eoSelectOne.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Selection strategy for multi-objective optimization that selects only one element from a whole population.
|
* Selection strategy for multi-objective optimization that selects only one element from a whole population
|
||||||
*/
|
*/
|
||||||
template < class MOEOT >
|
template < class MOEOT > class moeoSelectOne : public eoSelectOne < MOEOT > {};
|
||||||
class moeoSelectOne : public eoSelectOne < MOEOT > {};
|
|
||||||
|
|
||||||
#endif /*MOEOSELECTONE_H_*/
|
#endif /*MOEOSELECTONE_H_ */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue