00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _eoSGATransform_h
00028 #define _eoSGATransform_h
00029
00030 #include <eoInvalidateOps.h>
00031 #include <eoPop.h>
00032
00034
00036 #include <vector>
00037 #include <utils/eoRNG.h>
00038 #include <eoTransform.h>
00039
00045 template<class EOT> class eoSGATransform : public eoTransform<EOT>
00046 {
00047 public:
00048
00050 eoSGATransform(eoQuadOp<EOT>& _cross, double _cProba,
00051 eoMonOp<EOT>& _mutate, double _mProba)
00052 : cross(_cross),
00053 crossoverProba(_cProba),
00054 mutate(_mutate),
00055 mutationProba(_mProba) {}
00056
00057
00062 void operator()(eoPop<EOT>& _pop)
00063 {
00064 unsigned i;
00065
00066 for (i=0; i<_pop.size()/2; i++)
00067 {
00068 if ( rng.flip(crossoverProba) )
00069 {
00070
00071 cross(_pop[2*i], _pop[2*i+1]);
00072 }
00073 }
00074
00075 for (i=0; i < _pop.size(); i++)
00076 {
00077 if (rng.flip(mutationProba) )
00078 {
00079 mutate(_pop[i]);
00080 }
00081
00082 }
00083 };
00084
00085 private:
00086 eoInvalidateQuadOp<EOT> cross;
00087 double crossoverProba;
00088 eoInvalidateMonOp<EOT> mutate;
00089 double mutationProba;
00090 };
00091
00098 template<class EOT> class eoDynSGATransform : public eoTransform<EOT>
00099 {
00100 public:
00101
00103 eoDynSGATransform(eoQuadOp<EOT>& _cross, double _cProba,
00104 eoMonOp<EOT>& _mutate, double _mProba)
00105 : cross(_cross),
00106 crossoverProbaHolder(_cProba), crossoverProba(crossoverProbaHolder),
00107 mutate(_mutate),
00108 mutationProbaHolder(_mProba), mutationProba(mutationProbaHolder) {}
00109
00111
00112
00113 eoDynSGATransform(eoQuadOp<EOT>& _cross, double* _cProbaRef,
00114 eoMonOp<EOT>& _mutate, double* _mProbaRef)
00115 : cross(_cross),
00116 crossoverProbaHolder(0), crossoverProba(*_cProbaRef),
00117 mutate(_mutate),
00118 mutationProbaHolder(0), mutationProba(*_mProbaRef) {}
00119
00120
00125 void operator()(eoPop<EOT>& _pop)
00126 {
00127 unsigned i;
00128
00129 for (i=0; i<_pop.size()/2; i++)
00130 {
00131 if ( rng.flip(crossoverProba) )
00132 {
00133
00134 cross(_pop[2*i], _pop[2*i+1]);
00135 }
00136 }
00137
00138 for (i=0; i < _pop.size(); i++)
00139 {
00140 if (rng.flip(mutationProba) )
00141 {
00142 mutate(_pop[i]);
00143 }
00144
00145 }
00146 };
00147
00148 double & PCrossHandle() { return crossoverProba;}
00149 double & PMutHandle() { return mutationProba;}
00150
00151 private:
00152
00153
00154
00155 eoInvalidateQuadOp<EOT> cross;
00156 double crossoverProbaHolder;
00157 double& crossoverProba;
00158 eoInvalidateMonOp<EOT> mutate;
00159 double mutationProbaHolder;
00160 double& mutationProba;
00161 };
00162
00163
00164 #endif