00001
00010 #include <Osyczka2.h>
00011
00017 Osyczka2::Osyczka2(VariableType variableType) {
00018 problemName_ = "OSYCZKA2-MOP-C2" ;
00019
00020 numberOfVariables_ = 6 ;
00021 numberOfFunctions_ = 2 ;
00022 numberOfConstraints_ = 6 ;
00023
00024 const double upperLimit[] = {10.0, 10.0, 5.0, 6.0, 5.0, 10.0} ;
00025 const double lowerLimit[] = {0.0, 0.0, 1.0, 0.0, 1.0, 0.0} ;
00026 const int partitions[] = {30, 30, 30, 30, 30, 30} ;
00027 const int precision[] = {5, 5, 5, 5, 5} ;
00028
00029 upperLimit_ = new double[numberOfVariables_] ;
00030 lowerLimit_ = new double[numberOfVariables_] ;
00031 partitions_ = new int[numberOfVariables_] ;
00032 precision_ = new int[numberOfVariables_] ;
00033 bitsPerVariable_ = new int[numberOfVariables_] ;
00034
00035
00036
00037 memcpy(upperLimit_, upperLimit, numberOfVariables_ * sizeof(double)) ;
00038 memcpy(lowerLimit_, lowerLimit, numberOfVariables_ * sizeof(double)) ;
00039 memcpy(partitions_, partitions_, numberOfVariables_ * sizeof(int)) ;
00040 memcpy(precision_, precision, numberOfVariables_ * sizeof(int)) ;
00041
00042
00043 variable_ = new VariableType[numberOfVariables_] ;
00044 int i ;
00045
00046 initializeRealVariableType(variableType) ;
00047 cout << "Created a " << problemName_ << " problem" << endl ;
00048 }
00049
00050 void Osyczka2::evaluate(Individual *individual) {
00051
00052 double result ;
00053 double x[6] ;
00054
00055 x[0] = (individual->chromosome_->gene_[0])->getRealAllele() ;
00056 x[1] = (individual->chromosome_->gene_[1])->getRealAllele() ;
00057 x[2] = (individual->chromosome_->gene_[2])->getRealAllele() ;
00058 x[3] = (individual->chromosome_->gene_[3])->getRealAllele() ;
00059 x[4] = (individual->chromosome_->gene_[4])->getRealAllele() ;
00060 x[5] = (individual->chromosome_->gene_[5])->getRealAllele() ;
00061
00062 result = -(25 * (x[0] - 2) * (x[0] - 2) +
00063 (x[1] - 2) * (x[1] - 2) +
00064 (x[2] - 1) * (x[2] - 1) +
00065 (x[3] - 4) * (x[3] - 4) +
00066 (x[4] - 1) * (x[4] - 1)) ;
00067
00068 individual->fitness_[0] = result ;
00069
00070
00071 result = x[0]*x[0] +
00072 x[1]*x[1] +
00073 x[2]*x[2] +
00074 x[3]*x[3] +
00075 x[4]*x[4] +
00076 x[5]*x[5] ;
00077
00078 individual->fitness_[1] = result ;
00079 }
00080
00081
00082 bool Osyczka2::constraintsAreSatisfied(Individual * individual) {
00083 double x[6] ;
00084
00085 x[0] = (individual->chromosome_->gene_[0])->getRealAllele() ;
00086 x[1] = (individual->chromosome_->gene_[1])->getRealAllele() ;
00087 x[2] = (individual->chromosome_->gene_[2])->getRealAllele() ;
00088 x[3] = (individual->chromosome_->gene_[3])->getRealAllele() ;
00089 x[4] = (individual->chromosome_->gene_[4])->getRealAllele() ;
00090 x[5] = (individual->chromosome_->gene_[5])->getRealAllele() ;
00091
00092 if ((0 <= (x[0]+x[1] - 2)) &&
00093 (0 <= (6 - x[0] - x[1])) &&
00094 (0 <= (2 + x[0] + x[1])) &&
00095 (0 <= (2 - x[0] + 3*x[1])) &&
00096 (0 <= (4 - (x[2]-3)*(x[2]-3)- x[3])) &&
00097 (0 <= ((x[4]-3)*(x[4]-3)+x[5]-4)))
00098 return true ;
00099 else
00100 return false ;
00101 }
00102
00103 int Osyczka2::numberOfNonSatisfiedConstraints(Individual * individual) {
00104 int counter ;
00105 double x[6] ;
00106
00107 x[0] = (individual->chromosome_->gene_[0])->getRealAllele() ;
00108 x[1] = (individual->chromosome_->gene_[1])->getRealAllele() ;
00109 x[2] = (individual->chromosome_->gene_[2])->getRealAllele() ;
00110 x[3] = (individual->chromosome_->gene_[3])->getRealAllele() ;
00111 x[4] = (individual->chromosome_->gene_[4])->getRealAllele() ;
00112 x[5] = (individual->chromosome_->gene_[5])->getRealAllele() ;
00113
00114 counter = 0 ;
00115
00116 if (0 > (x[0]+x[1] - 2))
00117 counter ++ ;
00118 if (0 > (6 - x[0] - x[1]))
00119 counter ++ ;
00120 if (0 > (2 + x[0] + x[1]))
00121 counter ++ ;
00122 if (0 > (2 - x[0] + 3*x[1]))
00123 counter ++ ;
00124 if (0 > (4 - (x[2]-3)*(x[2]-3)- x[3]))
00125 counter ++ ;
00126 if (0 > ((x[4]-3)*(x[4]-3)+x[5]-4))
00127 counter ++ ;
00128
00129 return counter ;
00130 }