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