diff --git a/src/main/java/jobshop/Main.java b/src/main/java/jobshop/Main.java index d8d947f..fbf684f 100644 --- a/src/main/java/jobshop/Main.java +++ b/src/main/java/jobshop/Main.java @@ -34,6 +34,10 @@ public class Main { .setDefault(0) .type(Integer.class) .help("percentage of randomness in solving"); + parser.addArgument("-rn", "--randomRunNumber") + .setDefault(10) + .type(Integer.class) + .help("number of runs in random mode"); parser.addArgument("--solver") .nargs("+") .required(true) @@ -70,6 +74,7 @@ public class Main { List solvers = solversToTest.stream().map(Solver::getSolver).collect(Collectors.toList()); Integer randomness = ns.getInt("random"); + Integer randomRunNumber = ns.getInt("randomRunNumber"); // retrieve all instances on which we should run the solvers. List instances = new ArrayList<>(); @@ -125,7 +130,7 @@ public class Main { long start = System.currentTimeMillis(); long deadline = System.currentTimeMillis() + solveTimeMs; // run the solver on the current instance - Optional result = solver.solve(instance, deadline,randomness); + Optional result = solver.solve(instance, deadline,randomness,randomRunNumber); // measure elapsed time (in milliseconds) long runtime = System.currentTimeMillis() - start; diff --git a/src/main/java/jobshop/solvers/BasicSolver.java b/src/main/java/jobshop/solvers/BasicSolver.java index 1666219..3fe0b81 100644 --- a/src/main/java/jobshop/solvers/BasicSolver.java +++ b/src/main/java/jobshop/solvers/BasicSolver.java @@ -12,7 +12,7 @@ import java.util.Optional; **/ public class BasicSolver implements Solver { @Override - public Optional solve(Instance instance, long deadline, int randomness) { + public Optional solve(Instance instance, long deadline, int randomness, int randomRunNumber) { // resource order that will be populated (initially empty) ResourceOrder sol = new ResourceOrder(instance); diff --git a/src/main/java/jobshop/solvers/DescentSolver.java b/src/main/java/jobshop/solvers/DescentSolver.java index a0aa85e..a999ac5 100644 --- a/src/main/java/jobshop/solvers/DescentSolver.java +++ b/src/main/java/jobshop/solvers/DescentSolver.java @@ -23,7 +23,7 @@ public class DescentSolver implements Solver { } @Override - public Optional solve(Instance instance, long deadline, int randomness) { + public Optional solve(Instance instance, long deadline, int randomness, int randomRunNumber) { throw new UnsupportedOperationException(); } diff --git a/src/main/java/jobshop/solvers/GreedySolver.java b/src/main/java/jobshop/solvers/GreedySolver.java index 5f1f0da..118bc65 100644 --- a/src/main/java/jobshop/solvers/GreedySolver.java +++ b/src/main/java/jobshop/solvers/GreedySolver.java @@ -124,10 +124,8 @@ public class GreedySolver implements Solver { return null; } - - - @Override - public Optional solve(Instance instance, long deadline, int percentRandom) { + public Schedule solveInner(Instance instance, long deadline, int percentRandom) + { Random r = new Random(); // keeps track of the next time the machine is free @@ -168,7 +166,29 @@ public class GreedySolver implements Solver { possibleTasks.add(new Task(task.job, task.task + 1)); } } - return Optional.of(schedule); + return schedule; + } + + + + @Override + public Optional solve(Instance instance, long deadline, int percentRandom, int randomRunNumber) + { + if (percentRandom == 0) { + return Optional.of(solveInner(instance, deadline, percentRandom)); + } else { + Integer bestTime = Integer.MAX_VALUE; + Schedule bestSchedule = null; + for (int i = 0; i < randomRunNumber; i++) { + Schedule schedule = solveInner(instance, deadline, percentRandom); + System.out.println(schedule.makespan()); + if (schedule.makespan() < bestTime){ + bestTime = schedule.makespan(); + bestSchedule = schedule; + } + } + return Optional.of(bestSchedule); + } } diff --git a/src/main/java/jobshop/solvers/Solver.java b/src/main/java/jobshop/solvers/Solver.java index 7c20fb8..1d05eef 100644 --- a/src/main/java/jobshop/solvers/Solver.java +++ b/src/main/java/jobshop/solvers/Solver.java @@ -15,7 +15,7 @@ public interface Solver { * This time is in milliseconds and can be compared with System.currentTimeMilliseconds() * @return An optional schedule that will be non empty if a solution was found. */ - Optional solve(Instance instance, long deadline, int randomness); + Optional solve(Instance instance, long deadline, int randomness, int randomRunNumber); /** Static factory method to create a new solver based on its name. */ static Solver getSolver(String name) { diff --git a/src/test/java/jobshop/encodings/BasicSolverTests.java b/src/test/java/jobshop/encodings/BasicSolverTests.java index c236951..056efb6 100644 --- a/src/test/java/jobshop/encodings/BasicSolverTests.java +++ b/src/test/java/jobshop/encodings/BasicSolverTests.java @@ -16,7 +16,7 @@ public class BasicSolverTests { Instance instance = Instance.fromFile(Paths.get("instances/aaa1")); Solver solver = new BasicSolver(); - Optional result = solver.solve(instance, System.currentTimeMillis() + 10, 0); + Optional result = solver.solve(instance, System.currentTimeMillis() + 10, 0,10); assert result.isPresent() : "The solver did not find a solution"; // extract the schedule associated to the solution diff --git a/src/test/java/jobshop/encodings/ManualEncodingTests.java b/src/test/java/jobshop/encodings/ManualEncodingTests.java index defd992..8c41082 100644 --- a/src/test/java/jobshop/encodings/ManualEncodingTests.java +++ b/src/test/java/jobshop/encodings/ManualEncodingTests.java @@ -23,7 +23,7 @@ public class ManualEncodingTests { this.instance = Instance.fromFile(Paths.get("instances/aaa1")); Solver solver = new BasicSolver(); - Optional result = solver.solve(this.instance, System.currentTimeMillis() + 10,0); + Optional result = solver.solve(this.instance, System.currentTimeMillis() + 10,0, 10); assert result.isPresent() : "The solver did not find a solution"; // extract the schedule associated to the solution