diff --git a/pom.xml b/pom.xml index 7dd6509..6fb0c06 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,12 @@ 4.13.2 test + + + org.knowm.xchart + xchart + 3.8.3 + diff --git a/src/main/java/jobshop/solvers/TabooSolver.java b/src/main/java/jobshop/solvers/TabooSolver.java index d09095a..b631fdd 100644 --- a/src/main/java/jobshop/solvers/TabooSolver.java +++ b/src/main/java/jobshop/solvers/TabooSolver.java @@ -6,14 +6,20 @@ import jobshop.Instance; import jobshop.encodings.ResourceOrder; import jobshop.encodings.Schedule; import jobshop.solvers.neighborhood.Neighborhood; +import org.knowm.xchart.SwingWrapper; +import org.knowm.xchart.XYChart; +import org.knowm.xchart.XYChartBuilder; import java.time.format.ResolverStyle; import java.util.*; +import java.util.stream.IntStream; + public class TabooSolver implements Solver { final Neighborhood neighborhood; final Solver baseSolver; + /** Creates a new descent solver with a given neighborhood and a solver for the initial solution. * * @param neighborhood Neighborhood object that should be used to generates neighbor solutions to the current candidate. @@ -32,6 +38,10 @@ public class TabooSolver implements Solver { // Create an array to store the cycle ArrayList historic = new ArrayList(); + + ArrayList makespans = new ArrayList<>(); + ArrayList bests = new ArrayList<>(); + /*for output writing*/ FileWriter fw = null; try { @@ -85,6 +95,8 @@ public class TabooSolver implements Solver { } /* Check if we have a cycle */ + // TODO : on ne mmet pas a jour l'historiaue ? + // todo add la liste des interdits dans le calcul du hash if (isCycle(historic, result.toSchedule().get())){ System.out.println("CYCLE"); break; @@ -94,12 +106,15 @@ public class TabooSolver implements Solver { + "\u001b[32m" + "Current best makespam : " + best + "\u001b[0m, " + "\u001b[33m" + "Number of neighbours : " + getNumberOfNeighbours(neighbours) + "\u001b[0m, " + "\u001b[37m" + "Number of non-forbidden neighbours : " + getNumberOfNonForbiddenNeighbours(neighbours,previousRO, forbiddenNeighbours, iterationCount) + "\u001b[0m"); - + // print to csv pw.println(result.toSchedule().get().makespan() + "," + best + "," + getNumberOfNeighbours(neighbours) + "," + getNumberOfNonForbiddenNeighbours(neighbours,previousRO, forbiddenNeighbours, iterationCount)); + // add to graph data + makespans.add(result.toSchedule().get().makespan()); + bests.add(best); best = Integer.min(result.toSchedule().get().makespan(),best); if (bestRO.toSchedule().get().makespan() > result.toSchedule().get().makespan()) { @@ -109,6 +124,25 @@ public class TabooSolver implements Solver { iterationCount++; } + Double[] makespansDataD = makespans.stream().map(e -> Double.valueOf(e)).toArray(Double[]::new); + Double[] bestDataD = bests.stream().map(e -> Double.valueOf(e)).toArray(Double[]::new); + + // removing the starting value + bestDataD[0] = bestDataD[1]; + + double[] makespansData = Arrays.stream(makespansDataD).mapToDouble(Double::doubleValue).toArray(); + double[] bestData = Arrays.stream(bestDataD).mapToDouble(Double::doubleValue).toArray(); + + double xData[] = new double[makespansData.length]; + for (int i = 0; i < makespansData.length; xData[i] = Double.valueOf(i++)); + + final XYChart chart = new XYChartBuilder().width(600).height(400).title("Area Chart").xAxisTitle("X").yAxisTitle("Y").build(); + + chart.addSeries("a", xData, makespansData); + chart.addSeries("b", xData, bestData); + + new SwingWrapper(chart).displayChart(); + return bestRO.toSchedule(); } // used to compute the number of neighbours seen @@ -153,30 +187,31 @@ public class TabooSolver implements Solver { int indexCycle = 0; int testTurtle = 0; int testRabbit = 0; - if (historic.size() > 20) { + if (historic.size() > 50) { historic.remove(0); } - int rabbit = 2; - for (int turtle = 1; turtle < (historic.size()/2) - 1; turtle ++){ - if (historic.get(turtle) == historic.get(rabbit)){ + int rabbit = 0; + for (int turtle = 1; turtle < (historic.size()/2); turtle ++){ + rabbit = 2*turtle; + if (historic.get(turtle).equals(historic.get(rabbit))){ indexCycle = turtle; found = true; testTurtle = turtle; testRabbit = rabbit; break; } - rabbit = 2*turtle; } - if (found){ - for (int i = indexCycle; i < historic.size() - rabbit; i++) - if (historic.get(testTurtle) != historic.get(testRabbit)){ - result = false; - testTurtle ++; - testRabbit ++; + if (found && 2 * rabbit - indexCycle < historic.size()){ + for (int i = indexCycle; i < rabbit; i++) { + if (!historic.get(testTurtle).equals(historic.get(testRabbit))) { + result = false; + } + testTurtle++; + testRabbit++; } } if (result && found){ - return result; + return true; } return false; }