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