00001 #ifndef BitString_h 00002 #define BitString_h 00003 00004 #include "../Genotype.h" 00005 #include "BitStringCrsOnePoint.h" 00006 #include "BitStringMutSimple.h" 00007 #include "BitStringMutMix.h" 00008 #include "BitStringCrsUniform.h" 00009 #include<sstream> 00010 00011 namespace BitString 00012 { 00013 00023 class BitString : public Genotype 00024 { 00025 protected: 00026 uint nBits_; 00027 00028 public: 00029 std::vector<bool> bits; 00030 00031 BitString(uint nBits = 0) 00032 { name_ = "BitString"; 00033 nBits_ = nBits; 00034 } 00035 00036 void registerParameters(StateP state) 00037 { 00038 if(nBits_ == 0) 00039 nBits_ = 10; 00040 registerParameter(state, "size", (voidP) new uint(nBits_), ECF::UINT, 00041 "number of bits (mandatory)"); 00042 } 00043 00044 bool initialize(StateP state) 00045 { 00046 if(!isParameterDefined(state, "size")) { 00047 ECF_LOG_ERROR(state, "Error: BitString genotype size not defined!"); 00048 throw(""); 00049 } 00050 00051 voidP sizep = getParameterValue(state, "size"); 00052 nBits_ = *((uint*) sizep.get()); 00053 00054 if(nBits_ < 1) { 00055 ECF_LOG_ERROR(state, "Error: invalid size for BitString genotype!"); 00056 throw(""); 00057 } 00058 00059 bits.resize(nBits_); 00060 for(uint i = 0; i < bits.size(); i++){ 00061 bits[i] = (state->getRandomizer()->getRandomInteger(2) % 2) ? true:false; 00062 } 00063 return true; 00064 } 00065 00066 BitString* copy() 00067 { 00068 BitString *newObject = new BitString(*this); 00069 return newObject; 00070 } 00071 00072 std::vector<CrossoverOpP> getCrossoverOp() 00073 { 00074 std::vector<CrossoverOpP> crx; 00075 crx.push_back(static_cast<CrossoverOpP> (new BitStringCrsOnePoint)); 00076 crx.push_back(static_cast<CrossoverOpP> (new BitStringCrsUniform)); 00077 return crx; 00078 } 00079 00080 std::vector<MutationOpP> getMutationOp() 00081 { 00082 std::vector<MutationOpP> mut; 00083 mut.push_back(static_cast<MutationOpP> (new BitStringMutSimple)); 00084 mut.push_back(static_cast<MutationOpP> (new BitStringMutMix)); 00085 return mut; 00086 } 00087 00088 void write(XMLNode &xBitString) 00089 { 00090 xBitString = XMLNode::createXMLTopNode("BitString"); 00091 std::stringstream sValue; 00092 sValue << bits.size(); 00093 xBitString.addAttribute("size", sValue.str().c_str()); 00094 00095 sValue.str(""); 00096 for(uint iBit = 0; iBit < bits.size(); iBit++) 00097 sValue << ((bits[iBit] == true) ? '1' : '0'); 00098 xBitString.addText(sValue.str().c_str()); 00099 } 00100 00101 void read(XMLNode &xBitString) 00102 { 00103 XMLCSTR xBits = xBitString.getText(); 00104 for(uint iBit = 0; iBit < bits.size(); iBit++) 00105 bits[iBit] = (xBits[iBit] == '0') ? false : true; 00106 } 00107 }; 00108 } 00109 00110 typedef boost::shared_ptr<BitString::BitString> BitStringP; 00111 00112 #endif // BitString_h 00113