1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

improve break-scheduling

This commit is contained in:
oblonski 2016-04-15 11:14:48 +02:00
parent 094a04c2ce
commit 4782464371

View file

@ -8,6 +8,8 @@ import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
import com.graphhopper.jsprit.core.problem.job.Break; import com.graphhopper.jsprit.core.problem.job.Break;
import com.graphhopper.jsprit.core.problem.job.Job; import com.graphhopper.jsprit.core.problem.job.Job;
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.*; import java.util.*;
@ -16,6 +18,8 @@ import java.util.*;
*/ */
public class BreakScheduling implements JobInsertedListener, RuinListener { public class BreakScheduling implements JobInsertedListener, RuinListener {
private final static Logger logger = LogManager.getLogger();
private final StateManager stateManager; private final StateManager stateManager;
private final BreakInsertionCalculator breakInsertionCalculator; private final BreakInsertionCalculator breakInsertionCalculator;
@ -24,6 +28,8 @@ public class BreakScheduling implements JobInsertedListener, RuinListener {
private Set<VehicleRoute> modifiedRoutes = new HashSet<VehicleRoute>(); private Set<VehicleRoute> modifiedRoutes = new HashSet<VehicleRoute>();
private boolean firstRuin = true;
public BreakScheduling(VehicleRoutingProblem vrp, StateManager stateManager, ConstraintManager constraintManager) { public BreakScheduling(VehicleRoutingProblem vrp, StateManager stateManager, ConstraintManager constraintManager) {
this.stateManager = stateManager; this.stateManager = stateManager;
this.breakInsertionCalculator = new BreakInsertionCalculator(vrp.getTransportCosts(),vrp.getActivityCosts(),new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(),vrp.getActivityCosts(),stateManager),constraintManager); this.breakInsertionCalculator = new BreakInsertionCalculator(vrp.getTransportCosts(),vrp.getActivityCosts(),new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(),vrp.getActivityCosts(),stateManager),constraintManager);
@ -37,12 +43,14 @@ public class BreakScheduling implements JobInsertedListener, RuinListener {
if(aBreak != null){ if(aBreak != null){
boolean removed = inRoute.getTourActivities().removeJob(aBreak); boolean removed = inRoute.getTourActivities().removeJob(aBreak);
if(removed){ if(removed){
logger.trace("ruin: {}", aBreak.getId());
stateManager.removed(aBreak,inRoute); stateManager.removed(aBreak,inRoute);
stateManager.reCalculateStates(inRoute); stateManager.reCalculateStates(inRoute);
} }
if(inRoute.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ if(inRoute.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){
InsertionData iData = breakInsertionCalculator.getInsertionData(inRoute, aBreak, inRoute.getVehicle(), inRoute.getDepartureTime(), inRoute.getDriver(), Double.MAX_VALUE); InsertionData iData = breakInsertionCalculator.getInsertionData(inRoute, aBreak, inRoute.getVehicle(), inRoute.getDepartureTime(), inRoute.getDriver(), Double.MAX_VALUE);
if(!(iData instanceof InsertionData.NoInsertionFound)){ if(!(iData instanceof InsertionData.NoInsertionFound)){
logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData);
for(Event e : iData.getEvents()){ for(Event e : iData.getEvents()){
eventListeners.inform(e); eventListeners.inform(e);
} }
@ -59,6 +67,11 @@ public class BreakScheduling implements JobInsertedListener, RuinListener {
@Override @Override
public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) { public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) {
if(firstRuin){
firstRuin = false;
modifiedRoutes.clear();
modifiedRoutes.addAll(routes);
}
for(VehicleRoute route : modifiedRoutes){ for(VehicleRoute route : modifiedRoutes){
Break aBreak = route.getVehicle().getBreak(); Break aBreak = route.getVehicle().getBreak();
route.getTourActivities().removeJob(aBreak); route.getTourActivities().removeJob(aBreak);