1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package jobshop.solvers;
-
- import jobshop.Instance;
- import jobshop.Result;
- import jobshop.encodings.ResourceOrder;
- import jobshop.encodings.Schedule;
- import jobshop.solvers.neighborhood.Neighbor;
- import jobshop.solvers.neighborhood.Neighborhood;
- import jobshop.solvers.neighborhood.Nowicki;
-
- import java.io.IOException;
- import java.nio.file.Paths;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.stream.Collectors;
-
- /** An empty shell to implement a descent solver. */
- public class DescentSolver implements Solver {
-
- final Neighborhood<ResourceOrder> neighborhood;
- final Solver baseSolver;
- int pts = 10;
-
- /** 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.
- * @param baseSolver A solver to provide the initial solution.
- */
- public DescentSolver(Neighborhood<ResourceOrder> neighborhood, Solver baseSolver) {
- this.neighborhood = neighborhood;
- this.baseSolver = baseSolver;
- }
-
- @Override
- public ArrayList<Result> solve(Instance instance, long deadline) {
- Schedule schedule = baseSolver.solve(instance, deadline).get(0).schedule.get();
- ResourceOrder resourceOrder = new ResourceOrder(schedule);
- boolean ended = false;
- int bestMakespan;
- Neighbor<ResourceOrder> bestNeighbor;
- int voisinsVisites = 0;
-
- while (!ended && deadline - System.currentTimeMillis() > 0) {
- schedule = resourceOrder.toSchedule().get();
- bestMakespan = schedule.makespan();
- bestNeighbor = null;
- List<Neighbor<ResourceOrder>> generatedNeighbors = neighborhood.generateNeighbors(resourceOrder);
- Iterator<Neighbor<ResourceOrder>> iter = generatedNeighbors.iterator();
- while (iter.hasNext()) {
- voisinsVisites++;
- Neighbor<ResourceOrder> neighbor = iter.next();
- neighbor.applyOn(resourceOrder);
- try {
- Schedule currentSchedule = resourceOrder.toSchedule().get();
- int currentMakespan = currentSchedule.makespan();
- if (currentMakespan < bestMakespan) {
- bestMakespan = currentMakespan;
- bestNeighbor = neighbor;
- }
- } catch (Exception e) {
- }
- neighbor.undoApplyOn(resourceOrder);
- }
- if (bestNeighbor == null) {
- ended = true;
- } else {
- bestNeighbor.applyOn(resourceOrder);
- }
- }
-
- Result result;
- if (ended) {
- result = new Result(instance, resourceOrder.toSchedule(), Result.ExitCause.Blocked);
- } else {
- result = new Result(instance, resourceOrder.toSchedule(), Result.ExitCause.Timeout);
- }
- result.setVoisinsVisites(voisinsVisites);
- ArrayList<Result> list = new ArrayList<>();
- int i;
- for (i=0; i<pts; i++) {
- list.add(result);
- }
- return list;
- }
-
- @Override
- public void setIterMax(int iterMax) {}
-
- @Override
- public void setpts(int pts) {this.pts = pts;}
- }
|