diff --git a/ant/Ant.java b/ant/Ant.java
index 27643bb9e7879bb1694d3f3a886112df8faf5cb2..ef4a793a794d14d980bd231cafcfcc5730bffc41 100644
--- a/ant/Ant.java
+++ b/ant/Ant.java
@@ -4,19 +4,14 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
+import baseOptiAgent.BaseAgent;
 import eval.Eval;
-import mas.core.Agent;
 
-public class Ant extends Agent{
-
-	private List<Double> vector;
-	double evaluate;
+public class Ant extends BaseAgent{
 	
-	Eval eval;
-	Env env;
+	AntEnv env;
 	
 	Phase phase;
-	int id;
 
 	private double evaporationRate;
 	
@@ -26,7 +21,7 @@ public class Ant extends Agent{
 	private List<Solution> archive;
 	private List<Double> archiveProba;
 	
-	public Ant(int _id, Eval _eval, Env _env, double _evaporationRate) {
+	public Ant(int _id, Eval _eval, AntEnv _env, double _evaporationRate) {
 		eval = _eval;
 		env = _env;
 
@@ -45,10 +40,6 @@ public class Ant extends Agent{
 	
 	}
 	
-	private double evaluate(List<Double> values) {
-    	return eval.evaluate(values);
-	}
-	
     private void nextPhase() {
 		if (phase == Phase.EVALUATE) {
 			phase = Phase.BUILD_NEW;
@@ -76,9 +67,6 @@ public class Ant extends Agent{
 		else if (phase == Phase.BUILD_NEW) {
 			archive = env.getArchive();
 			archiveProba = env.getArchiveProba();
-			if (id == 0) {
-				System.out.println(archive);
-			}
 		}
 	}
 	
@@ -146,14 +134,6 @@ public class Ant extends Agent{
 		return sol;
 	}
 	
-	public List<Double> getVector() {
-		return vector;
-	}
-	
-	public double getEvaluate() {
-		return evaluate;
-	}
-	
 	public Phase getPhase() {
 		return phase;
 	}
diff --git a/ant/Env.java b/ant/AntEnv.java
similarity index 88%
rename from ant/Env.java
rename to ant/AntEnv.java
index 4c7a7f3ec42269d83ffc0e7104ba6773a0acf069..0db7d3c43596d2a3797ed4200784fae3abfaa672 100644
--- a/ant/Env.java
+++ b/ant/AntEnv.java
@@ -6,9 +6,10 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Random;
 
+import baseOptiAgent.Env;
 import eval.Eval;
 
-public class Env {
+public class AntEnv extends Env{
 	
 	private List<Solution> archive;
 	private List<Double> archiveProba;
@@ -20,7 +21,7 @@ public class Env {
 	private int archiveLen;
 	private double q;
 	
-	public Env(int _archiveLen, double _q, Eval _eval) {
+	public AntEnv(int _archiveLen, double _q, Eval _eval) {
 		archiveLen = _archiveLen;
 		q = _q;
 		
@@ -99,8 +100,15 @@ public class Env {
 	public List<Ant> getAgents() {
 		return agents;
 	}
-	
-	public double bestValue() {
+
+	@Override
+	public double getBestFitness() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public double getBestEval() {
 		return archive.get(archive.size()-1).getEval();
 	}
 }
diff --git a/ant/AntSolver.java b/ant/AntSolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..53e9c89252a6d12e96040e1e6d91830de766d8db
--- /dev/null
+++ b/ant/AntSolver.java
@@ -0,0 +1,40 @@
+package ant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import baseOptiAgent.Result;
+import baseOptiAgent.Solver;
+import eval.Eval;
+
+public class AntSolver extends Solver{
+
+	public AntSolver(Eval _eval, int _maxCycle, int _maxEval) {
+		super(_eval, _maxCycle, _maxEval);
+		name = "Ant";
+	}
+
+	@Override
+	public Result solve() {
+		
+		// [PARAM]
+		int nbrAgent = 40;
+		int archiveSize = 10;
+		
+		double evaporation = 0.6;
+		double q = 0.2;
+		
+		// [INIT]
+		AntEnv env = new AntEnv(archiveSize, q, eval);
+		
+		List<Ant> agents = new ArrayList<Ant>();
+		for (int i_agent = 0; i_agent < nbrAgent; i_agent++) {
+			agents.add(new Ant(i_agent, eval, env, evaporation));
+		}
+		
+		env.initAgents(agents);
+		
+		return findSolution(agents, env, 2);
+	}
+
+}
\ No newline at end of file
diff --git a/ant/MainAnt.java b/ant/MainAnt.java
deleted file mode 100644
index ced49a521384a107f237205a228913ed2e8aef25..0000000000000000000000000000000000000000
--- a/ant/MainAnt.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package ant;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import eval.Eval;
-import eval.fun.SchwefelFunction;
-import eval.fun.SchwefelFunction1_2;
-import eval.fun.StepFunction;
-
-/*
- * https://www.sciencedirect.com/science/article/pii/S0952197619301940#fig1
- * https://towardsdatascience.com/introduction-to-global-optimization-algorithms-for-continuous-domain-functions-7ad9d01db055 
- */
-
-public class MainAnt {
-	public static void main(String[] args) {
-		// [PARAM]
-		
-		int nbrAgent = 40;
-		int archiveSize = 10;
-		
-		double evaporation = 0.6;
-		double q = 0.2;
-	
-		int res = 0;
-		int nbrTry = 1;
-		
-		long startTime = System.currentTimeMillis();
-		for (int i = 0; i < nbrTry; i++) {
-			// [INIT]
-			//Eval eval = new StepFunction();
-			Eval eval = new SchwefelFunction1_2();
-			//Eval eval = new SchwefelFunction();
-			//Eval eval = new Rastrigin();
-			
-
-			Env env = new Env(archiveSize, q, eval);
-			
-			List<Ant> agents = new ArrayList<Ant>();
-			for (int i_agent = 0; i_agent < nbrAgent; i_agent++) {
-				agents.add(new Ant(i_agent, eval, env, evaporation));
-			}
-			
-			env.initAgents(agents);
-			
-			res += findSolution(nbrAgent, env, eval, agents);
-			System.out.println("run : "+i);
-			System.out.println("Nbr eval :"+eval.getCount());
-		}
-		long estimatedTime = System.currentTimeMillis() - startTime;
-		
-		System.out.println("Time : "+estimatedTime/1000+ "s "+estimatedTime%1000+"ms");
-		System.out.println(res);
-		System.out.println("Average cycle : "+(double)res/(double)nbrTry);
-
-	}
-	
-	private static int findSolution(
-			int nbrAgent,
-			Env env,
-			Eval eval,
-			List<Ant> agents
-			) {
-		
-		// [RUN]
-		
-		int cycle = 0;
-		
-		do  {
-			do {
-				for (Ant agent : agents) {
-					agent.perceive();
-				}
-				for (Ant agent : agents) {
-					agent.decide();
-					agent.act();
-
-				}
-				cycle++;
-			}while (agents.get(0).getPhase() != Phase.EVALUATE);
-			cycle ++;
-			System.out.println("Cycle : "+cycle+" Value : "+env.bestValue());
-			
-			/*
-			// Pas à Pas
-			try {
-				System.in.read();
-			} catch (IOException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-			*/
-			
-			
-		} while(Math.abs(env.bestValue()-eval.getObjective())>eval.getErrorDelta());
-
-		return cycle;
-		
-	}
-	
-	private static int findSolution2(
-			int nbrAgent,
-			Env env,
-			Eval eval,
-			List<Ant> agents
-			) {
-		
-		// [RUN]
-		Scheduler scheduler = new Scheduler(env, eval,  agents.toArray(new Ant[agents.size()]));
-		scheduler.start();
-		
-		scheduler.waitUntilFinish();
-		
-		return scheduler.getNbOfCycles();
-	}
-
-}
\ No newline at end of file
diff --git a/ant/Scheduler.java b/ant/Scheduler.java
deleted file mode 100644
index 327ce49f6a6da9e399d269d663ba43c760822c48..0000000000000000000000000000000000000000
--- a/ant/Scheduler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package ant;
-
-import java.util.List;
-
-import eval.Eval;
-import mas.core.ThreeStepCyclable;
-import mas.implementation.schedulers.variations.ThreeStepCycling;
-
-public class Scheduler extends ThreeStepCycling{
-
-	public Env env;
-	public Eval eval;
-	
-	
-	public Scheduler(Env _env, Eval _eval, ThreeStepCyclable... _threeStepCyclables) {
-		super(_threeStepCyclables);
-		env = _env;
-		eval = _eval;
-	}
-	
-	@Override
-	public boolean stopCondition() {
-		if (env.getAgents().get(0).getPhase() != Phase.EVALUATE) {
-			return false;
-		}
-		return Math.abs(env.bestValue()-eval.getObjective())<=eval.getErrorDelta();
-	}
-}
\ No newline at end of file
diff --git a/baseOptiAgent/Cycle.java b/baseOptiAgent/Cycle.java
new file mode 100644
index 0000000000000000000000000000000000000000..2d2566ed697069363ffa27dc38c6932f02d842e6
--- /dev/null
+++ b/baseOptiAgent/Cycle.java
@@ -0,0 +1,21 @@
+package baseOptiAgent;
+
+public class Cycle {
+	
+	private int eval;
+	private double bestSolution;
+	
+	public Cycle(int _eval, double _bestSolution) {
+		eval = _eval;
+		bestSolution = _bestSolution;	
+	}
+	
+	public double getBestSolution() {
+		return bestSolution;
+	}
+	
+	public int getEval() {
+		return eval;
+	}
+	
+}
diff --git a/ihm/Ihm.java b/baseOptiAgent/Ihm.java
similarity index 52%
rename from ihm/Ihm.java
rename to baseOptiAgent/Ihm.java
index f86b58646bc1b3bc9332e0d799872f540bd5b721..ac5b1384cb4fdfa785edf8831dbbbe52233f431e 100644
--- a/ihm/Ihm.java
+++ b/baseOptiAgent/Ihm.java
@@ -1,6 +1,10 @@
-package ihm;
+package baseOptiAgent;
 
-import baseOptiAgent.Solver;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.stream.Stream;
+
+import ant.AntSolver;
 import bee.BeeSolver;
 import eval.Eval;
 import eval.fun.Rastrigin;
@@ -16,15 +20,39 @@ public class Ihm {
 		int maxEval = 1000000;
 		
 		Solver solver = new BeeSolver(eval, maxCycle, maxEval);
+		//Solver solver = new AntSolver(eval, maxCycle, maxEval);
+		
 		Result res = solver.solve();
 		
 		System.out.println("Cycle : "+res.totalCycle+" Out of "+maxCycle);
 		System.out.println("Eval : "+res.totalEval+" Out of "+maxEval);
 		System.out.println("Solution found "+res.optiFound);
 		
+		/*
 		System.out.println("Solution : ");
 		for (Integer name: res.cycle.keySet()) {
 		    System.out.println(name + " " + res.cycle.get(name));
 		}
+		*/
+		
+		writeEval(res);
+	
+	}
+	
+	private static void writeEval(Result res) {
+		try {
+			FileWriter csvWriter = new FileWriter("eval_"+res.name+".csv");
+			csvWriter.append("cycle,eval,sol\n");
+
+
+			for (Integer name: res.cycle.keySet()) {
+			    csvWriter.append(name+","+res.cycle.get(name).getEval()+","+res.cycle.get(name).getBestSolution()+"\n");
+			}
+			csvWriter.flush();
+			csvWriter.close();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 	}
 }
diff --git a/ihm/Result.java b/baseOptiAgent/Result.java
similarity index 73%
rename from ihm/Result.java
rename to baseOptiAgent/Result.java
index b6dd96db994e498f236339e43261f15b8063e0f8..ef1e12711be7b3fa1257c690e6428497f149af02 100644
--- a/ihm/Result.java
+++ b/baseOptiAgent/Result.java
@@ -1,4 +1,4 @@
-package ihm;
+package baseOptiAgent;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -13,12 +13,12 @@ public class Result {
 	
 	public boolean optiFound;
 	
-	public Map<Integer, Double> cycle;
+	public Map<Integer, Cycle> cycle;
 	
 	public Result(String _name) {
 		name = _name;
 		optiFound = false;
-		cycle = new TreeMap<Integer, Double>();
+		cycle = new TreeMap<Integer, Cycle>();
 	}
 	
 }
diff --git a/baseOptiAgent/Solver.java b/baseOptiAgent/Solver.java
index 3b9859d7dcde918237f248e99a1c61dcca8a4201..4fe866f9fdbdbf75ecad6881c1d3c6cbabc115e6 100644
--- a/baseOptiAgent/Solver.java
+++ b/baseOptiAgent/Solver.java
@@ -3,7 +3,6 @@ package baseOptiAgent;
 import java.util.List;
 
 import eval.Eval;
-import ihm.Result;
 
 public abstract class Solver {
 
@@ -29,10 +28,10 @@ public abstract class Solver {
 
 		int cycle = 0;
 		
-		res.cycle.put(0, env.getBestEval());
 		double bestEval = env.getBestEval();
 		
 		do  {
+			res.cycle.put(cycle, new Cycle(eval.getCount(), env.getBestEval()));
 			for(int i = 0; i < cycleModulo; i++) {
 				for (BaseAgent agent : agents) {
 					agent.perceive();
@@ -44,8 +43,8 @@ public abstract class Solver {
 			}
 			
 			double nextEval = env.getBestEval();
+			
 			if (nextEval < bestEval) {
-				res.cycle.put(cycle, env.getBestEval());
 				bestEval = nextEval;
 			}
 			
diff --git a/bee/BeeSolver.java b/bee/BeeSolver.java
index 63ef6cf30fdc1a4434b73e3a7ee6a5a42f55a686..b44bf082a0190787a5cee66a1442c1ed1916519b 100644
--- a/bee/BeeSolver.java
+++ b/bee/BeeSolver.java
@@ -5,9 +5,9 @@ import java.util.List;
 
 import baseOptiAgent.BaseAgent;
 import baseOptiAgent.Env;
+import baseOptiAgent.Result;
 import baseOptiAgent.Solver;
 import eval.Eval;
-import ihm.Result;
 
 public class BeeSolver extends Solver{
 
diff --git a/bee/MainBee.java b/bee/MainBee.java
deleted file mode 100644
index 907e7271bc6a466064584ca6f28d32aecae8a9c0..0000000000000000000000000000000000000000
--- a/bee/MainBee.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package bee;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import eval.Eval;
-import eval.fun.Rastrigin;
-import eval.fun.SchwefelFunction1_2;
-import eval.fun.StepFunction;
-
-public class MainBee {
-	public static void main(String[] args) {
-		// [PARAM]
-		
-		int nbrAgent = 100;
-		int maxTry = 200;
-	
-		int res = 0;
-		int nbrTry = 1;
-		
-		long startTime = System.currentTimeMillis();
-		for (int i = 0; i < nbrTry; i++) {
-			// [INIT]
-			
-			//Eval eval = new StepFunction();
-			//Eval eval = new SchwefelFunction1_2();
-			//Eval eval = new SchwefelFunction();
-			Eval eval = new Rastrigin();
-			
-
-			BeeEnv env = new BeeEnv();
-			
-			List<Bee> agents = new ArrayList<Bee>();
-			for (int i_agent = 0; i_agent < nbrAgent; i_agent++) {
-				agents.add(new Bee(i_agent, eval, env, maxTry));
-			}
-			
-			env.initAgent(agents);
-			
-			res += findSolution(nbrAgent, env, eval, agents);
-			System.out.println("run : "+i);
-			System.out.println("Nbr eval :"+eval.getCount());
-		}
-		long estimatedTime = System.currentTimeMillis() - startTime;
-		
-		System.out.println("Time : "+estimatedTime/1000+ "s "+estimatedTime%1000+"ms");
-		System.out.println(res);
-		System.out.println("Average cycle : "+(double)res/(double)nbrTry);
-
-	}
-	
-	private static int findSolution(
-			int nbrAgent,
-			BeeEnv env,
-			Eval eval,
-			List<Bee> agents
-			) {
-		
-		// [RUN]
-		
-		int cycle = 0;
-		double bestSol = 0;
-		
-		do  {
-			do {
-				for (Bee agent : agents) {
-					agent.perceive();
-				}
-				for (Bee agent : agents) {
-					agent.decide();
-					agent.act();
-
-				}
-			}while (agents.get(0).getPhase() != Phase.EMPLOYED);
-			
-			if(cycle == 0) {
-				bestSol = env.getBestEval();
-			}
-			else if (env.getBestEval() < bestSol) {
-				bestSol = env.getBestEval();
-				System.out.println("Improve : "+bestSol+" at :"+cycle);
-			}
-			
-			cycle ++;
-			//System.out.println("Cycle : "+cycle+" Value : "+env.bestEval());
-			
-			/*
-			// Pas à Pas
-			try {
-				System.in.read();
-			} catch (IOException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-			*/
-			
-			
-			
-		} while(Math.abs(env.getBestEval()-eval.getObjective())>eval.getErrorDelta());
-
-		return cycle;
-		
-	}
-}