diff --git a/eo/src/eo b/eo/src/eo index 91e35416..43e26d82 100644 --- a/eo/src/eo +++ b/eo/src/eo @@ -42,6 +42,8 @@ #include +#include + #include #include diff --git a/eo/src/eoBreeder.h b/eo/src/eoBreeder.h new file mode 100644 index 00000000..fe13352d --- /dev/null +++ b/eo/src/eoBreeder.h @@ -0,0 +1,92 @@ +//----------------------------------------------------------------------------- +// eoBreeder.h +//----------------------------------------------------------------------------- + +#ifndef eoBreeder_h +#define eoBreeder_h + +//----------------------------------------------------------------------------- + +#include // vector +#include // pair +#include // eoTransform, eoUniform, eoOp, eoMonOp, eoBinOp, eoPop + +/***************************************************************************** + * eoBreeder: transforms a population using genetic operators. * + * For every operator there is a rated to be applyed. * + *****************************************************************************/ + +template class eoBreeder: public eoTransform +{ + public: + /// Default constructor. + eoBreeder(): uniform(0.0, 1.0) {} + + /// Destructor. + ~eoBreeder() + { + for (Operators::iterator op = operators.begin(); + op != operators.end(); + op++) + delete op->second; + } + + /** + * Adds a genetic operator. + * @param operator The operator. + * @param rate Rate to apply the operator. + */ + void add(eoOp* operator, float rate = 1.0) + { + operators.push_back(pair * >(operator, rate)); + } + + /** + * Transforms a population. + * @param pop The population to be transformed. + */ + void operator()(eoPop& pop) const + { + for (Operators::const_iterator op = operators.begin(); + op != operators.end(); + op++) + if (op->first < uniform()) + switch (op->second->readArity()) + { + case unary: + { + eoMonOp& monop = + dinamic_cast >(*(op->second)); + for_each(pop.begin(), pop.end(), monop); + break; + } + case binary: + { + eoBinOp& binop = + dinamic_cast >(*(op->second)); + for (unsigned i = 1; i < pop.size(); i += 2) + binop(pop[i - 1], pop[i]); + break; + } + default: + { + cerr << "eoBreeder:operator() Not implemented yet!" << endl; + exit(EXIT_FAILURE); + break; + } + } + } + + /// The class name. + string classname() const { return "eoBreeder"; } + + private: + typedef vector*> > Operators; + + eoUniform uniform; + Operators operators; +}; + +//----------------------------------------------------------------------------- + +#endif eoBreeder_h