diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/box/Jsprit.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/box/Jsprit.java index e1fce637..6c056e74 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/box/Jsprit.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/box/Jsprit.java @@ -557,7 +557,8 @@ public class Jsprit { vra.addListener(noiseConfigurator); vra.addListener(noise); vra.addListener(clusters); - vra.addListener(new RuinBreaks()); + vra.addListener(new BreakScheduling(vrp,stateManager,constraintManager)); +// vra.addListener(new RuinBreaks()); handleExecutorShutdown(vra); vra.setMaxIterations(Integer.valueOf(properties.getProperty(Parameter.ITERATIONS.toString()))); diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BestInsertion.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BestInsertion.java index 79c12d25..17c7d56a 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BestInsertion.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BestInsertion.java @@ -88,6 +88,7 @@ public final class BestInsertion extends AbstractInsertionStrategy { } if (bestInsertion == null) badJobs.add(unassignedJob); else insertJob(unassignedJob, bestInsertion.getInsertionData(), bestInsertion.getRoute()); +// nextInsertion(); } return badJobs; } 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 new file mode 100644 index 00000000..f586365c --- /dev/null +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java @@ -0,0 +1,52 @@ +package com.graphhopper.jsprit.core.algorithm.recreate; + +import com.graphhopper.jsprit.core.algorithm.recreate.listener.JobInsertedListener; +import com.graphhopper.jsprit.core.algorithm.state.StateManager; +import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; +import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager; +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; + +/** + * Created by schroeder on 07/04/16. + */ +public class BreakScheduling implements JobInsertedListener { + + private final StateManager stateManager; + + private final BreakInsertionCalculator breakInsertionCalculator; + + private final EventListeners eventListeners; + + 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); + this.breakInsertionCalculator.setJobActivityFactory(vrp.getJobActivityFactory()); + eventListeners = new EventListeners(); + } + + @Override + public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { + Break aBreak = inRoute.getVehicle().getBreak(); + if(aBreak != null){ + boolean removed = inRoute.getTourActivities().removeJob(aBreak); + if(removed){ + stateManager.removed(aBreak,inRoute); + stateManager.reCalculateStates(inRoute); + } + if(inRoute.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ + InsertionData iData = breakInsertionCalculator.getInsertionData(inRoute, aBreak, inRoute.getVehicle(), inRoute.getDepartureTime(), inRoute.getDriver(), Double.MAX_VALUE); + if(!(iData instanceof InsertionData.NoInsertionFound)){ + for(Event e : iData.getEvents()){ + eventListeners.inform(e); + } + stateManager.reCalculateStates(inRoute); + } + } + + + } + } + +} 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 3502bb2c..c72de28c 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 @@ -575,6 +575,15 @@ 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); + } + @Override public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection solutions) { clear(); diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateFutureWaitingTimes.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateFutureWaitingTimes.java index f90e3942..60bcfc1e 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateFutureWaitingTimes.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateFutureWaitingTimes.java @@ -18,6 +18,7 @@ package com.graphhopper.jsprit.core.algorithm.state; import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingTransportCosts; import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; +import com.graphhopper.jsprit.core.problem.solution.route.activity.BreakActivity; import com.graphhopper.jsprit.core.problem.solution.route.activity.ReverseActivityVisitor; import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity; @@ -51,9 +52,9 @@ public class UpdateFutureWaitingTimes implements ReverseActivityVisitor, StateUp @Override public void visit(TourActivity activity) { states.putInternalTypedActivityState(activity, route.getVehicle(), InternalStates.FUTURE_WAITING, futureWaiting); -// if(!(activity instanceof BreakActivity)) { - futureWaiting += Math.max(activity.getTheoreticalEarliestOperationStartTime() - activity.getArrTime(), 0); -// } + if(!(activity instanceof BreakActivity)) { + futureWaiting += Math.max(activity.getTheoreticalEarliestOperationStartTime() - activity.getArrTime(), 0); + } } @Override