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 f586365c..c1f21907 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,6 +1,7 @@ package com.graphhopper.jsprit.core.algorithm.recreate; 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; import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager; @@ -8,10 +9,12 @@ import com.graphhopper.jsprit.core.problem.job.Break; import com.graphhopper.jsprit.core.problem.job.Job; import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; +import java.util.*; + /** * Created by schroeder on 07/04/16. */ -public class BreakScheduling implements JobInsertedListener { +public class BreakScheduling implements JobInsertedListener, RuinListener { private final StateManager stateManager; @@ -19,6 +22,8 @@ public class BreakScheduling implements JobInsertedListener { private final EventListeners eventListeners; + private Set modifiedRoutes = new HashSet(); + public BreakScheduling(VehicleRoutingProblem vrp, StateManager stateManager, ConstraintManager constraintManager) { this.stateManager = stateManager; this.breakInsertionCalculator = new BreakInsertionCalculator(vrp.getTransportCosts(),vrp.getActivityCosts(),new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(),vrp.getActivityCosts(),stateManager),constraintManager); @@ -29,11 +34,13 @@ public class BreakScheduling implements JobInsertedListener { @Override public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { Break aBreak = inRoute.getVehicle().getBreak(); +// if(job2insert == aBreak) return; if(aBreak != null){ boolean removed = inRoute.getTourActivities().removeJob(aBreak); if(removed){ stateManager.removed(aBreak,inRoute); stateManager.reCalculateStates(inRoute); + //updateRoute --> alles wichtiges states } if(inRoute.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(inRoute, aBreak, inRoute.getVehicle(), inRoute.getDepartureTime(), inRoute.getDriver(), Double.MAX_VALUE); @@ -41,7 +48,8 @@ public class BreakScheduling implements JobInsertedListener { for(Event e : iData.getEvents()){ eventListeners.inform(e); } - stateManager.reCalculateStates(inRoute); + //inform job inserted + stateManager.informJobInserted(aBreak,inRoute,0,0); } } @@ -49,4 +57,31 @@ public class BreakScheduling implements JobInsertedListener { } } + @Override + public void ruinStarts(Collection routes) { + + } + + @Override + public void ruinEnds(Collection routes, Collection unassignedJobs) { + for(VehicleRoute route : modifiedRoutes){ + Break aBreak = route.getVehicle().getBreak(); + route.getTourActivities().removeJob(aBreak); + } + List breaks = new ArrayList(); + if(!modifiedRoutes.isEmpty()) { + for (Job j : unassignedJobs) { + if (j instanceof Break) { + breaks.add((Break) j); + } + } + } + for(Break b : breaks){ unassignedJobs.remove(b); } + modifiedRoutes.clear(); + } + + @Override + public void removed(Job job, VehicleRoute fromRoute) { + if(fromRoute.getVehicle().getBreak() != null) modifiedRoutes.add(fromRoute); + } } diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/StateManager.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/StateManager.java index c72de28c..b89abb74 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/StateManager.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/StateManager.java @@ -576,12 +576,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart } public void reCalculateStates(VehicleRoute route){ - insertionListeners.informInsertionStarts(Arrays.asList(route), Collections.emptyList()); - for (RouteVisitor v : routeVisitors) { - v.visit(route); - } - routeActivityVisitor.visit(route); - revRouteActivityVisitor.visit(route); + informInsertionStarts(Arrays.asList(route),Collections.emptyList()); } @Override diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateLoads.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateLoads.java index 731bb0c4..2c010e21 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateLoads.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateLoads.java @@ -113,5 +113,9 @@ class UpdateLoads implements ActivityVisitor, StateUpdater, InsertionStartsListe } } + public void informRouteChanged(VehicleRoute route){ + insertionStarts(route); + } + }