00001
00002 #ifndef __MUTATOR_H__
00003 #define __MUTATOR_H__
00004
00005 #include <magic/mmath.h>
00006
00009 class FloatMutator {
00010 public:
00023 virtual double mutate (double x, double min, double max, double variance) const{FORBIDDEN}
00024 };
00025
00031 class ConstantMutator : public FloatMutator {
00032 double mVariance;
00033 public:
00039 ConstantMutator (double var=0.22) : mVariance(var){}
00040
00044 virtual double mutate (double p, double min, double max, double variance) const {
00045
00046 double pp=p;
00047 if (max>min) {
00048
00049 double delta;
00050 do {
00051 delta = gaussrnd (mVariance);
00052 } while (pp+delta<min || pp+delta>max);
00053 pp += delta;
00054 }
00055 return pp;
00056 }
00057 };
00058
00061 class MutationMutator : public FloatMutator {
00062 double mPhi;
00063 public:
00068 MutationMutator (double phi=0.22) : mPhi(phi){}
00069
00075 virtual double mutate (double p, double min, double max, double variance) const {
00076
00077 double pp = 1/(1+(1-p)/p*exp(-gaussrnd(mPhi)));
00078 if (pp<min)
00079 pp=min;
00080 return pp;
00081 }
00082 };
00083
00086 class MutationSimpleMutator : public FloatMutator {
00087 double mTau;
00088 public:
00096 MutationSimpleMutator (int n=100) : mTau(1/sqrt(double(n))){}
00097
00102 virtual double mutate (double p, double min, double max, double variance) const {
00103
00104 double pp = p*exp(mTau*gaussrnd(1));
00105 if (pp<min)
00106 pp=min;
00107 return pp;
00108 }
00109 };
00110
00111
00114 class CircularMutator : public FloatMutator {
00115 double mPhi;
00116 public:
00120 virtual double mutate (double p, double min, double max, double variance) const {
00121 return 1/(1+(1-p)/p*exp(-mPhi*gaussrnd(1)));
00122 }
00123 };
00124
00125 #endif
00126