No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DescentSolver.java 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package jobshop.solvers;
  2. import jobshop.Instance;
  3. import jobshop.Result;
  4. import jobshop.encodings.ResourceOrder;
  5. import jobshop.encodings.Schedule;
  6. import jobshop.solvers.neighborhood.Neighbor;
  7. import jobshop.solvers.neighborhood.Neighborhood;
  8. import jobshop.solvers.neighborhood.Nowicki;
  9. import java.io.IOException;
  10. import java.nio.file.Paths;
  11. import java.util.ArrayList;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. import java.util.stream.Collectors;
  15. /** An empty shell to implement a descent solver. */
  16. public class DescentSolver implements Solver {
  17. final Neighborhood<ResourceOrder> neighborhood;
  18. final Solver baseSolver;
  19. /** Creates a new descent solver with a given neighborhood and a solver for the initial solution.
  20. *
  21. * @param neighborhood Neighborhood object that should be used to generates neighbor solutions to the current candidate.
  22. * @param baseSolver A solver to provide the initial solution.
  23. */
  24. public DescentSolver(Neighborhood<ResourceOrder> neighborhood, Solver baseSolver) {
  25. this.neighborhood = neighborhood;
  26. this.baseSolver = baseSolver;
  27. }
  28. @Override
  29. public Result solve(Instance instance, long deadline) {
  30. Schedule schedule = baseSolver.solve(instance, deadline).schedule.get();
  31. ResourceOrder resourceOrder = new ResourceOrder(schedule);
  32. boolean ended = false;
  33. int bestMakespan;
  34. Neighbor<ResourceOrder> bestNeighbor;
  35. while (!ended) {
  36. schedule = resourceOrder.toSchedule().get();
  37. bestMakespan = schedule.makespan();
  38. bestNeighbor = null;
  39. List<Neighbor<ResourceOrder>> generatedNeighbors = neighborhood.generateNeighbors(resourceOrder);
  40. Iterator<Neighbor<ResourceOrder>> iter = generatedNeighbors.iterator();
  41. while (iter.hasNext()) {
  42. Neighbor<ResourceOrder> neighbor = iter.next();
  43. neighbor.applyOn(resourceOrder);
  44. try {
  45. Schedule currentSchedule = resourceOrder.toSchedule().get();
  46. int currentMakespan = currentSchedule.makespan();
  47. if (currentMakespan < bestMakespan) {
  48. bestMakespan = currentMakespan;
  49. bestNeighbor = neighbor;
  50. }
  51. } catch (Exception e) {
  52. }
  53. neighbor.undoApplyOn(resourceOrder);
  54. }
  55. if (bestNeighbor == null) {
  56. ended = true;
  57. } else {
  58. bestNeighbor.applyOn(resourceOrder);
  59. }
  60. }
  61. return new Result(instance, resourceOrder.toSchedule(), Result.ExitCause.ProvedOptimal);
  62. }
  63. }