paradiseo/problems/DTLZ/src/PolynomialMutation.h

123 lines
4 KiB
C++

/*
* <PolynomialMutation.h>
* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2008
* (C) OPAC Team, LIFL, 2002-2008
*
* Arnaud Liefooghe
* Jeremie Humeau
*
* This software is governed by the CeCILL license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL license and that you accept its terms.
*
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
* Contact: paradiseo-help@lists.gforge.inria.fr
*
*/
//-----------------------------------------------------------------------------
#ifndef POLYNOMIALMUTATION_H_
#define POLYNOMIALMUTATION_H_
#include <utils/eoRealVectorBounds.h>
template<class EOT> class PolynomialMutation: public eoMonOp<EOT>
{
public:
PolynomialMutation(eoRealVectorBounds & _bounds, const double& _p_mut = 0.5, const double& _eta = 1.0):
p_mut(_p_mut), eta(_eta), bounds(_bounds) {}
/// The class name.
virtual std::string className() const {
return "PolynomialMutation";
}
/**
* Do it!
* @param _eo The indi undergoing the mutation
*/
bool operator()(EOT& _eo)
{
bool hasChanged=false;
double rnd, delta1, delta2, mut_pow, deltaq, delta_max;
double y, yl, yu, val, xy;
for (unsigned j=0; j<_eo.size(); j++)
{
if (rng.flip(p_mut))
{
y = _eo[j];
yl = bounds.minimum(j);
yu = bounds.maximum(j);
delta1 = (y-yl)/(yu-yl);
delta2 = (yu-y)/(yu-yl);
//Ajout
if ( (y-yl) > (yu-y))
delta_max = delta2;
else
delta_max= delta1;
//fin ajout
rnd = rng.uniform();
mut_pow = 1.0/(eta+1.0);
if (rnd <= 0.5)
{
xy = 1.0-delta_max;//delta_max au lieu de delta1
val = 2.0*rnd+(1.0-2.0*rnd)*(pow(xy,(eta+1.0)));
deltaq = pow(val,mut_pow) - 1.0;
}
else
{
xy = 1.0-delta_max;//delta_max au lieu de delta2
val = 2.0*(1.0-rnd)+2.0*(rnd-0.5)*(pow(xy,(eta+1.0)));
deltaq = 1.0 - (pow(val,mut_pow));
}
//ajout
if (deltaq > delta_max)
deltaq = delta_max;
else if (deltaq < -delta_max)
deltaq= -delta_max;
//fin ajout
y = y + deltaq*(yu-yl);
bounds.truncate(j, y);
_eo[j] = y;
hasChanged = true;
}
}
return hasChanged;
}
private:
double p_mut;
double eta;
eoRealVectorBounds & bounds;
};
#endif /*POLYNOMIALMUTATION_H_*/