00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef VirusOp_h
00025 #define VirusOp_h
00026
00027
00028
00029 #include <iostream>
00030 #include <functional>
00031 #include <string>
00032
00033 #include <utils/eoRNG.h>
00034 #include "eoVirus.h"
00035
00039 template<class FitT>
00040 class VirusBitFlip: public eoMonOp<eoVirus<FitT> > {
00041 public:
00043 virtual std::string className() const { return "VirusBitFlip"; };
00044
00049 bool operator()(eoVirus<FitT>& _chrom) {
00050 unsigned i = eo::rng.random(_chrom.size());
00051 _chrom.virusBitSet(i, _chrom.virusBit(i) ? false : true );
00052 return true;
00053 }
00054 };
00055
00056
00057 template<class FitT>
00058 class VirusMutation: public eoMonOp<eoVirus<FitT> > {
00059 public:
00061 virtual std::string className() const { return "VirusMutation"; };
00062
00067 bool operator()(eoVirus<FitT>& _chrom) {
00068
00069 std::vector<unsigned> bitsSet;
00070 for ( unsigned i = 0; i < _chrom.size(); i ++ ) {
00071 if ( _chrom.virusBit(i) ) {
00072 bitsSet.push_back( i );
00073 }
00074 }
00075 if ( !bitsSet.size() ) {
00076 return false;
00077 }
00078 unsigned flipSite = eo::rng.random(bitsSet.size());
00079 unsigned flipValue = bitsSet[ flipSite ];
00080 _chrom[flipValue] = _chrom[flipValue] ? false : true;
00081 return true;
00082 }
00083 };
00084
00085
00087 template<class FitT>
00088 class VirusShiftMutation: public eoMonOp<eoVirus<FitT> >
00089 {
00090 public:
00091
00093 VirusShiftMutation( ) {};
00094
00096 virtual std::string className() const { return "VirusShiftMutation"; };
00097
00102 bool operator()(eoVirus<FitT>& _chrom) {
00103
00104 eoBooleanGenerator gen;
00105 for ( unsigned i = 0; i < _chrom.size(); i ++ ) {
00106 if ( _chrom.virusBit(i) ) {
00107 if ( gen() ) {
00108 if ( i + 1 < _chrom.size() ) {
00109 _chrom.virusBitSet(i+1,true);
00110 _chrom.virusBitSet(i, false);
00111 }
00112 } else {
00113 if ( i > 1 ) {
00114 _chrom.virusBitSet(i-1,true);
00115 _chrom.virusBitSet(i, false);
00116 }
00117 }
00118 }
00119 }
00120 return true;
00121 }
00122 };
00123
00124
00125 template<class FitT>
00126 class VirusTransmission: public eoBinOp<eoVirus<FitT> > {
00127 public:
00129 virtual std::string className() const { return "VirusTransmission"; };
00130
00136 bool operator()(eoVirus<FitT>& _chrom,const eoVirus<FitT>& _chrom2) {
00137
00138 for ( unsigned i = 0; i < _chrom.size(); i ++ ) {
00139 _chrom.virusBitSet(i, _chrom2.virusBit(i) );
00140 }
00141 return true;
00142 }
00143 };
00144
00145 #endif //VirusOp_h