Well, what do you know, major commit.
Changed the signature of eoMon, eoBin and eoQuadOp to return a bool, without invalidating fitness. Added a set of invalidators to take over that job (see for instance eoSGA and eoSGATransform how this can transparantly used) Derived eoState from eoFunctorStore (for convenience, from a design perspective this may sound wrong) Added a wrap_op function that does the wrapping for you (see eoOpContainer how this made this functor exceedingly less hairy). Checked all the tests removed the eoGeneric*Op family (not needed anymore) and of course changed all the operators to reflect the change (and found a few that didn't invalidate the fitness, thus really pointing out the advantage of the current approach)
This commit is contained in:
parent
17d55ae92b
commit
3a9b5a0e7e
30 changed files with 651 additions and 564 deletions
|
|
@ -80,22 +80,22 @@ public:
|
|||
|
||||
/// needed virtual dtor
|
||||
virtual ~eoEsMutate() {};
|
||||
|
||||
/** Inherited from eoObject
|
||||
|
||||
/** Inherited from eoObject
|
||||
@see eoObject
|
||||
*/
|
||||
virtual string className() const {return "eoESMutate";};
|
||||
|
||||
|
||||
/**
|
||||
Mutate eoEsSimple
|
||||
*/
|
||||
virtual void operator()( eoEsSimple<FitT>& _eo)
|
||||
virtual bool operator()( eoEsSimple<FitT>& _eo)
|
||||
{
|
||||
_eo.stdev *= exp(TauLcl * rng.normal());
|
||||
_eo.stdev *= exp(TauLcl * rng.normal());
|
||||
|
||||
if (_eo.stdev < stdev_eps)
|
||||
_eo.stdev = stdev_eps;
|
||||
|
||||
|
||||
// now apply to all
|
||||
|
||||
for (unsigned i = 0; i < _eo.size(); ++i)
|
||||
|
|
@ -104,40 +104,40 @@ public:
|
|||
}
|
||||
bounds.foldsInBounds(_eo);
|
||||
|
||||
_eo.invalidate();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/// mutations - standard and correlated
|
||||
// =========
|
||||
// =========
|
||||
/*
|
||||
* Standard mutation of object variables and standard
|
||||
* deviations in ESs.
|
||||
* If there are fewer different standard deviations available
|
||||
* than the dimension of the objective function requires, the
|
||||
* Standard mutation of object variables and standard
|
||||
* deviations in ESs.
|
||||
* If there are fewer different standard deviations available
|
||||
* than the dimension of the objective function requires, the
|
||||
* last standard deviation is responsible for ALL remaining
|
||||
* object variables.
|
||||
* Schwefel 1977: Numerische Optimierung von Computer-Modellen
|
||||
* mittels der Evolutionsstrategie, pp. 165 ff.
|
||||
*/
|
||||
|
||||
virtual void operator()( eoEsStdev<FitT>& _eo )
|
||||
virtual bool operator()( eoEsStdev<FitT>& _eo )
|
||||
{
|
||||
double global = exp(TauGlb * rng.normal());
|
||||
for (unsigned i = 0; i < _eo.size(); i++)
|
||||
for (unsigned i = 0; i < _eo.size(); i++)
|
||||
{
|
||||
double stdev = _eo.stdevs[i];
|
||||
stdev *= global * exp(TauLcl * rng.normal());
|
||||
stdev *= global * exp(TauLcl * rng.normal());
|
||||
|
||||
if (stdev < stdev_eps)
|
||||
stdev = stdev_eps;
|
||||
|
||||
_eo.stdevs[i] = stdev;
|
||||
_eo.stdevs[i] = stdev;
|
||||
_eo[i] += stdev * rng.normal();
|
||||
}
|
||||
|
||||
bounds.foldsInBounds(_eo);
|
||||
|
||||
_eo.invalidate();
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -148,43 +148,43 @@ public:
|
|||
* G. Rudolph: Globale Optimierung mit parallelen Evolutions-
|
||||
* strategien, Diploma Thesis, University of Dortmund, 1990
|
||||
*/
|
||||
|
||||
// Code from Thomas Baeck
|
||||
|
||||
virtual void operator()( eoEsFull<FitT> & _eo )
|
||||
|
||||
// Code from Thomas Baeck
|
||||
|
||||
virtual bool operator()( eoEsFull<FitT> & _eo )
|
||||
{
|
||||
|
||||
/*
|
||||
* First: mutate standard deviations (as above).
|
||||
*/
|
||||
|
||||
|
||||
double global = exp(TauGlb * rng.normal());
|
||||
unsigned i;
|
||||
for (i = 0; i < _eo.size(); i++)
|
||||
for (i = 0; i < _eo.size(); i++)
|
||||
{
|
||||
double stdev = _eo.stdevs[i];
|
||||
stdev *= global * exp(TauLcl * rng.normal());
|
||||
stdev *= global * exp(TauLcl * rng.normal());
|
||||
|
||||
if (stdev < stdev_eps)
|
||||
stdev = stdev_eps;
|
||||
|
||||
_eo.stdevs[i] = stdev;
|
||||
_eo.stdevs[i] = stdev;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Mutate rotation angles.
|
||||
*/
|
||||
|
||||
for (i = 0; i < _eo.correlations.size(); i++)
|
||||
|
||||
for (i = 0; i < _eo.correlations.size(); i++)
|
||||
{
|
||||
_eo.correlations[i] += TauBeta * rng.normal();
|
||||
if ( fabs(_eo.correlations[i]) > M_PI )
|
||||
_eo.correlations[i] += TauBeta * rng.normal();
|
||||
if ( fabs(_eo.correlations[i]) > M_PI )
|
||||
{
|
||||
_eo.correlations[i] -= M_PI * (int) (_eo.correlations[i]/M_PI) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Perform correlated mutations.
|
||||
*/
|
||||
|
|
@ -192,17 +192,17 @@ public:
|
|||
double d1,d2, S, C;
|
||||
|
||||
vector<double> VarStp(_eo.size());
|
||||
for (i = 0; i < _eo.size(); i++)
|
||||
for (i = 0; i < _eo.size(); i++)
|
||||
VarStp[i] = _eo.stdevs[i] * rng.normal();
|
||||
|
||||
unsigned nq = _eo.correlations.size() - 1;
|
||||
|
||||
for (k = 0; k < _eo.size()-1; k++)
|
||||
for (k = 0; k < _eo.size()-1; k++)
|
||||
{
|
||||
n1 = _eo.size() - k - 1;
|
||||
n2 = _eo.size() - 1;
|
||||
|
||||
for (i = 0; i < k; i++)
|
||||
|
||||
for (i = 0; i < k; i++)
|
||||
{
|
||||
d1 = VarStp[n1];
|
||||
d2 = VarStp[n2];
|
||||
|
|
@ -214,13 +214,13 @@ public:
|
|||
nq--;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < _eo.size(); i++)
|
||||
|
||||
for (i = 0; i < _eo.size(); i++)
|
||||
_eo[i] += VarStp[i];
|
||||
|
||||
bounds.foldsInBounds(_eo);
|
||||
|
||||
_eo.invalidate();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private :
|
||||
|
|
@ -243,14 +243,14 @@ public:
|
|||
TauLcl /= sqrt( 2.0 * sqrt( (double)size ) );
|
||||
TauGlb /= sqrt( 2.0 * ( (double) size ) );
|
||||
}
|
||||
|
||||
|
||||
void init(eoEsFull<FitT>, eoEsMutationInit& _init)
|
||||
{
|
||||
init(eoEsStdev<FitT>(), _init);
|
||||
TauBeta = _init.TauBeta();
|
||||
}
|
||||
|
||||
// the data
|
||||
// the data
|
||||
//=========
|
||||
double TauLcl; /* Local factor for mutation of std deviations */
|
||||
double TauGlb; /* Global factor for mutation of std deviations */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue