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

Merge branch 'BreakScheduling'

This commit is contained in:
oblonski 2016-04-08 15:18:06 +02:00
commit 2b43b54abb
5 changed files with 68 additions and 4 deletions

View file

@ -557,7 +557,8 @@ public class Jsprit {
vra.addListener(noiseConfigurator); vra.addListener(noiseConfigurator);
vra.addListener(noise); vra.addListener(noise);
vra.addListener(clusters); vra.addListener(clusters);
vra.addListener(new RuinBreaks()); vra.addListener(new BreakScheduling(vrp,stateManager,constraintManager));
// vra.addListener(new RuinBreaks());
handleExecutorShutdown(vra); handleExecutorShutdown(vra);
vra.setMaxIterations(Integer.valueOf(properties.getProperty(Parameter.ITERATIONS.toString()))); vra.setMaxIterations(Integer.valueOf(properties.getProperty(Parameter.ITERATIONS.toString())));

View file

@ -88,6 +88,7 @@ public final class BestInsertion extends AbstractInsertionStrategy {
} }
if (bestInsertion == null) badJobs.add(unassignedJob); if (bestInsertion == null) badJobs.add(unassignedJob);
else insertJob(unassignedJob, bestInsertion.getInsertionData(), bestInsertion.getRoute()); else insertJob(unassignedJob, bestInsertion.getInsertionData(), bestInsertion.getRoute());
// nextInsertion();
} }
return badJobs; return badJobs;
} }

View file

@ -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);
}
}
}
}
}

View file

@ -575,6 +575,15 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart
} }
} }
public void reCalculateStates(VehicleRoute route){
insertionListeners.informInsertionStarts(Arrays.asList(route), Collections.<Job>emptyList());
for (RouteVisitor v : routeVisitors) {
v.visit(route);
}
routeActivityVisitor.visit(route);
revRouteActivityVisitor.visit(route);
}
@Override @Override
public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) { public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
clear(); clear();

View file

@ -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.cost.VehicleRoutingTransportCosts;
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; 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.ReverseActivityVisitor;
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity; import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
@ -51,9 +52,9 @@ public class UpdateFutureWaitingTimes implements ReverseActivityVisitor, StateUp
@Override @Override
public void visit(TourActivity activity) { public void visit(TourActivity activity) {
states.putInternalTypedActivityState(activity, route.getVehicle(), InternalStates.FUTURE_WAITING, futureWaiting); states.putInternalTypedActivityState(activity, route.getVehicle(), InternalStates.FUTURE_WAITING, futureWaiting);
// if(!(activity instanceof BreakActivity)) { if(!(activity instanceof BreakActivity)) {
futureWaiting += Math.max(activity.getTheoreticalEarliestOperationStartTime() - activity.getArrTime(), 0); futureWaiting += Math.max(activity.getTheoreticalEarliestOperationStartTime() - activity.getArrTime(), 0);
// } }
} }
@Override @Override