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

BinaryGene.cpp

Go to the documentation of this file.
00001 
00009 #include <BinaryGene.h>
00010 
00018 BinaryGene::BinaryGene(int numberOfBits, Random * random) : 
00019             Gene(BINARY, random) {
00020   if (numberOfBits > MAX_LENGTH) {
00021     cerr << "BinaryGene::BinaryGene-> the maximum length is " 
00022          << MAX_LENGTH << " bits. The MAX_LENGTH constant can be "
00023          << "redefined in BinaryGene.h" << endl ;
00024     exit(-1) ;
00025   } // if
00026   numberOfBits_ = numberOfBits ;
00027   
00028   for (int i = 0; i < numberOfBits; i++)
00029     if (random_->rnd(0,1) == 1)
00030       allele_[i] = 1;
00031     else
00032       allele_[i] = 0 ;
00033       
00034 #ifdef __MPI__
00035 this->calculateSize() ;
00036 #endif  
00037 } // BinaryGene::BinaryGene
00038 
00045 BinaryGene::BinaryGene(BinaryGene & binaryGene) : Gene(binaryGene) {
00046   numberOfBits_= binaryGene.numberOfBits_ ;
00047   allele_      = binaryGene.allele_       ;
00048 
00049 //  for (i = 0; i < numberOfBits_; i++)
00050 //    allele_[i] = binaryGene.allele_[i] ;  
00051 
00052 #ifdef __MPI__
00053 this->calculateSize() ;
00054 #endif  
00055 } // BinaryGene::BinaryGene
00056 
00063 BinaryGene::BinaryGene(BinaryGene * binaryGene) : Gene(binaryGene) {
00064   numberOfBits_= binaryGene->numberOfBits_ ;
00065   allele_      = binaryGene->allele_       ;
00066 
00067 //  for (i = 0; i < numberOfBits_; i++)
00068 //    allele_[i] = binaryGene->allele_[i] ;  
00069 
00070 #ifdef __MPI__
00071 this->calculateSize() ;
00072 #endif      
00073 } // BinaryGene::BinaryGene
00074 
00080 BinaryGene::~BinaryGene() {
00081   //delete [] allele_ ;
00082 } // BinaryGene::~BinaryGene
00083 
00084 int BinaryGene::getNumberOfBits() {
00085   return numberOfBits_ ;
00086 } // BinaryGene::getNumberOfBits 
00087 
00093 void BinaryGene::singlePointCrossover(int point, Gene * gene) {
00094   bitset<1> swap ;
00095   for (int i = 0; i < numberOfBits_; i++) // REVISAR
00096     if (i > point) {
00097       swap[0] = allele_[i] ;
00098       allele_[i] = ((BinaryGene *)gene)->allele_[i] ;
00099       ((BinaryGene *)gene)->allele_[i] = swap[0] ;
00100     } // if
00101 } // BinaryGene::singlePointCrossover
00102 
00103 int BinaryGene::bitFlipMutation(double mutationProbability) {
00104   int mutations ;
00105   
00106   mutations = 0 ;
00107 
00108   for (int i = 0; i < numberOfBits_ ; i++)
00109     if (random_->flip(mutationProbability) == 1) {
00110       mutations ++ ;
00111       if (allele_[i] == 1)
00112         allele_[i] = 0 ;
00113       else
00114         allele_[i] = 1 ;
00115     } //if
00116     
00117   return mutations ;
00118 } // BinaryGene::bitFlipMutation
00119 
00120 void BinaryGene::writeGenotype(ofstream& outputFile) {
00121   int i ;
00122   for (i = 0 ; i < numberOfBits_; i++)
00123     if (allele_[i] == 1)
00124       outputFile << "1" ;
00125     else
00126       outputFile << "0" ;
00127 } // BinaryGene::writeGenotype
00128 
00129 void BinaryGene::printGenotype() {
00130   for (int i = 0 ; i < numberOfBits_; i++)
00131     if (allele_[i] == 1)
00132       cout << "1" ;
00133     else
00134       cout << "0" ;
00135 } // BinaryGene::writeGenotype
00136 
00137 BinaryGene & BinaryGene::operator=(const BinaryGene& binaryGene) {
00138   numberOfBits_= binaryGene.numberOfBits_ ;
00139   allele_ = binaryGene.allele_ ;
00140 //  for (i = 0; i < numberOfBits_; i++)
00141 //    allele_[i] = binaryGene.allele_[i] ;  
00142   
00143   return *this ;
00144 } // BinaryGene::operator=
00145 
00146 bool BinaryGene::operator==(const BinaryGene& binaryGene) {
00147   for (int i = 0; i < numberOfBits_; i++)
00148     if (allele_[i] != binaryGene.allele_[i])
00149       return  false ;
00150 
00151   return true ;
00152 } // BinaryGene::operator==
00153 
00154 bool BinaryGene::operator!=(const BinaryGene& binaryGene) {
00155   for (int i = 0; i < numberOfBits_; i++)
00156     if (allele_[i] != binaryGene.allele_[i])
00157       return true ;
00158 
00159   return false ;
00160 } // BinaryGene::operator!=
00161 
00162 ostream& operator<< (ostream& outputStream, BinaryGene& gene) {
00163   int i ;
00164   
00165   outputStream << (Gene&)gene << " Bits: " << gene.numberOfBits_ << " allele: " ;
00166   for (i = 0 ; i < gene.numberOfBits_; i++)
00167     if (gene.allele_[i] == 1)
00168       outputStream << "1" ;
00169     else
00170       outputStream << "0" ;
00171 
00172   return outputStream ;
00173 } // operator<< 
00174 
00175 #ifdef __MPI__  
00176 void BinaryGene::calculateSize() {
00177   int size      ;
00178   int totalSize ;
00179     
00180   MPI_Pack_size(numberOfBits_, MPI_CHAR, MPI_COMM_WORLD, &size) ;
00181   totalSize = size ;
00182   MPI_Pack_size(1, MPI_INT, MPI_COMM_WORLD, &size) ;
00183   totalSize += size ;
00184     
00185   dataSize_ =  totalSize ;
00186 }
00187 
00188 int BinaryGene::getSize() {   
00189   return dataSize_ ;
00190 }
00191 
00192 void BinaryGene::packData(char * buffer, int * bufferOffset, int bufferSize) {
00193   MPI_Pack(&numberOfBits_, 1, MPI_INT, buffer, bufferSize, bufferOffset, MPI_COMM_WORLD) ;
00194   MPI_Pack(allele_, numberOfBits_, MPI_CHAR, buffer, bufferSize, bufferOffset, MPI_COMM_WORLD) ;
00195 } 
00196 void BinaryGene::unpackData(char * buffer, int * bufferOffset, int bufferSize) {
00197   MPI_Unpack(buffer, bufferSize, bufferOffset, &numberOfBits_, 1, MPI_INT, MPI_COMM_WORLD) ;
00198   MPI_Unpack(buffer, bufferSize, bufferOffset, allele_, numberOfBits_, MPI_CHAR, MPI_COMM_WORLD) ;
00199 } 
00200 #endif    

Our Software

orangebox Mallba

orangebox ssGA

orangebox JGDS

orangebox xxGA

orangebox JCell

orangebox MHTB

orangebox DEME

orangebox JMetal

orangebox More...

orangebox Go Back