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 }
00042
00043 bool initialize(StateP state)
00044 {
00045 if(!isParameterDefined(state, "size")) {
00046 ECF_LOG_ERROR(state, "Error: BitString genotype size not defined!");
00047 throw("");
00048 }
00049
00050 voidP sizep = getParameterValue(state, "size");
00051 nBits_ = *((uint*) sizep.get());
00052
00053 if(nBits_ < 1) {
00054 ECF_LOG_ERROR(state, "Error: invalid size for BitString genotype!");
00055 throw("");
00056 }
00057
00058 bits.resize(nBits_);
00059 for(uint i = 0; i < bits.size(); i++){
00060 bits[i] = rand() % 2 ? true:false;
00061 }
00062 return true;
00063 }
00064
00065 BitString* copy()
00066 {
00067 BitString *newObject = new BitString(*this);
00068 return newObject;
00069 }
00070
00071 std::vector<CrossoverOpP> getCrossoverOp()
00072 {
00073 std::vector<CrossoverOpP> crx;
00074 crx.push_back(static_cast<CrossoverOpP> (new BitStringCrsOnePoint));
00075 crx.push_back(static_cast<CrossoverOpP> (new BitStringCrsUniform));
00076 return crx;
00077 }
00078
00079 std::vector<MutationOpP> getMutationOp()
00080 {
00081 std::vector<MutationOpP> mut;
00082 mut.push_back(static_cast<MutationOpP> (new BitStringMutSimple));
00083 mut.push_back(static_cast<MutationOpP> (new BitStringMutMix));
00084 return mut;
00085 }
00086
00087 void write(XMLNode &xBitString)
00088 {
00089 xBitString = XMLNode::createXMLTopNode("BitString");
00090 std::stringstream sValue;
00091 sValue << bits.size();
00092 xBitString.addAttribute("size", sValue.str().c_str());
00093
00094 sValue.str("");
00095 for(uint iBit = 0; iBit < bits.size(); iBit++)
00096 sValue << ((bits[iBit] == true) ? '1' : '0');
00097 xBitString.addText(sValue.str().c_str());
00098 }
00099
00100 void read(XMLNode &xBitString)
00101 {
00102 XMLCSTR xBits = xBitString.getText();
00103 for(uint iBit = 0; iBit < bits.size(); iBit++)
00104 bits[iBit] = (xBits[iBit] == '0') ? false : true;
00105 }
00106 };
00107 }
00108
00109 typedef boost::shared_ptr<BitString::BitString> BitStringP;
00110
00111 #endif // BitString_h
00112