RealGene.cpp
Go to the documentation of this file.00001 00010 #include <RealGene.h> 00011 00018 RealGene::RealGene(Random * random) : Gene(REAL, random) { 00019 lowerBound_ = MIN_REAL ; 00020 upperBound_ = MAX_REAL ; 00021 allele_ = random_->rndreal(lowerBound_, upperBound_) ; 00022 00023 #ifdef __MPI__ 00024 this->calculateSize() ; 00025 #endif 00026 } // RealGene::RealGene 00027 00036 RealGene::RealGene(double lowerBound, double upperBound, Random * random) : 00037 Gene(REAL, random) { 00038 lowerBound_ = lowerBound ; 00039 upperBound_ = upperBound ; 00040 00041 allele_ = random_->rndreal(lowerBound, upperBound) ; 00042 00043 #ifdef __MPI__ 00044 this->calculateSize() ; 00045 #endif 00046 } // RealGene::RealGene 00047 00054 RealGene::RealGene(RealGene & realGene) : Gene(realGene) { 00055 allele_ = realGene.allele_ ; 00056 lowerBound_ = realGene.lowerBound_ ; 00057 upperBound_ = realGene.upperBound_ ; 00058 00059 #ifdef __MPI__ 00060 this->calculateSize() ; 00061 #endif 00062 } // RealGene::RealGene 00063 00070 RealGene::RealGene(RealGene * realGene) : Gene(realGene) { 00071 allele_ = realGene->allele_ ; 00072 lowerBound_ = realGene->lowerBound_ ; 00073 upperBound_ = realGene->upperBound_ ; 00074 00075 #ifdef __MPI__ 00076 this->calculateSize() ; 00077 #endif 00078 } // RealGene::RealGene 00079 00085 RealGene::~RealGene() { 00086 } // RealGene::~RealGene 00087 00088 int RealGene::randomMutation(double mutationProbability) { 00089 int mutations ; 00090 double rnd ; 00091 00092 mutations = 0 ; 00093 00094 rnd = random_->rndreal(0.0, 1.0) ; 00095 if (rnd <= mutationProbability) { 00096 rnd = random_->rndreal(0.0, 1.0) ; 00097 allele_ = lowerBound_ + rnd *(upperBound_ - lowerBound_) ; 00098 00099 mutations ++ ; 00100 } // if 00101 00102 return mutations ; 00103 } // RealGene::uniformMutation 00104 00105 int RealGene::polynomialMutation(double mutationProbability, 00106 double distributionIndex) { 00107 00108 double temp ; 00109 int mutations ; 00110 double rnd ; 00111 00112 double delta ; 00113 double deltaq ; 00114 double mu ; 00115 00116 mutations = 0 ; 00117 00118 rnd = random_->rndreal(0.0, 1.0) ; 00119 if (rnd <= mutationProbability) { 00120 if (allele_ > lowerBound_) { // calculate delta 00121 if ((allele_ - lowerBound_) < (upperBound_ - allele_)) 00122 delta = (allele_ - lowerBound_) / (upperBound_ - lowerBound_) ; 00123 else 00124 delta = (upperBound_ - allele_) / (upperBound_ - lowerBound_) ; 00125 rnd = random_->rndreal(0.0, 1.0) ; 00126 mu = 1.0/(distributionIndex + 1.0); 00127 if(rnd <= 0.5) { 00128 double xy = 1.0-delta; 00129 temp = 2*rnd+(1-2*rnd)*(pow(xy,(distributionIndex + 1))); 00130 deltaq = pow(temp, mu) - 1.0; 00131 } // if 00132 else { 00133 double xy = 1.0-delta; 00134 temp = 2.0*(1.0-rnd)+2.0*(rnd-0.5)*(pow(xy,(distributionIndex + 1))); 00135 deltaq = 1.0 - (pow(temp,mu)); 00136 } // else 00137 00138 // Change the value of the allele 00139 allele_ += deltaq * (upperBound_ - lowerBound_); 00140 if (allele_ < lowerBound_) 00141 allele_ = lowerBound_ ; 00142 if (allele_ > upperBound_) 00143 allele_ = upperBound_ ; 00144 } // if 00145 else { 00146 rnd = random_->rndreal(0.0, 1.0) ; 00147 allele_ = rnd * (upperBound_ - lowerBound_) + lowerBound_ ; 00148 } // else 00149 mutations = 1 ; 00150 } // if 00151 00152 return mutations ; 00153 00154 /* 00155 double temp ; 00156 int mutations ; 00157 double rnd ; 00158 00159 double delta ; 00160 double deltaMax ; 00161 double mu ; 00162 double diff ; 00163 00164 mutations = 0 ; 00165 00166 rnd = random_->rndreal(0.0, 1.0) ; 00167 if (rnd <= mutationProbability) { 00168 diff = upperBound_ - lowerBound_ ; 00169 deltaMax = (allele_ - lowerBound_) / diff ; 00170 if ((allele_ - lowerBound_) > (upperBound_ - allele_)) 00171 deltaMax = (upperBound_ - allele_) / diff ; 00172 00173 rnd = random_->rndreal(0.0, 1.0) ; 00174 if (rnd <= 0.5) { 00175 temp = 2*rnd+(1-2*rnd)*(pow(1 - deltaMax,(distributionIndex + 1))); 00176 delta = pow(temp, (1.0/(distributionIndex + 1))) - 1.0; 00177 } // if 00178 else { 00179 temp = 2.0*(1.0-rnd)+2.0*(rnd-0.5)*(pow(1-deltaMax,(distributionIndex + 1))); 00180 delta = 1.0 - (pow(temp,1.0/(distributionIndex + 1))); 00181 } // else 00182 00183 if (delta > deltaMax) 00184 delta = deltaMax ; 00185 else if (delta < -deltaMax) 00186 delta = -deltaMax ; 00187 00188 // Change the value of the allele 00189 allele_ = allele_ + delta * diff ; 00190 if (allele_ < lowerBound_) 00191 allele_ = lowerBound_ ; 00192 if (allele_ > upperBound_) 00193 allele_ = upperBound_ ; 00194 00195 mutations = 1 ; 00196 } // if 00197 00198 return mutations ; 00199 */ 00200 } // RealGene::PolynomialMutationn 00201 00202 int RealGene::uniformMutation(double mutationProbability, double perturbation) { 00203 int mutations ; 00204 double rnd ; 00205 00206 mutations = 0 ; 00207 rnd = random_->rndreal(0.0, 1.0) ; 00208 if (rnd <= mutationProbability) { 00209 //cout << "allele_ " << allele_ ; 00210 rnd = random_->rndreal(0.0, 1.0) ; 00211 double tmp = (rnd + 0.5)*perturbation ; 00212 //cout << "\tVar: " << tmp ; 00213 // allele_ = allele_ + (rnd - 0.5)*perturbation ; 00214 allele_ = allele_ + tmp ; 00215 if (allele_ < lowerBound_) 00216 allele_ = lowerBound_ ; 00217 if (allele_ > upperBound_) 00218 allele_ = upperBound_ ; 00219 //cout << "\tMallele_ " << allele_ << endl ; 00220 00221 mutations ++ ; 00222 } // if 00223 00224 return mutations ; 00225 } // RealGene::uniformMutation 00226 00227 int RealGene::nonUniformMutation(double mutationProbability, 00228 double perturbation, 00229 int iteration, 00230 int maximumNumberOfIterations) { 00231 int mutations ; 00232 double rnd ; 00233 double tmp ; 00234 00235 mutations = 0 ; 00236 00237 rnd = random_->rndreal(0.0, 1.0) ; 00238 if (rnd <= mutationProbability) { 00239 //cout << "allele_ " << allele_ ; 00240 rnd = random_->rndreal(0.0, 1.0) ; 00241 if (rnd <= 0.5) { 00242 tmp = delta(iteration, 00243 upperBound_ - allele_, 00244 perturbation, 00245 maximumNumberOfIterations) ; 00246 allele_ = allele_ + tmp ; 00247 } // if 00248 else { 00249 tmp = delta(iteration, 00250 allele_ - lowerBound_, 00251 perturbation, 00252 maximumNumberOfIterations) ; 00253 allele_ = allele_ - tmp ; 00254 } // else 00255 00256 if (allele_ < lowerBound_) 00257 allele_ = lowerBound_ ; 00258 if (allele_ > upperBound_) 00259 allele_ = upperBound_ ; 00260 //cout << ". After: " << allele_ << ". Delta: " 00261 // << tmp 00262 // << ". Iter: " << iteration << ". Tot: " 00263 // << maximumNumberOfIterations << endl ; 00264 mutations ++ ; 00265 } // if 00266 00267 return mutations ; 00268 } // RealGene::nonUniformMutation 00269 00278 double RealGene::delta(double t, 00279 double y, 00280 double bMutationParameter, 00281 int maximumNumberOfIterations) { 00282 double random; 00283 if (maximumNumberOfIterations < t) { 00284 cerr << "MoEA::delta->maximum number of iterations is less than iterations" << endl ; 00285 exit(-1) ; 00286 } // if 00287 00288 random = random_->rndreal(0.0, 1.0) ; 00289 return (y * (1.0 - 00290 pow(random, 00291 pow((1.0 - t / (double) maximumNumberOfIterations), 00292 bMutationParameter 00293 ) 00294 ) 00295 ) 00296 ); 00297 } // RealGene::delta 00298 00304 double RealGene::map(double value) { 00305 return ( (value - lowerBound_) / (upperBound_ - lowerBound_)); 00306 } // RealGene::map 00307 00308 /********************************************************************/ 00309 00315 double RealGene::unmap(double value) { 00316 return (lowerBound_ + (upperBound_ - lowerBound_) * value); 00317 } // RealGene::unmap 00318 00319 00320 00321 00329 double RealGene::logicalMFunction(double geneParent1, 00330 double geneParent2, 00331 double lambda) { 00332 00333 double mappedAllele1 = map(geneParent1); 00334 double mappedAllele2 = map(geneParent2); 00335 double result; 00336 00337 result = (1.0 - lambda)* mappedAllele1 + lambda * mappedAllele2; 00338 00339 return unmap(result); 00340 }; // logicalMFunction 00341 00342 /*********************************************************************/ 00343 00351 double RealGene::hamacherMFunction (double geneParent1, 00352 double geneParent2, 00353 double lambda) { 00354 00355 double mappedAllele1 = map(geneParent1); 00356 double mappedAllele2 = map(geneParent2); 00357 double result; 00358 double tmp ; 00359 00360 tmp = (mappedAllele2 - mappedAllele2*lambda + mappedAllele1*lambda) ; 00361 00362 if (tmp != 0) 00363 result = (mappedAllele1 * mappedAllele2) / tmp ; 00364 else 00365 if (random_->rndreal(0.0, 1.0) <= 0.5) 00366 return geneParent1; 00367 else 00368 return geneParent2; 00369 00370 return unmap(result); 00371 }; //hamacherMFunction 00372 00373 /*********************************************************************/ 00374 00382 double RealGene::algebraicMFunction(double geneParent1, 00383 double geneParent2, 00384 double lambda) { 00385 double mappedAllele1 = map(geneParent1); 00386 double mappedAllele2 = map(geneParent2); 00387 double result; 00388 00389 result = pow(mappedAllele1,(1.0 - lambda)) * pow(mappedAllele2,lambda); 00390 00391 return unmap(result); 00392 00393 }; //algebraicMFunction 00394 00395 /*********************************************************************/ 00396 00404 double RealGene::einsteinMFunction (double geneParent1, 00405 double geneParent2, 00406 double lambda) { 00407 double mappedAllele1 = map(geneParent1); 00408 double mappedAllele2 = map(geneParent2); 00409 double result; 00410 double tmp ; 00411 00412 tmp = (1.0 + 00413 ( 00414 pow( ((2.0 - mappedAllele1) / mappedAllele1),(1.0 - lambda)) 00415 * 00416 pow( ((2.0 - mappedAllele2) / mappedAllele2), lambda) 00417 ) 00418 ); 00419 00420 if (tmp != 0) 00421 result = 2.0 / tmp ; 00422 else 00423 if (random_->rndreal(0.0, 1.0) <= 0.5) 00424 return geneParent1; 00425 else 00426 return geneParent2; 00427 00428 return unmap(result); 00429 00430 }; //einsteinMFunction 00431 00432 /*********************************************************************/ 00433 00440 double RealGene::logicalFFunction (double geneParent1,double geneParent2) { 00441 if (geneParent1 <= geneParent2) 00442 return geneParent1; 00443 else 00444 return geneParent2; 00445 }; //logicalFFunction 00446 00447 /*********************************************************************/ 00448 00455 double RealGene::logicalSFunction (double geneParent1,double geneParent2) { 00456 if (geneParent1 >= geneParent2) 00457 return geneParent1; 00458 else 00459 return geneParent2; 00460 }; //logicalSFunction 00461 00462 /*********************************************************************/ 00463 00470 double RealGene::hamacherFFunction (double geneParent1,double geneParent2) { 00471 double mappedAllele1 = map(geneParent1); 00472 double mappedAllele2 = map(geneParent2); 00473 double result; 00474 double tmp ; 00475 00476 tmp = (mappedAllele1 + mappedAllele2 - (mappedAllele1 * mappedAllele2)) ; 00477 00478 if (tmp != 0) 00479 result = (mappedAllele1 * mappedAllele2) / tmp ; 00480 else 00481 if (random_->rndreal(0.0, 1.0) <= 0.5) 00482 return geneParent1; 00483 else 00484 return geneParent2; 00485 00486 return unmap(result); 00487 }; //hamacherFFunction 00488 00489 /*********************************************************************/ 00490 00497 double RealGene::hamacherSFunction (double geneParent1,double geneParent2) { 00498 double mappedAllele1 = map(geneParent1); 00499 double mappedAllele2 = map(geneParent2); 00500 double result; 00501 double tmp ; 00502 00503 tmp = 1.0 - (mappedAllele1 * mappedAllele2) ; 00504 if (tmp != 0) 00505 result = (mappedAllele1 + mappedAllele2 - (2.0 * mappedAllele1 * mappedAllele2)) 00506 / tmp ; 00507 else 00508 if (random_->rndreal(0.0, 1.0) <= 0.5) 00509 return geneParent1; 00510 else 00511 return geneParent2; 00512 00513 return unmap(result); 00514 }; //hamacherSFunction 00515 00516 /*********************************************************************/ 00517 00524 double RealGene::algebraicFFunction(double geneParent1,double geneParent2) { 00525 double mappedAllele1 = map(geneParent1); 00526 double mappedAllele2 = map(geneParent2); 00527 double result; 00528 00529 result = (mappedAllele1 * mappedAllele2); 00530 00531 return unmap(result); 00532 00533 }; //algebraicFFunction 00534 00535 /*********************************************************************/ 00536 00543 double RealGene::algebraicSFunction(double geneParent1,double geneParent2) { 00544 double mappedAllele1 = map(geneParent1); 00545 double mappedAllele2 = map(geneParent2); 00546 double result; 00547 00548 result = (mappedAllele1 + mappedAllele2 - (mappedAllele1 * mappedAllele2)) ; 00549 00550 return unmap(result); 00551 }; //algebraicSFunction 00552 00553 /*********************************************************************/ 00554 00561 double RealGene::einsteinFFunction (double geneParent1,double geneParent2) { 00562 double mappedAllele1 = map(geneParent1); 00563 double mappedAllele2 = map(geneParent2); 00564 double result; 00565 00566 double tmp ; 00567 00568 tmp = ( 00569 1.0 00570 + 00571 ( (1.0 - mappedAllele1) * (1.0 - mappedAllele2)) 00572 ); 00573 00574 if (tmp != 0.0) 00575 result = (mappedAllele1 * mappedAllele2) / tmp; 00576 00577 else 00578 if (random_->rndreal(0.0, 1.0) <= 0.5) 00579 return geneParent1; 00580 else 00581 return geneParent2; 00582 00583 return unmap(result); 00584 00585 }; //einsteinFFunction 00586 00587 /*********************************************************************/ 00588 00595 double RealGene::einsteinSFunction (double geneParent1,double geneParent2) { 00596 double mappedAllele1 = map(geneParent1); 00597 double mappedAllele2 = map(geneParent2); 00598 double result; 00599 double tmp ; 00600 00601 tmp = (1.0 + ( mappedAllele1 * mappedAllele2)) ; 00602 00603 if (tmp != 0) 00604 result = (mappedAllele1 + mappedAllele2) / tmp ; 00605 else 00606 if (random_->rndreal(0.0, 1.0) <= 0.5) 00607 return geneParent1; 00608 else 00609 return geneParent2; 00610 00611 return unmap(result); 00612 00613 }; //einsteinSFunction 00614 00615 00616 00617 double RealGene::getRealAllele() { 00618 return allele_ ; 00619 } // RealGene::getRealAllele 00620 00621 void RealGene::setRealAllele(double value) { 00622 if (value < lowerBound_) 00623 allele_ = lowerBound_ ; 00624 else if (value > upperBound_) 00625 allele_ = upperBound_ ; 00626 else 00627 allele_ = value ; 00628 } // RealGene::getRealAllele 00629 00630 void RealGene::writeGenotype(ofstream& outputFile) { 00631 outputFile << allele_ ; 00632 } // RealGene::writeGenotype 00633 00634 void RealGene::printGenotype() { 00635 cout << allele_ ; 00636 } // RealGene::printGenotype 00637 00638 RealGene & RealGene::operator=(const RealGene& realGene) { 00639 allele_ = realGene.allele_ ; 00640 00641 return *this ; 00642 } // RealGene::operator= 00643 00644 bool RealGene::operator==(const RealGene& realGene) { 00645 // if (allele_ == realGene.allele_) 00646 if (fabs(allele_ - realGene.allele_) < 1e-14) 00647 return true ; 00648 else 00649 return false ; 00650 } // RealGene::operator== 00651 00652 bool RealGene::operator!=(const RealGene& realGene) { 00653 if (fabs(allele_ - realGene.allele_) < 1e-14) 00654 return false ; 00655 else 00656 return true ; 00657 } // RealGene::operator== 00658 00659 ostream& operator<< (ostream& outputStream, RealGene& gene) { 00660 outputStream << (Gene&)gene << " allele: " << gene.allele_ << " "; 00661 00662 return outputStream ; 00663 } // operator<< 00664 00665