package jobshop.solvers; import jobshop.Instance; import jobshop.encodings.Schedule; import jobshop.solvers.neighborhood.Neighborhood; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; public class DescentSolverMultiStart implements Solver { final Neighborhood neighborhood; final List solvers = List.of(new GreedySolver(GreedySolver.Priority.SPT), new GreedySolver(GreedySolver.Priority.LRPT), new GreedySolver(GreedySolver.Priority.EST_SPT), new GreedySolver(GreedySolver.Priority.EST_LRPT)); public DescentSolverMultiStart(Neighborhood neighborhood) { this.neighborhood = neighborhood; } @Override public Optional solve(Instance instance, long deadline, int randomness, int randomRunNumber){ Integer best = Integer.MAX_VALUE; Schedule bestSchedule = null; // we try all greedy solvers for the starting solution for (Solver s : solvers){ System.out.println(); System.out.println("\u001b[36m" + "Trying with solver : " + s.toString() + "\u001b[0m"); DescentSolver descentSolver = new DescentSolver(neighborhood, s); Schedule solution = descentSolver.solve(instance,deadline,randomness,randomRunNumber).get(); if (solution.makespan() < best){ best = solution.makespan(); bestSchedule = solution; } } return Optional.of(bestSchedule); } }