diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/InsertionInitialSolutionFactory.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/InsertionInitialSolutionFactory.java index 959d8161..f2fae100 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/InsertionInitialSolutionFactory.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/InsertionInitialSolutionFactory.java @@ -25,7 +25,6 @@ import com.graphhopper.jsprit.core.problem.solution.InitialSolutionFactory; import com.graphhopper.jsprit.core.problem.solution.SolutionCostCalculator; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; -import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -62,9 +61,9 @@ public final class InsertionInitialSolutionFactory implements InitialSolutionFac private List getUnassignedJobs(VehicleRoutingProblem vrp) { ArrayList jobs = new ArrayList(vrp.getJobs().values()); - for (Vehicle v : vrp.getVehicles()) { - if (v.getBreak() != null) jobs.add(v.getBreak()); - } +// for (Vehicle v : vrp.getVehicles()) { +// if (v.getBreak() != null) jobs.add(v.getBreak()); +// } return jobs; } diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java index 2814c1a2..4513ac02 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java @@ -1,5 +1,6 @@ package com.graphhopper.jsprit.core.algorithm.recreate; +import com.graphhopper.jsprit.core.algorithm.recreate.listener.InsertionStartsListener; import com.graphhopper.jsprit.core.algorithm.recreate.listener.JobInsertedListener; import com.graphhopper.jsprit.core.algorithm.ruin.listener.RuinListener; import com.graphhopper.jsprit.core.algorithm.state.StateManager; @@ -16,7 +17,7 @@ import java.util.*; /** * Created by schroeder on 07/04/16. */ -public class BreakScheduling implements JobInsertedListener, RuinListener { +public class BreakScheduling implements InsertionStartsListener,JobInsertedListener, RuinListener { private final static Logger logger = LogManager.getLogger(); @@ -67,29 +68,68 @@ public class BreakScheduling implements JobInsertedListener, RuinListener { @Override public void ruinEnds(Collection routes, Collection unassignedJobs) { - if(firstRuin){ - firstRuin = false; - modifiedRoutes.clear(); - modifiedRoutes.addAll(routes); - } - for(VehicleRoute route : modifiedRoutes){ +// if(firstRuin){ +// firstRuin = false; +// modifiedRoutes.clear(); +// modifiedRoutes.addAll(routes); +// } + for(VehicleRoute route : routes){ Break aBreak = route.getVehicle().getBreak(); - route.getTourActivities().removeJob(aBreak); + boolean removed = route.getTourActivities().removeJob(aBreak); + if(removed) logger.trace("ruin: {}", aBreak.getId()); } List breaks = new ArrayList(); - if(!modifiedRoutes.isEmpty()) { +// if(!modifiedRoutes.isEmpty()) { for (Job j : unassignedJobs) { if (j instanceof Break) { breaks.add((Break) j); } } - } +// } for(Break b : breaks){ unassignedJobs.remove(b); } - modifiedRoutes.clear(); +// modifiedRoutes.clear(); } @Override public void removed(Job job, VehicleRoute fromRoute) { if(fromRoute.getVehicle().getBreak() != null) modifiedRoutes.add(fromRoute); } + + @Override + public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) { + for(VehicleRoute route : vehicleRoutes){ + Break aBreak = route.getVehicle().getBreak(); + if(aBreak != null && !route.getTourActivities().servesJob(aBreak)){ + if(route.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ + InsertionData iData = breakInsertionCalculator.getInsertionData(route, aBreak, route.getVehicle(), route.getDepartureTime(), route.getDriver(), Double.MAX_VALUE); + if(!(iData instanceof InsertionData.NoInsertionFound)){ + logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); + for(Event e : iData.getEvents()){ + eventListeners.inform(e); + } + stateManager.informJobInserted(aBreak,route,0,0); + } + } + } +// if(aBreak != null){ +// boolean removed = route.getTourActivities().removeJob(aBreak); +// if(removed){ +// logger.trace("ruin: {}", aBreak.getId()); +// stateManager.removed(aBreak,route); +// stateManager.reCalculateStates(route); +// } +// if(route.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ +// InsertionData iData = breakInsertionCalculator.getInsertionData(route, aBreak, route.getVehicle(), route.getDepartureTime(), route.getDriver(), Double.MAX_VALUE); +// if(!(iData instanceof InsertionData.NoInsertionFound)){ +// logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); +// for(Event e : iData.getEvents()){ +// eventListeners.inform(e); +// } +// stateManager.informJobInserted(aBreak,route,0,0); +// } +// } +// } + } + + } } diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/solution/route/activity/TourActivities.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/solution/route/activity/TourActivities.java index 530e6ea0..ff2f8e1d 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/solution/route/activity/TourActivities.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/solution/route/activity/TourActivities.java @@ -226,6 +226,7 @@ public class TourActivities { private void addJob(TourActivity act) { if (act instanceof JobActivity) { Job job = ((JobActivity) act).getJob(); + if(job instanceof Service) assert !jobs.contains(job); jobs.add(job); } }