From 6969a2d37484a617ab7dc70b3550f7c457d425fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?K=C3=A9vin=20PASINI?= <kevin.pasini@ensiie.fr>
Date: Mon, 17 Oct 2016 12:26:50 +0200
Subject: [PATCH] Update combination.cpp

---
 src/ibea/combination.cpp | 38 ++++++++++++++++++--------------------
 1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/src/ibea/combination.cpp b/src/ibea/combination.cpp
index 28b3b6d..f4a0056 100644
--- a/src/ibea/combination.cpp
+++ b/src/ibea/combination.cpp
@@ -1,30 +1,35 @@
 #include <utility>
 #include <cstdlib>
-
+#include <iostream>
 #include "../coco/coco.h"
 #include "population.h"
 #include "combination.h"
 
-std::pair <double,double> simple_combination(double parent1,
-                                             double parent2,
-                                             const double eta,
-                                             coco_random_state_t *random_generator)
+
+void simple_combination(Population & pop_in,
+                        Population & pop_out,
+                        int parent1,
+                        int parent2,
+                        const double eta,
+                        coco_random_state_t *random_generator)
 {
-  double child1;
-  double child2;
+  double dimension = pop_in.getDim();
+
+  for (int j=0; j<floor(dimension/2.0); j++){
   double u = coco_random_uniform(random_generator);
   double beta;
-  std::pair <double,double> result;
+
   if (u <= 0.5){
     beta = pow(2*u,1/(1+eta));
   }
   else {
     beta = pow(1/(2*(1-u)),1/(1+eta));
   }
-  child1 = 0.5*((1+beta)*parent1 + (1-beta)*parent2);
-  child2 = 0.5*((1+beta)*parent1 + (1-beta)*parent2);
-  result= std::make_pair(child1,child2);
-  return result;
+  double child1 = 0.5*((1+beta)*pop_in.getIndiv(parent1,j) + (1-beta)*pop_in.getIndiv(parent2,j));
+  double child2 = 0.5*((1-beta)*pop_in.getIndiv(parent1,j) + (1+beta)*pop_in.getIndiv(parent2,j));
+  pop_out.setIndiv(parent1,j,child1);
+  pop_out.setIndiv(parent2,j,child2);
+  }
 }
 
 /* Recombinaison prédéfini */
@@ -36,18 +41,11 @@ void combinate(Population & pop_in,
 {
   double u;
   double size = pop_in.getCurrentSize();
-  double dimension = pop_in.getDim();
-  std::pair <double,double> childs;
-
   u = coco_random_uniform(random_generator);
   for (int i=0; i<floor(size/2.0); i++){
-    for (int j=0; j<floor(dimension/2.0); j++){
       if (u <= p_combination){
-        childs = simple_combination(pop_in.getIndiv(i,j), pop_in.getIndiv(size-i-1,dimension-j-1), eta, random_generator);
-        pop_out.setIndiv(i,j,childs.first);
-        pop_out.setIndiv(size-i-1,dimension-j-1,childs.second);
+        simple_combination(pop_in,pop_out,i,size-i-1, eta, random_generator);
       }
     }
-  }
   pop_out.setCurrenSize(size);
 }
-- 
GitLab