00001 #ifndef GLMUTATORCOMBINED_H_
00002 #define GLMUTATORCOMBINED_H_
00003 #include <vector>
00004
00005 #include "GLBaseMutator.h"
00006 #include "GLBaseParameters.h"
00007
00008 using namespace std;
00035 class GLMutatorCombined : public GLBaseMutator
00036 {
00037 public:
00042 enum TUsage
00043 {
00044 SEPARATE = 1,
00045
00046 COMBINED = 2
00047
00048 };
00049 class TParameters;
00050 public:
00071 GLMutatorCombined(const vector<GLBaseMutator*>& mutators,
00072 const double& mutation_rate = 0.1,
00073 const vector<double>& weights = vector<double>(0),
00074 TUsage apply_mutators = COMBINED):
00075 GLBaseMutator(mutation_rate, true),
00076 m_apply_mutators(apply_mutators),
00077 mv_mutators(mutators),
00078 mv_weights(weights)
00079 { checkAndInit(); }
00080
00081
00091 GLMutatorCombined(const double& mutation_rate,
00092 GLMutatorCombined::TParameters *parameters):
00093 GLBaseMutator(mutation_rate, true),
00094 m_apply_mutators(parameters->t_apply_mutators),
00095 mv_mutators(parameters->tv_mutators),
00096 mv_weights(parameters->tv_weights)
00097 { checkAndInit(); }
00098
00103 GLMutatorCombined(const GLMutatorCombined& mutator);
00104
00108 virtual ~GLMutatorCombined();
00109
00115 virtual GLBaseMutator* copy() const
00116 { return new GLMutatorCombined(*this); }
00117
00124 virtual bool mutateOrganism(GLBaseOrganism* organism);
00125 protected:
00131 void checkAndInit();
00132
00138 bool mutateCombined(GLBaseOrganism* organism);
00139
00147 bool mutateSeparately(GLBaseOrganism* organism);
00148
00154 void processWeights();
00155 public:
00160 struct TParameters:public GLBaseParameters
00161 {
00177 TParameters(const vector<GLBaseMutator*>& mutators,
00178 const vector<double>& weights = vector<double>(0),
00179 TUsage apply_mutators = COMBINED):
00180 t_apply_mutators(apply_mutators),
00181 tv_mutators(mutators),
00182 tv_weights(weights)
00183
00184 {}
00185
00190 TParameters(const TParameters *source):
00191 t_apply_mutators(source->t_apply_mutators),
00192 tv_mutators(source->tv_mutators),
00193 tv_weights(source->tv_weights)
00194 {}
00195
00200 virtual GLBaseParameters* copy() const
00201 { return new TParameters(this); }
00202
00205 TUsage t_apply_mutators;
00207 vector<GLBaseMutator*> tv_mutators;
00211 vector<double> tv_weights;
00212 };
00213
00214 private:
00215 TUsage m_apply_mutators;
00216 vector<GLBaseMutator*> mv_mutators;
00217 vector<double> mv_weights;
00218 vector<double> mv_norm_cumul_weights;
00219
00220 };
00221
00222 #endif