BinaryIntegerGene.cpp
Go to the documentation of this file.00001 00009 #include <BinaryIntegerGene.h> 00010 00020 BinaryIntegerGene::BinaryIntegerGene(int numberOfBits, 00021 int lowerBound , 00022 int upperBound, 00023 Random * random) : 00024 Gene(BINARY_INTEGER, random) { 00025 00026 if (numberOfBits > MAX_LENGTH) { 00027 cerr << "BinaryIntegerGene::BinaryIntegerGene-> the maximum length is " 00028 << MAX_LENGTH << " bits. The MAX_LENGTH constant can be " 00029 << "redefined in BinaryIntegerGene.h" << endl ; 00030 exit(-1) ; 00031 } // if 00032 00033 upperBound_ = upperBound ; 00034 lowerBound_ = lowerBound ; 00035 numberOfBits_ = numberOfBits ; 00036 00037 for (int i = 0; i < numberOfBits; i++) 00038 if (random_->rnd(0,1) == 1) 00039 binaryAllele_[i] = 1 ; 00040 else 00041 binaryAllele_[i] = 0 ; 00042 00043 integerAllele_ = decodeToInteger() ; 00044 00045 #ifdef __MPI__ 00046 this->calculateSize() ; 00047 #endif 00048 } // BinaryIntegerGene::BinaryIntegerGene 00049 00056 BinaryIntegerGene::BinaryIntegerGene(BinaryIntegerGene & gene) : 00057 Gene(gene) { 00058 upperBound_ = gene.upperBound_ ; 00059 lowerBound_ = gene.lowerBound_ ; 00060 numberOfBits_ = gene.numberOfBits_ ; 00061 binaryAllele_ = gene.binaryAllele_ ; 00062 integerAllele_ = gene.integerAllele_ ; 00063 00064 #ifdef __MPI__ 00065 this->calculateSize() ; 00066 #endif 00067 } // BinaryIntegerGene::BinaryIntegerGene 00068 00069 00077 BinaryIntegerGene::BinaryIntegerGene(BinaryIntegerGene * gene) : Gene(gene) { 00078 upperBound_ = gene->upperBound_ ; 00079 lowerBound_ = gene->lowerBound_ ; 00080 numberOfBits_ = gene->numberOfBits_ ; 00081 binaryAllele_ = gene->binaryAllele_ ; 00082 integerAllele_ = gene->integerAllele_ ; 00083 00084 #ifdef __MPI__ 00085 this->calculateSize() ; 00086 #endif 00087 00088 } // BinaryIntegerGene::BinaryIntegerGene 00089 00095 BinaryIntegerGene::~BinaryIntegerGene() { 00096 } // BinaryIntegerGene::~BinaryIntegerGene 00097 00098 BinaryIntegerGene & BinaryIntegerGene::operator=(const BinaryIntegerGene& gene) { 00099 upperBound_ = gene.upperBound_ ; 00100 lowerBound_ = gene.lowerBound_ ; 00101 numberOfBits_ = gene.numberOfBits_ ; 00102 binaryAllele_ = gene.binaryAllele_ ; 00103 integerAllele_ = gene.integerAllele_ ; 00104 00105 return *this ; 00106 } // BinaryIntegerGene::operator= 00107 00113 void BinaryIntegerGene::singlePointCrossover(int point, Gene * gene) { 00114 bitset<1> swap ; 00115 00116 for (int i = 0; i < numberOfBits_; i++) 00117 if (i > point) { 00118 swap[0] = this->binaryAllele_[i] ; 00119 this->binaryAllele_[i] = ((BinaryIntegerGene *)gene)->binaryAllele_[i] ; 00120 ((BinaryIntegerGene *)gene)->binaryAllele_[i] = swap[0] ; 00121 } // if 00122 00123 integerAllele_ = decodeToInteger() ; 00124 ((BinaryIntegerGene *)gene)->integerAllele_ = ((BinaryIntegerGene *)gene)->decodeToInteger() ; 00125 } // BinaryIntegerGene::singlePointCrossover 00126 00127 int BinaryIntegerGene::bitFlipMutation(double mutationProbability) { 00128 int mutations ; 00129 mutations = 0 ; 00130 00131 for (int i = 0; i < numberOfBits_ ; i++) 00132 if (random_->flip(mutationProbability) == 1) { 00133 mutations ++ ; 00134 if (binaryAllele_[i] == 1) 00135 binaryAllele_[i] = 0 ; 00136 else 00137 binaryAllele_[i] = 1 ; 00138 } //if 00139 00140 integerAllele_ = decodeToInteger() ; 00141 return mutations ; 00142 } // BinaryIntegerGene::bitFlipMutation 00143 00144 double BinaryIntegerGene::getRealAllele() { 00145 return integerAllele_ ; 00146 } // BinaryIntegerGene::getRealAllele 00147 00148 int BinaryIntegerGene::getNumberOfBits() { 00149 return numberOfBits_ ; 00150 } // BinaryGene::getNumberOfBits 00151 00152 void BinaryIntegerGene::writeGenotype(ofstream& outputFile) { 00153 outputFile << integerAllele_ ; 00154 } // BinaryIntegerGene::writeGenotype 00155 00156 void BinaryIntegerGene::printGenotype() { 00157 cout << integerAllele_ ; 00158 } // BinaryIntegerGene::printGenotype 00159 00160 bool BinaryIntegerGene::operator==(const BinaryIntegerGene& gene) { 00161 for (int i = 0; i < numberOfBits_; i++) 00162 if (binaryAllele_[i] != gene.binaryAllele_[i]) 00163 return false ; 00164 00165 return true ; 00166 } // BinaryIntegerGene::operator== 00167 00168 bool BinaryIntegerGene::operator!=(const BinaryIntegerGene& gene) { 00169 for (int i = 0; i < numberOfBits_; i++) 00170 if (binaryAllele_[i] != gene.binaryAllele_[i]) 00171 return false ; 00172 00173 return true ; 00174 } // BinaryIntegerGene::operator== 00175 00176 ostream& operator<< (ostream& outputStream, BinaryIntegerGene& gene) { 00177 int i ; 00178 00179 outputStream << (Gene&)gene << " Integer allele: " << gene.integerAllele_ ; 00180 00181 outputStream << " Bits: " << gene.numberOfBits_ << " Binary allele: " ; 00182 for (i = 0 ; i < gene.numberOfBits_; i++) 00183 if (gene.binaryAllele_[i] == 1) 00184 outputStream << "1" ; 00185 else 00186 outputStream << "0" ; 00187 outputStream << endl ; 00188 00189 return outputStream ; 00190 } // operator<< 00191 00196 void BinaryIntegerGene::setRealAllele(double value) { 00197 integerAllele_ = (int)value ; 00198 this->codeToBinary() ; 00199 } // BinaryIntegerGene::setRealAllele 00200 00205 void BinaryIntegerGene::codeToBinary() { 00206 int integerValue ; 00207 00208 00209 integerValue = (int)((pow(2.0, numberOfBits_) - 1)* 00210 (integerAllele_ - lowerBound_)/(upperBound_ - lowerBound_)) ; 00211 00212 for (int i = 0; i < numberOfBits_; i++) { 00213 long tmp = 2; //(long)pow((double)2.0, i) ; 00214 int remainder ; 00215 int quotient ; 00216 00217 quotient = integerValue/tmp ; 00218 remainder = integerValue%tmp ; 00219 // cout << i << ": " << tmp << "\t Q: " << quotient << "\t R: " << remainder << endl ; 00220 if (remainder == 0) 00221 binaryAllele_[i] = 0 ; 00222 else 00223 binaryAllele_[i] = 1 ; 00224 00225 integerValue = quotient ; 00226 } // for 00227 00228 } // BinaryIntegerGene::decodeToReal 00229 00233 int BinaryIntegerGene::decodeToInteger() { 00234 double intValue ; 00235 double result ; 00236 00237 intValue = 0 ; 00238 for (int i = 0; i < numberOfBits_ ;i++) { 00239 if (binaryAllele_[i] == 1) 00240 intValue += pow((double)2.0, i) ; 00241 } // for 00242 00243 00244 result = (lowerBound_ + intValue*(upperBound_ - lowerBound_) / 00245 (pow(2.0, numberOfBits_) - 1)) ; 00246 return (int)result ; 00247 } // BinaryIntegerGene::decodeGene