Main Page | Namespace List | Class Hierarchy | Compound List | File List | Compound Members | File Members

Chromosome.cpp

Go to the documentation of this file.
00001 /*
00002  * @file    Chromosome.cpp
00003  * @author  Antonio Jesus Nebro Urbaneja
00004  * @version 1.0
00005  * @date    29 January 2004
00006  * @brief   Class representing a chromosome
00007  */
00008 
00009 #include <Chromosome.h>
00010 
00017 Chromosome::Chromosome(MultiobjectiveProblem * problem,Random * random) {
00018   problem_ = problem ;
00019   length_  = problem->numberOfVariables_ ;
00020   gene_     = new Gene*[length_] ;
00021   
00022   if (gene_ == NULL) {
00023     cerr << "Chromosome::Chromosome->Error when asking for memory" << endl ;
00024     exit(-1) ;
00025   } // if
00026   
00027   int i ;
00028   for (i = 0; i < length_ ; i++) {
00029     switch (problem_->variable_[i]) {
00030     case BINARY:
00031       gene_[i] = new BinaryGene(problem->numberOfBits_, random) ;
00032       break ;
00033     case REAL:
00034       gene_[i] = new RealGene(problem_->lowerLimit_[i], 
00035                               problem_->upperLimit_[i],
00036                               random) ;
00037       break ;
00038     case BINARY_REAL:
00039       gene_[i] = new BinaryRealGene(problem->bitsPerVariable_[i],
00040                                     problem_->lowerLimit_[i], 
00041                                     problem_->upperLimit_[i],
00042                                     random) ;
00043       break ;
00044     case BINARY_GRAY_REAL:
00045       gene_[i] = new BinaryGrayRealGene(problem->bitsPerVariable_[i], 
00046                                         problem_->lowerLimit_[i], 
00047                                         problem_->upperLimit_[i],
00048                                         random) ;
00049       break ;
00050     default: 
00051       cerr << "Chromosome::Chromosome->variable type " 
00052            << problem_->variable_[i] << " unknown" << endl ;
00053       exit(-1) ;
00054     } // switch
00055   } // for
00056 } // Chromosome::Chromosome
00057 
00064 Chromosome::Chromosome(Chromosome & chromosome) {
00065   problem_ = chromosome.problem_ ;
00066   length_  = chromosome.length_  ;
00067   gene_    = new Gene*[length_]  ;
00068 
00069   if (gene_ == NULL) {
00070     cerr << "Chromosome::Chromosome->Error when asking for memory" << endl ;
00071     exit(-1) ;
00072   } // if
00073 
00074   int i ;
00075   for (i = 0; i < length_ ; i++) {
00076     switch (problem_->variable_[i]) {
00077     case BINARY:
00078       gene_[i] = new BinaryGene((BinaryGene*)chromosome.gene_[i]) ;
00079       break ;
00080     case REAL:
00081       gene_[i] = new RealGene((RealGene*)chromosome.gene_[i]) ;
00082       break ;
00083     case BINARY_REAL:
00084       gene_[i] = new BinaryRealGene((BinaryRealGene*)chromosome.gene_[i]) ;
00085       break ;
00086     case BINARY_GRAY_REAL:
00087       gene_[i] =new BinaryGrayRealGene((BinaryGrayRealGene*)chromosome.gene_[i]);
00088       break ;
00089     default: 
00090       cerr << "Chromosome::Chromosome->variable type " 
00091            << problem_->variable_[i] << " unknown" << endl ;
00092       exit(-1) ;
00093     } // switch
00094   } // for
00095 
00096 } // Chromosome::Chromosome
00097 
00104 Chromosome::Chromosome(Chromosome * chromosome) {
00105   problem_ = chromosome->problem_ ;
00106   length_  = chromosome->length_  ;
00107   gene_    = new Gene*[length_]   ;
00108 
00109   if (gene_ == NULL) {
00110     cerr << "Chromosome::Chromosome->Error when asking for memory" << endl ;
00111     exit(-1) ;
00112   } // if
00113 
00114   int i ;
00115   for (i = 0; i < length_ ; i++) {
00116     switch (problem_->variable_[i]) {
00117     case BINARY:
00118       gene_[i] = new BinaryGene((BinaryGene*)chromosome->gene_[i]) ;
00119       break ;
00120     case REAL:
00121       gene_[i] = new RealGene((RealGene*)chromosome->gene_[i]) ;
00122       break ;
00123     case BINARY_REAL:
00124       gene_[i] = new BinaryRealGene((BinaryRealGene*)chromosome->gene_[i]) ;
00125       break ;
00126     case BINARY_GRAY_REAL:
00127       gene_[i]=new BinaryGrayRealGene((BinaryGrayRealGene*)chromosome->gene_[i]);
00128       break ;
00129     default: 
00130       cerr << "Chromosome::Chromosome->variable type " 
00131            << problem_->variable_[i] << " unknown" << endl ;
00132       exit(-1) ;
00133     } // switch
00134   } // for
00135 } // Chromosome::Chromosome
00136 
00142 Chromosome::~Chromosome() {
00143   int i ;
00144   for (i = 0; i < length_; i++)
00145 //    delete gene_[i] ;  
00146     switch (problem_->variable_[i]) {
00147     case BINARY:
00148       delete (BinaryGene *)gene_[i] ;
00149       break ;
00150     case REAL:
00151       delete (RealGene *)gene_[i] ;
00152       break ;
00153     case BINARY_REAL:
00154       delete (BinaryRealGene *)gene_[i] ;
00155       break ;
00156     case BINARY_GRAY_REAL:
00157       delete (BinaryGrayRealGene *)gene_[i] ;
00158       break ;
00159     default: 
00160       cerr << "Chromosome::~Chromosome->variable type " 
00161            << problem_->variable_[i] << " unknown" << endl ;
00162       exit(-1) ;
00163     } // switch
00164     
00165   delete [] gene_ ;  
00166 } // Chromosome::~Chromosome
00167 
00168 
00169 Chromosome & Chromosome::operator=(Chromosome & chromosome) {
00170   problem_ = chromosome.problem_ ;
00171   length_  = chromosome.length_  ;
00172   int i ;
00173   for (i = 0; i < length_ ; i++) {
00174     switch (problem_->variable_[i]) {
00175     case BINARY:
00176       *((BinaryGene *)gene_[i]) = *((BinaryGene*)chromosome.gene_[i]) ;
00177       break ;
00178     case REAL:
00179       *((RealGene *)gene_[i]) = *((RealGene*)chromosome.gene_[i]) ;
00180       break ;
00181     case BINARY_REAL:
00182       *((BinaryRealGene *)gene_[i]) = *((BinaryRealGene*)chromosome.gene_[i]);
00183       break ;
00184     case BINARY_GRAY_REAL:
00185       *((BinaryGrayRealGene *)gene_[i])=*((BinaryGrayRealGene*)chromosome.gene_[i]);
00186       break ;
00187     default: 
00188       cerr << "Chromosome->operator= -> variable type " 
00189            << problem_->variable_[i] << " unknown" << endl ;
00190       exit(-1) ;
00191     } // switch
00192   } // for  
00193 } // Chromosome::operator=
00194 
00195 
00196 ostream& operator<< (ostream& outputStream, Chromosome& chromosome) {
00197   int i ;
00198   
00199   outputStream << "Length: " << chromosome.length_ << endl ;
00200   for (i = 0; i < chromosome.length_; i++)
00201     if (chromosome.gene_[i]->geneType_ == BINARY)
00202       outputStream << *(BinaryGene*)(chromosome.gene_[i]) ;
00203     else if (chromosome.gene_[i]->geneType_ == REAL)
00204       outputStream << *(RealGene*)(chromosome.gene_[i]) ;
00205     else if (chromosome.gene_[i]->geneType_ == BINARY_REAL)
00206       outputStream << *(BinaryRealGene*)(chromosome.gene_[i]) ;
00207     else if (chromosome.gene_[i]->geneType_ == BINARY_GRAY_REAL)
00208       outputStream << *(BinaryGrayRealGene*)(chromosome.gene_[i]) ;
00209     else { 
00210       cerr << "Chromosome: operator<< -> variable type "
00211            << chromosome.gene_[i]->geneType_ << " unknown" << endl ;
00212       exit(-1) ;
00213     } // else
00214   outputStream << endl ;
00215 } // operator<< 
00216 
00217 

Generated on Wed Feb 11 10:38:00 2004 for Paes by doxygen 1.3.3