From a499b2e402a4208e41c74493f719b0f325def69e Mon Sep 17 00:00:00 2001
From: Sebastien GOYON <shinedday@gmail.com>
Date: Wed, 6 Jul 2022 08:14:42 +0200
Subject: [PATCH] Ant / bee now use new base

---
 ant/Ant.java                       |  28 +------
 ant/{Env.java => AntEnv.java}      |  16 +++-
 ant/AntSolver.java                 |  40 ++++++++++
 ant/MainAnt.java                   | 119 -----------------------------
 ant/Scheduler.java                 |  28 -------
 baseOptiAgent/Cycle.java           |  21 +++++
 {ihm => baseOptiAgent}/Ihm.java    |  32 +++++++-
 {ihm => baseOptiAgent}/Result.java |   6 +-
 baseOptiAgent/Solver.java          |   5 +-
 bee/BeeSolver.java                 |   2 +-
 bee/MainBee.java                   | 105 -------------------------
 11 files changed, 113 insertions(+), 289 deletions(-)
 rename ant/{Env.java => AntEnv.java} (88%)
 create mode 100644 ant/AntSolver.java
 delete mode 100644 ant/MainAnt.java
 delete mode 100644 ant/Scheduler.java
 create mode 100644 baseOptiAgent/Cycle.java
 rename {ihm => baseOptiAgent}/Ihm.java (52%)
 rename {ihm => baseOptiAgent}/Result.java (73%)
 delete mode 100644 bee/MainBee.java

diff --git a/ant/Ant.java b/ant/Ant.java
index 27643bb..ef4a793 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 4c7a7f3..0db7d3c 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 0000000..53e9c89
--- /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 ced49a5..0000000
--- 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 327ce49..0000000
--- 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 0000000..2d2566e
--- /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 f86b586..ac5b138 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 b6dd96d..ef1e127 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 3b9859d..4fe866f 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 63ef6cf..b44bf08 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 907e727..0000000
--- 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;
-		
-	}
-}
-- 
GitLab