00001 /* 00002 * @file BinaryGene.h 00003 * @author Antonio Jesus Nebro Urbaneja 00004 * @version 1.0 00005 * @date 29 January 2004 00006 * @brief Class representing a binary gene 00007 */ 00008 00009 #include <BinaryGene.h> 00010 00017 BinaryGene::BinaryGene(int numberOfBits, Random * random) : 00018 Gene(BINARY, random) { 00019 int i ; 00020 00021 numberOfBits_ = numberOfBits ; 00022 allele_ = new char[numberOfBits] ; 00023 00024 if (allele_ == NULL) { 00025 cerr << "BinaryGene::BinaryGene-> Error when asking for memory" << endl ; 00026 exit(-1) ; 00027 } // if 00028 00029 for (i = 0; i < numberOfBits; i++) 00030 if (random_->rnd(0,1) == 1) 00031 allele_[i] = '1' ; 00032 else 00033 allele_[i] = '0' ; 00034 00035 } // BinaryGene::BinaryGene 00036 00043 BinaryGene::BinaryGene(BinaryGene & binaryGene) : Gene(binaryGene) { 00044 int i ; 00045 00046 numberOfBits_= binaryGene.numberOfBits_ ; 00047 allele_ = new char[numberOfBits_] ; 00048 00049 if (allele_ == NULL) { 00050 cerr << "BinaryGene::BinaryGene-> Error when asking for memory" << endl ; 00051 exit(-1) ; 00052 } // if 00053 00054 for (i = 0; i < numberOfBits_; i++) 00055 allele_[i] = binaryGene.allele_[i] ; 00056 00057 } // BinaryGene::BinaryGene 00058 00065 BinaryGene::BinaryGene(BinaryGene * binaryGene) : Gene(binaryGene) { 00066 int i ; 00067 00068 numberOfBits_= binaryGene->numberOfBits_ ; 00069 allele_ = new char[numberOfBits_] ; 00070 00071 if (allele_ == NULL) { 00072 cerr << "BinaryGene::BinaryGene-> Error when asking for memory" << endl ; 00073 exit(-1) ; 00074 } // if 00075 00076 for (i = 0; i < numberOfBits_; i++) 00077 allele_[i] = binaryGene->allele_[i] ; 00078 } // BinaryGene::BinaryGene 00079 00085 BinaryGene::~BinaryGene() { 00086 delete [] allele_ ; 00087 } // BinaryGene::~BinaryGene 00088 00089 00090 int BinaryGene::bitFlipMutation(double mutationProbability) { 00091 int mutations ; 00092 int i ; 00093 00094 mutations = 0 ; 00095 00096 for (int i = 0; i < numberOfBits_ ; i++) 00097 if (random_->flip(mutationProbability) == 1) { 00098 mutations ++ ; 00099 if (allele_[i] == '1') 00100 allele_[i] = '0' ; 00101 else 00102 allele_[i] = '1' ; 00103 } //if 00104 00105 return mutations ; 00106 } // BinaryGene::bitFlipMutation 00107 00108 void BinaryGene::writeGenotype(ofstream& outputFile) { 00109 int i ; 00110 // cout << "number of bits: " << numberOfBits_ << endl ; 00111 for (i = 0 ; i < numberOfBits_; i++) 00112 if (allele_[i] == '1') 00113 outputFile << "1" ; 00114 else 00115 outputFile << "0" ; 00116 } // BinaryGene::writeGenotype 00117 00118 BinaryGene & BinaryGene::operator=(const BinaryGene& binaryGene) { 00119 int i ; 00120 numberOfBits_= binaryGene.numberOfBits_ ; 00121 for (i = 0; i < numberOfBits_; i++) 00122 allele_[i] = binaryGene.allele_[i] ; 00123 00124 return *this ; 00125 } // BinaryGene::operator= 00126 00127 00128 ostream& operator<< (ostream& outputStream, BinaryGene& gene) { 00129 int i ; 00130 00131 outputStream << (Gene&)gene << " Bits: " << gene.numberOfBits_ << " allele: " ; 00132 for (i = 0 ; i < gene.numberOfBits_; i++) 00133 if (gene.allele_[i] == '1') 00134 outputStream << "1" ; 00135 else 00136 outputStream << "0" ; 00137 } // operator<< 00138