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