MOEO full import
git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@23 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
parent
3b59d069b4
commit
b08dfed4b1
182 changed files with 14280 additions and 0 deletions
169
trunk/paradiseo-moeo/src/moeoReplacement.h
Normal file
169
trunk/paradiseo-moeo/src/moeoReplacement.h
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// moeoReplacement.h
|
||||
// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006
|
||||
/*
|
||||
This library...
|
||||
|
||||
Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
|
||||
*/
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef MOEOREPLACEMENT_H_
|
||||
#define MOEOREPLACEMENT_H_
|
||||
|
||||
#include <eoPerf2Worth.h>
|
||||
#include <eoPop.h>
|
||||
#include <eoReplacement.h>
|
||||
|
||||
|
||||
/**
|
||||
* Replacement strategy for multi-objective optimization
|
||||
*/
|
||||
template < class EOT, class WorthT > class moeoReplacement:public eoReplacement <
|
||||
EOT >
|
||||
{
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Keep all the best individuals
|
||||
* (almost cut-and-pasted from eoNDPlusReplacement, (c) Maarten Keijzer, Marc Schoenauer and GeNeura Team, 2002)
|
||||
*/
|
||||
template < class EOT, class WorthT =
|
||||
double >class moeoElitistReplacement:public moeoReplacement < EOT, WorthT >
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* constructor
|
||||
* @param _perf2worth the functor class to transform raw fitnesses into fitness for selection
|
||||
*/
|
||||
moeoElitistReplacement (eoPerf2Worth < EOT,
|
||||
WorthT > &_perf2worth):perf2worth (_perf2worth)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* replacement - result in _parents
|
||||
* @param _parents parents population
|
||||
* @param _offspring offspring population
|
||||
*/
|
||||
void operator () (eoPop < EOT > &_parents, eoPop < EOT > &_offspring)
|
||||
{
|
||||
unsigned size = _parents.size ();
|
||||
_parents.reserve (_parents.size () + _offspring.size ());
|
||||
copy (_offspring.begin (), _offspring.end (), back_inserter (_parents));
|
||||
|
||||
// calculate worths
|
||||
perf2worth (_parents);
|
||||
perf2worth.sort_pop (_parents);
|
||||
perf2worth.resize (_parents, size);
|
||||
|
||||
_offspring.clear ();
|
||||
}
|
||||
|
||||
private:
|
||||
/** the functor object to transform raw fitnesses into fitness for selection */
|
||||
eoPerf2Worth < EOT, WorthT > &perf2worth;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Same than moeoElitistReplacement except that distinct individuals are privilegied
|
||||
*/
|
||||
template < class EOT, class WorthT =
|
||||
double >class moeoDisctinctElitistReplacement:public moeoReplacement < EOT,
|
||||
WorthT >
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* constructor
|
||||
* @param _perf2worth the functor class to transform raw fitnesses into fitness for selection
|
||||
*/
|
||||
moeoDisctinctElitistReplacement (eoPerf2Worth < EOT,
|
||||
WorthT >
|
||||
&_perf2worth):perf2worth (_perf2worth)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* replacement - result in _parents
|
||||
* @param _parents parents population
|
||||
* @param _offspring offspring population
|
||||
*/
|
||||
void operator () (eoPop < EOT > &_parents, eoPop < EOT > &_offspring)
|
||||
{
|
||||
unsigned size = _parents.size ();
|
||||
_parents.reserve (_parents.size () + _offspring.size ());
|
||||
copy (_offspring.begin (), _offspring.end (), back_inserter (_parents));
|
||||
|
||||
// creation of the new population (of size 'size')
|
||||
createNewPop (_parents, size);
|
||||
|
||||
_offspring.clear ();
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/** the functor object to transform raw fitnesses into fitness for selection */
|
||||
eoPerf2Worth < EOT, WorthT > &perf2worth;
|
||||
|
||||
|
||||
/**
|
||||
* creation of the new population of size _size
|
||||
* @param _pop the initial population (will be modified)
|
||||
* @param _size the size of the population to create
|
||||
*/
|
||||
void createNewPop (eoPop < EOT > &_pop, unsigned _size)
|
||||
{
|
||||
// the number of occurences for each individual
|
||||
std::map < EOT, unsigned >nb_occurences;
|
||||
for (unsigned i = 0; i < _pop.size (); i++)
|
||||
nb_occurences[_pop[i]] = 0;
|
||||
// the new population
|
||||
eoPop < EOT > new_pop;
|
||||
new_pop.reserve (_pop.size ());
|
||||
for (unsigned i = 0; i < _pop.size (); i++)
|
||||
{
|
||||
if (nb_occurences[_pop[i]] == 0)
|
||||
new_pop.push_back (_pop[i]);
|
||||
nb_occurences[_pop[i]]++;
|
||||
}
|
||||
|
||||
// calculate worths (on the new population)
|
||||
perf2worth (new_pop);
|
||||
perf2worth.sort_pop (new_pop);
|
||||
|
||||
// if case there's not enough individuals in the population...
|
||||
unsigned new_pop_size_init = new_pop.size ();
|
||||
unsigned k = 0;
|
||||
while (new_pop.size () < _size)
|
||||
{
|
||||
if (k < new_pop_size_init)
|
||||
{
|
||||
if (nb_occurences[new_pop[k]] > 1)
|
||||
{
|
||||
new_pop.push_back (new_pop[k]);
|
||||
nb_occurences[new_pop[k]]--;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
else
|
||||
k = 0;
|
||||
}
|
||||
|
||||
// resize and swap the populations
|
||||
perf2worth.resize (new_pop, _size);
|
||||
_pop.resize (_size);
|
||||
_pop.swap (new_pop);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif /*MOEOREPLACEMENT_H_ */
|
||||
Loading…
Add table
Add a link
Reference in a new issue