From 3fe6efa07e7f726009f351085b60bdc7eaa4ad65 Mon Sep 17 00:00:00 2001 From: Jonathan CROUZET <jonathan.crouzet@ensiie.fr> Date: Mon, 10 Oct 2016 19:53:56 +0200 Subject: [PATCH] Reworked and implemented fitness --- src/ibea/fitness.cpp | 7 ----- src/ibea/fitness.h | 6 ----- src/ibea/ibea.cpp | 4 +-- src/ibea/population.cpp | 60 ++++++++++++++++++++++++++++++++++++++--- src/ibea/population.h | 10 ++++++- 5 files changed, 68 insertions(+), 19 deletions(-) delete mode 100644 src/ibea/fitness.cpp delete mode 100644 src/ibea/fitness.h diff --git a/src/ibea/fitness.cpp b/src/ibea/fitness.cpp deleted file mode 100644 index f7676c8..0000000 --- a/src/ibea/fitness.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "population.h" -#include "indicator.h" -#include "fitness.h" - -void fitness(Population pop){ - -} diff --git a/src/ibea/fitness.h b/src/ibea/fitness.h deleted file mode 100644 index 4ae4159..0000000 --- a/src/ibea/fitness.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef FITNESS_H -#define FITNESS_H - -void fitness(Population pop); - -#endif diff --git a/src/ibea/ibea.cpp b/src/ibea/ibea.cpp index 1512e8a..0eada11 100644 --- a/src/ibea/ibea.cpp +++ b/src/ibea/ibea.cpp @@ -22,8 +22,8 @@ void ibea(void* evaluate, int mu = 10; /* number of tournament */ int eta = 100; /* polynomiale mutation degree */ - Population pop = Population(n_individus, dimension); - Population new_pop = Population(n_individus, dimension); + Population pop = Population(n_individus, dimension, number_of_objectives); + Population new_pop = Population(n_individus, dimension, number_of_objectives); random_init(&pop, random_generator); diff --git a/src/ibea/population.cpp b/src/ibea/population.cpp index 923dc77..8dc8571 100644 --- a/src/ibea/population.cpp +++ b/src/ibea/population.cpp @@ -1,15 +1,28 @@ #include <cstdlib> +#include <cmath> +#include "indicator.h" #include "population.h" -Population::Population(int size, int dimension, int mu) : - size_(size), current_size_(0), dimension_(dimension), mu_(mu){ - +Population::Population(int size, int dimension, int n_objectives) : + size_(size), current_size_(0), dimension_(dimension), n_objectives_(n_objectives) +{ population_ = (double **) malloc(size_*sizeof(double *)); for (int i=0; i<size_; i++){ population_[i] = (double *) malloc(dimension_*sizeof(double)); } + values_ = (double **) malloc(size_*sizeof(double *)); + for (int i=0; i<size_; i++){ + values_[i] = (double *) malloc(n_objectives_*sizeof(double)); + } + + indicator_values_ = (double **) malloc(size_*sizeof(double *)); + indicator_values_[0] = NULL; + for (int i=1; i<size_; i++){ + indicator_values_[i] = (double *) malloc((size_-i)*sizeof(double)); + } + fitnesses_ = (double *) malloc(dimension_*sizeof(double)); } @@ -20,6 +33,18 @@ Population::~Population(){ } free(population_); + /* Free values */ + for (int i=0; i<size_; i++){ + free(values_[i]); + } + free(values); + + /* Free indicator values */ + for (int i=1; i<size_; i++){ + free(indicator_values_[i]); + } + free(indicator_values_); + /* Free fitnesses */ free(fitnesses_); } @@ -63,3 +88,32 @@ void Population::setMin(int i){ int Population::getMin(){ return ind_min_; } + +void Population::evaluate(void* evaluate_function){ + for (int i=0; i<current_size_; i++){ + evaluate_function(population_[i], values_[i]); + } +} + +void Population::compute_indicators(){ + c_ = 0; + for (int i=0; i<current_size_; i++){ + for (int j=i+1; j<current_size_; j++){ + indicator_values_[i][j] = indicator(values_[i], values_[j], n_objectives_); + if (indicator_values_[i][j] > c_){ + c_ = indicator_values_[i][j]; + } + } + } +} + +void Population::compute_fitnesses(double kappa){ + int d = c_ * kappa; + for (int i=0; i<current_size_; i++){ + fitness = 0 + for (int j=i+1; j<current_size_; j++){ + fitness += -exp(-indicator_values_[i][j]/d); + } + fitnesses_[i] = fitness + } +} diff --git a/src/ibea/population.h b/src/ibea/population.h index 4021397..514e66f 100644 --- a/src/ibea/population.h +++ b/src/ibea/population.h @@ -3,7 +3,7 @@ class Population { public: - Population(int size_max, int dimension, int mu); + Population(int size_max, int dimension, int n_objectives); ~Population(); int getSize(); int getCurrentSize(); @@ -18,14 +18,22 @@ public: void setMin(int i); int getMin(); + void evaluate(void* evaluate_function); + void compute_indicators(); + void compute_fitnesses(double kappa) + private: int size_; int current_size_; int dimension_; + int n_objectives_; double ** population_; + double ** values_; + double ** indicator_values_; double * fitnesses_; int ind_min_; + double c_; }; #endif -- GitLab