Skip to content
Snippets Groups Projects
Commit a499b2e4 authored by Sebastien GOYON's avatar Sebastien GOYON
Browse files

Ant / bee now use new base

parent 4541fc15
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
......
......@@ -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();
}
}
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
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
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
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;
}
}
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();
}
}
}
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>();
}
}
......@@ -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;
}
......
......@@ -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{
......
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;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment