00001
00002
00003
00004
00005
00006
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 }
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 }
00055 }
00056 }
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 }
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 }
00094 }
00095
00096 }
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 }
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 }
00134 }
00135 }
00136
00142 Chromosome::~Chromosome() {
00143 int i ;
00144 for (i = 0; i < length_; i++)
00145
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 }
00164
00165 delete [] gene_ ;
00166 }
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 }
00192 }
00193 }
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 }
00214 outputStream << endl ;
00215 }
00216
00217