mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
improve break scheduling - related to #228
This commit is contained in:
parent
dda9fa949d
commit
70da6130e1
5 changed files with 68 additions and 4 deletions
|
|
@ -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())));
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
|
||||
clear();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue