00001
00010 #include <Viennet4.h>
00011
00017 Viennet4::Viennet4(VariableType variableType) {
00018
00019 problemName_ = "Viennet4-MOP-C3" ;
00020
00021 numberOfVariables_ = 2 ;
00022 numberOfFunctions_ = 3 ;
00023 numberOfConstraints_ = 3 ;
00024
00025 const double upperLimit[] = {4.0, 4.0} ;
00026 const double lowerLimit[] = {-4.0, -4.0} ;
00027 const int partitions[] = {200, 200} ;
00028 const int precision[] = {5, 5} ;
00029
00030 upperLimit_ = new double[numberOfVariables_] ;
00031 lowerLimit_ = new double[numberOfVariables_] ;
00032 partitions_ = new int[numberOfVariables_] ;
00033 precision_ = new int[numberOfVariables_] ;
00034 bitsPerVariable_ = new int[numberOfVariables_] ;
00035
00036 memcpy(upperLimit_, upperLimit, numberOfVariables_ * sizeof(double)) ;
00037 memcpy(lowerLimit_, lowerLimit, numberOfVariables_ * sizeof(double)) ;
00038 memcpy(partitions_, partitions_, numberOfVariables_ * sizeof(int)) ;
00039 memcpy(precision_, precision, numberOfVariables_ * sizeof(int)) ;
00040
00041 variable_ = new VariableType[numberOfVariables_] ;
00042
00043 initializeRealVariableType(variableType) ;
00044 cout << "Created a " << problemName_ << " problem" << endl ;
00045
00046 }
00047
00048
00049
00050 void Viennet4::evaluate(Individual * individual) {
00051 double x[2] ;
00052
00053 x[0] = (individual->chromosome_->gene_[0])->getRealAllele() ;
00054 x[1] = (individual->chromosome_->gene_[1])->getRealAllele() ;
00055
00056
00057 individual->fitness_[0] = (x[0]-2)*(x[0]-2)/2.0 +
00058 (x[1]+1)*(x[1]+1)/13.0 + 3.0 ;
00059
00060
00061
00062 individual->fitness_[1] = (x[0]+x[1]-3)*(x[0]+x[1]-3)/175.0 +
00063 (2*x[1]-x[0])*(2*x[1]-x[0])/17.0 - 13.0 ;
00064
00065
00066 individual->fitness_[2] = (3*x[0]-2*x[1]+4)*(3*x[0]-2*x[1]+4)/8.0 +
00067 (x[0]-x[1]+1)*(x[0]-x[1]+1)/27.0 + 15 ;
00068 }
00069
00070
00071 bool Viennet4::constraintsAreSatisfied(Individual * individual) {
00072 double x[2];
00073
00074 x[0] = (individual->chromosome_->gene_[0])->getRealAllele() ;
00075 x[1] = (individual->chromosome_->gene_[1])->getRealAllele() ;
00076
00077 if ((x[1] < (-4*x[0] +4)) &&
00078 (x[0] > -1) &&
00079 (x[1] > (x[0]-2)))
00080 return true ;
00081 else
00082 return false ;
00083 }
00084
00085 int Viennet4::numberOfNonSatisfiedConstraints(Individual * individual) {
00086 int counter ;
00087 double x[2] ;
00088
00089 counter = 0 ;
00090 x[0] = (individual->chromosome_->gene_[0])->getRealAllele() ;
00091 x[1] = (individual->chromosome_->gene_[1])->getRealAllele() ;
00092
00093 if (x[1] < (-4*x[0] +4))
00094 counter ++ ;
00095 if (x[0] > -1)
00096 counter ++ ;
00097 if (x[1] > (x[0]-2))
00098 counter ++ ;
00099
00100 return counter ;
00101 }