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

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 

Our Software

orangebox Mallba

orangebox ssGA

orangebox JGDS

orangebox xxGA

orangebox JCell

orangebox MHTB

orangebox DEME

orangebox JMetal

orangebox More...

orangebox Go Back