• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

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

Our Software

orangebox Mallba

orangebox ssGA

orangebox JGDS

orangebox xxGA

orangebox JCell

orangebox MHTB

orangebox DEME

orangebox JMetal

orangebox More...

orangebox Go Back