diff --git a/amakaque/MainAmakaque.java b/amakaque/MainAmakaque.java deleted file mode 100644 index e23ac649fded73ab97bf4617b0e7896b5643e452..0000000000000000000000000000000000000000 --- a/amakaque/MainAmakaque.java +++ /dev/null @@ -1,161 +0,0 @@ -package amakaque; - -import java.util.ArrayList; -import java.util.List; - -import eval.Eval; -import eval.fun.Rastrigin; -import eval.fun.SchwefelFunction; -import eval.fun.SchwefelFunction1_2; -import eval.fun.StepFunction; -import mas.core.Schedulable; - -public class MainAmakaque { - - public static void main(String[] args) { - // [PARAM] - - int nbrAgent = 50; - - // [0.1 : 0.9] - double pr = 0.1; - - // - int maxGroup = 5; - - int localLimit = 1500; - int globalLimit = 50; - - int res = 0; - int nbrTry = 100; - - long startTime = System.currentTimeMillis(); - for (int i = 0; i < nbrTry; i++) { - res += findSolution(nbrAgent, pr, maxGroup, localLimit, globalLimit); - // System.out.println("run : "+i); - } - 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); - - - - // ******************** SCHEDULER ************************ - /* - res = 0; - startTime = System.currentTimeMillis(); - for (int i = 0; i < nbrTry; i++) { - res += findSolution2(nbrAgent, pr, maxGroup, localLimit, globalLimit); - // System.out.println("run : "+i); - } - 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, - double pr, - int maxGroup, - int localLimit, - int globalLimit - ) { - - // [INIT] - Eval eval = new StepFunction(); - //Eval eval = new SchwefelFunction1_2(); - //Eval eval = new SchwefelFunction(); - //Eval eval = new Rastrigin(); - - - - Env env = new Env(localLimit, globalLimit, maxGroup, eval); - - List<SMAgent> agents = new ArrayList<SMAgent>(); - for (int i = 0; i < nbrAgent; i++) { - agents.add(new SMAgent(i, pr, env, eval)); - } - - Group group = new Group(); - group.addAgents(agents); - env.initGroup(group); - - - // [RUN] - - int cycle = 0; - - while(Math.abs(eval.evaluate(env.getGlobalLeader())-eval.getObjective())>eval.getErrorDelta()) { - do { - for (SMAgent agent : agents) { - agent.perceive(); - } - for (SMAgent agent : agents) { - agent.decide(); - agent.act(); - - } - cycle++; - }while (agents.get(0).getPhase() != Phase.LOCAL_LEADER_PHASE); - //cycle ++; - //System.out.println("Cycle : "+cycle+" Value : "+eval.evaluate(env.getGlobalLeader())); - //System.out.println(env.getGlobalLeader()); - - /* - // Pas à Pas - try { - System.in.read(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - */ - - } - //System.out.println("Best solution : "+env.getGlobalLeader()); - //System.out.println("That evaluate to : "+eval.evaluate(env.getGlobalLeader())); - //System.out.println("Eval : "+eval.getCount()); - return cycle; - - } - - private static int findSolution2( - int nbrAgent, - double pr, - int maxGroup, - int localLimit, - int globalLimit) { - - // [INIT] - Eval eval = new StepFunction(); - //Eval eval = new SchwefelFunction1_2(); - //Eval eval = new SchwefelFunction(); - //Eval eval = new Rastrigin(); - - Env env = new Env(localLimit, globalLimit, maxGroup, eval); - - List<SMAgent> agents = new ArrayList<SMAgent>(); - for (int i = 0; i < nbrAgent; i++) { - agents.add(new SMAgent(i, pr, env, eval)); - } - - Group group = new Group(); - group.addAgents(agents); - env.initGroup(group); - - - // [RUN] - Scheduler scheduler = new Scheduler(env, eval, agents.toArray(new SMAgent[agents.size()])); - scheduler.start(); - - scheduler.waitUntilFinish(); - - return scheduler.getNbOfCycles(); - } - -} diff --git a/amakaque/SMAgent.java b/amakaque/SMAgent.java index f77252e4ee1b34353caf51d1326cb5cf4fcb175a..f4261203cf8e5c6bf3158bed927a5bf358c05014 100644 --- a/amakaque/SMAgent.java +++ b/amakaque/SMAgent.java @@ -3,12 +3,13 @@ package amakaque; import java.util.ArrayList; import java.util.List; +import baseOptiAgent.BaseAgent; import eval.Eval; import mas.core.Agent; -public class SMAgent extends Agent { +public class SMAgent extends BaseAgent { - private Env env; + private SMEnv env; /* * Is local leader/ is global leader @@ -17,17 +18,11 @@ public class SMAgent extends Agent { private boolean isGL; private int currentGroup; - private int id; - - private List<Double> dimVector; - private double fitness; private Double pr; private Phase phase; - private Eval eval; - // LLP private List<Double> randomLocalMember; private List<Double> localLeader; @@ -63,7 +58,7 @@ public class SMAgent extends Agent { /* * Init the SM with random starting point within the env dimension */ - public SMAgent(int _id, double _pr, Env _env, Eval _eval) { + public SMAgent(int _id, double _pr, SMEnv _env, Eval _eval) { env = _env; eval = _eval; id = _id; @@ -77,13 +72,9 @@ public class SMAgent extends Agent { } currentGroup = 0; - dimVector = new ArrayList<Double>(); - - for (int i = 0; i < eval.getDim(); i++) { - dimVector.add(eval.getMin(i) + Math.random() * (eval.getMax(i) - eval.getMin(i))); - } - - fitness = fitness(dimVector); + vector = generateRandomVector(); + evaluate = evaluate(vector); + fitness = fitness(evaluate); pr = _pr; phase = Phase.LOCAL_LEADER_PHASE; @@ -102,7 +93,7 @@ public class SMAgent extends Agent { randomLocalMember = env.getRandomGroupMember(currentGroup, id); globalLeader = env.getGlobalLeader(); groupSize = env.getGroupSize(currentGroup); - maxFitness = env.getMaxFitness(); + maxFitness = env.getBestFitness(); count = env.getCount(currentGroup); allDone = env.allDone(); } @@ -137,16 +128,6 @@ public class SMAgent extends Agent { } } - - private double fitness(List<Double> values) { - double fun = eval.evaluate(values); - if (fun >= 0) { - return 1/(1 + fun); - } - else { - return 1 + Math.abs(fun); - } - } private void nextPhase() { if (phase == Phase.LOCAL_LEADER_PHASE) { @@ -184,9 +165,9 @@ public class SMAgent extends Agent { List<Double> newValues = new ArrayList<Double>(); - for (int i = 0; i < dimVector.size(); i++) { + for (int i = 0; i < vector.size(); i++) { - Double currentValue = dimVector.get(i); + Double currentValue = vector.get(i); if (Math.random() >= pr) { double value = currentValue @@ -209,11 +190,7 @@ public class SMAgent extends Agent { * Apply the greedy selection process between existing position and newly generated position, * based on fitness and select the better one; */ - double new_fitness = fitness(newValues); - if (fitness<new_fitness) { - dimVector = newValues; - fitness = new_fitness; - } + compareAndUpdate(newValues); } private void globalLeaderPhase() { @@ -230,10 +207,10 @@ public class SMAgent extends Agent { if (count < groupSize) { if (Math.random() < prob) { env.count(currentGroup); - int j = (int)(Math.random() * dimVector.size()); + int j = (int)(Math.random() * vector.size()); - List<Double> newValues = new ArrayList<Double>(dimVector); - Double currentValue = dimVector.get(j); + List<Double> newValues = new ArrayList<Double>(vector); + Double currentValue = vector.get(j); double value = currentValue + Math.random() * (globalLeader.get(j) - currentValue) + (2*Math.random() - 1) * (randomLocalMember.get(j) - currentValue); @@ -246,11 +223,7 @@ public class SMAgent extends Agent { newValues.set(j,value); - double new_fitness = fitness(newValues); - if (fitness<new_fitness) { - dimVector = newValues; - fitness = new_fitness; - } + compareAndUpdate(newValues); } } } @@ -300,9 +273,9 @@ public class SMAgent extends Agent { if (localLimitCount > localLimit) { List<Double> newValues = new ArrayList<Double>(); - for (int j = 0; j < dimVector.size(); j++) { + for (int j = 0; j < vector.size(); j++) { - Double currentValue = dimVector.get(j); + Double currentValue = vector.get(j); if (Math.random() >= pr) { newValues.add(eval.getMin(j) + Math.random() * (eval.getMax(j) - eval.getMin(j))); @@ -316,8 +289,9 @@ public class SMAgent extends Agent { } } - dimVector = newValues; - fitness = fitness(dimVector); + vector = newValues; + evaluate = evaluate(vector); + fitness = fitness(evaluate); } } @@ -391,14 +365,6 @@ public class SMAgent extends Agent { } } - public List<Double> getDimVector() { - return dimVector; - } - - public int getId() { - return id; - } - public boolean isLL() { return isLL; } @@ -429,10 +395,6 @@ public class SMAgent extends Agent { return phase; } - public double getFitness() { - return fitness; - } - @Override public boolean equals(Object obj) { if (!(obj instanceof SMAgent)) return false; diff --git a/amakaque/Env.java b/amakaque/SMEnv.java similarity index 88% rename from amakaque/Env.java rename to amakaque/SMEnv.java index a7d2b1b872979dfe451e8f553ef52325c45abe54..b4c811e5374c8d3f618771bad54fd0e30661aac4 100644 --- a/amakaque/Env.java +++ b/amakaque/SMEnv.java @@ -4,9 +4,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import baseOptiAgent.Env; import eval.Eval; -public class Env { +public class SMEnv extends Env{ private int globalLimitCount; @@ -15,9 +16,7 @@ public class Env { private int groupLimit; private List<Group> groups; - private Eval eval; - - public Env(int _localLimit, int _globalLimit, int _groupLimit, Eval _eval) { + public SMEnv(int _localLimit, int _globalLimit, int _groupLimit, Eval _eval) { globalLimitCount = 0; eval = _eval; @@ -71,7 +70,7 @@ public class Env { randomagent = group.getAgents().get(rand.nextInt(group.getAgents().size())); } - return randomagent.getDimVector(); + return randomagent.getVector(); } public List<Double> getLocalLeader(int i_group){ @@ -80,13 +79,14 @@ public class Env { List<SMAgent> agents = group.getAgents(); for (SMAgent agent: agents) { if(agent.isLL()) { - return agent.getDimVector(); + return agent.getVector(); } } throw new java.lang.Error("The group :"+String.valueOf(i_group)+" don t have a local leader."); } - - public double getMaxFitness() { + + @Override + public double getBestFitness() { double max = 0; for (Group group: groups) { @@ -105,7 +105,7 @@ public class Env { for (Group group: groups) { for (SMAgent agent: group.getAgents()) { if (agent.isGL()) { - return agent.getDimVector(); + return agent.getVector(); } } } @@ -230,4 +230,18 @@ public class Env { } throw new java.lang.Error("No global leader found."); } + + @Override + public double getBestEval() { + SMAgent maxAgent = groups.get(0).getAgents().get(0); + + for (Group group: groups) { + for (SMAgent agent: group.getAgents()) { + if(agent.getFitness() > maxAgent.getFitness()) { + maxAgent = agent; + } + } + } + return maxAgent.getEvaluate(); + } } diff --git a/amakaque/SMSolver.java b/amakaque/SMSolver.java new file mode 100644 index 0000000000000000000000000000000000000000..7a1ed05d4e8f51ed5df49f21f34a774170ee392e --- /dev/null +++ b/amakaque/SMSolver.java @@ -0,0 +1,46 @@ +package amakaque; + +import java.util.ArrayList; +import java.util.List; + +import baseOptiAgent.Result; +import baseOptiAgent.Solver; +import eval.Eval; + +public class SMSolver extends Solver{ + + public SMSolver(Eval _eval, int _maxCycle, int _maxEval) { + super(_eval, _maxCycle, _maxEval); + name = "Spider-Monkey"; + } + + @Override + public Result solve() { + + // [PARAM] + int nbrAgent = 50; + + // [0.1 : 0.9] + double pr = 0.1; + + // + int maxGroup = 5; + + int localLimit = 1500; + int globalLimit = 50; + + // [INIT] + SMEnv env = new SMEnv(localLimit, globalLimit, maxGroup, eval); + + List<SMAgent> agents = new ArrayList<SMAgent>(); + for (int i = 0; i < nbrAgent; i++) { + agents.add(new SMAgent(i, pr, env, eval)); + } + + Group group = new Group(); + group.addAgents(agents); + env.initGroup(group); + + return findSolution(agents, env, 6); + } +} diff --git a/amakaque/Scheduler.java b/amakaque/Scheduler.java index bb0b50100152ac091affe771ebfc7b9f99468fc4..997aede50c69141fc454986e300fd6f0ad129661 100644 --- a/amakaque/Scheduler.java +++ b/amakaque/Scheduler.java @@ -6,11 +6,11 @@ import mas.implementation.schedulers.variations.ThreeStepCycling; public class Scheduler extends ThreeStepCycling{ - public Env env; + public SMEnv env; public Eval eval; - public Scheduler(Env _env, Eval _eval, ThreeStepCyclable... _threeStepCyclables) { + public Scheduler(SMEnv _env, Eval _eval, ThreeStepCyclable... _threeStepCyclables) { super(_threeStepCyclables); env = _env; eval = _eval; diff --git a/baseOptiAgent/BaseAgent.java b/baseOptiAgent/BaseAgent.java index 173cc3d8fdcc1f98e8a58b4a3ddaa4407fa0f088..6f3cc37252f75b36dc0b0936f9c5495f3835b86f 100644 --- a/baseOptiAgent/BaseAgent.java +++ b/baseOptiAgent/BaseAgent.java @@ -66,4 +66,16 @@ public abstract class BaseAgent extends Agent{ return fitness; } + protected boolean compareAndUpdate(List<Double> otherVec) { + double newEval = evaluate(otherVec); + double newFitness = fitness(newEval); + if (fitness<newFitness) { + vector = otherVec; + fitness = newFitness; + evaluate = newEval; + return true; + } + return false; + } + } diff --git a/baseOptiAgent/Env.java b/baseOptiAgent/Env.java index 12c8fd9ba95273a983f7255a1b369ff4a8e87c30..dad602cadc31e5172aa4af62c83cd603c0c857d0 100644 --- a/baseOptiAgent/Env.java +++ b/baseOptiAgent/Env.java @@ -4,7 +4,7 @@ import eval.Eval; public abstract class Env { - Eval eval; + protected Eval eval; diff --git a/baseOptiAgent/Ihm.java b/baseOptiAgent/Ihm.java index ac5b1384cb4fdfa785edf8831dbbbe52233f431e..5306e9cf70f43ddf68e645ed70d6f1d23484a0a8 100644 --- a/baseOptiAgent/Ihm.java +++ b/baseOptiAgent/Ihm.java @@ -4,6 +4,7 @@ import java.io.FileWriter; import java.io.IOException; import java.util.stream.Stream; +import amakaque.SMSolver; import ant.AntSolver; import bee.BeeSolver; import eval.Eval; @@ -18,8 +19,9 @@ public class Ihm { int maxCycle = 200000; int maxEval = 1000000; - - Solver solver = new BeeSolver(eval, maxCycle, maxEval); + + Solver solver = new SMSolver(eval, maxCycle, maxEval); + //Solver solver = new BeeSolver(eval, maxCycle, maxEval); //Solver solver = new AntSolver(eval, maxCycle, maxEval); Result res = solver.solve(); diff --git a/bee/Bee.java b/bee/Bee.java index 8bd81cf147a23e0eb399970eb4dc7968317ed8f5..a1ee2cefcc5fc5f4d2a35178608ec8b4ad3b144a 100644 --- a/bee/Bee.java +++ b/bee/Bee.java @@ -71,18 +71,9 @@ public class Bee extends BaseAgent{ newVector.set(dim, vector.get(dim) + 2 * (Math.random() - 0.5) * (vector.get(dim) - randomAgent.get(dim))); - this.boundValue(newVector); + boundValue(newVector); - double newEval = evaluate(newVector); - double newFit = fitness(newEval); - if (fitness < newFit) { - //System.out.println("Update from : "+evaluate+" to "+newEval); - vector = newVector; - evaluate = newEval; - fitness = newFit; - return true; - } - return false; + return compareAndUpdate(newVector); } private void employedPhase() {