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:
parent
2b43b54abb
commit
229577dd43
3 changed files with 42 additions and 8 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm.recreate;
|
package com.graphhopper.jsprit.core.algorithm.recreate;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.recreate.listener.JobInsertedListener;
|
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.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
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.job.Job;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by schroeder on 07/04/16.
|
* Created by schroeder on 07/04/16.
|
||||||
*/
|
*/
|
||||||
public class BreakScheduling implements JobInsertedListener {
|
public class BreakScheduling implements JobInsertedListener, RuinListener {
|
||||||
|
|
||||||
private final StateManager stateManager;
|
private final StateManager stateManager;
|
||||||
|
|
||||||
|
|
@ -19,6 +22,8 @@ public class BreakScheduling implements JobInsertedListener {
|
||||||
|
|
||||||
private final EventListeners eventListeners;
|
private final EventListeners eventListeners;
|
||||||
|
|
||||||
|
private Set<VehicleRoute> modifiedRoutes = new HashSet<VehicleRoute>();
|
||||||
|
|
||||||
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);
|
||||||
|
|
@ -29,11 +34,13 @@ public class BreakScheduling implements JobInsertedListener {
|
||||||
@Override
|
@Override
|
||||||
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
|
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
|
||||||
Break aBreak = inRoute.getVehicle().getBreak();
|
Break aBreak = inRoute.getVehicle().getBreak();
|
||||||
|
// if(job2insert == aBreak) return;
|
||||||
if(aBreak != null){
|
if(aBreak != null){
|
||||||
boolean removed = inRoute.getTourActivities().removeJob(aBreak);
|
boolean removed = inRoute.getTourActivities().removeJob(aBreak);
|
||||||
if(removed){
|
if(removed){
|
||||||
stateManager.removed(aBreak,inRoute);
|
stateManager.removed(aBreak,inRoute);
|
||||||
stateManager.reCalculateStates(inRoute);
|
stateManager.reCalculateStates(inRoute);
|
||||||
|
//updateRoute --> alles wichtiges states
|
||||||
}
|
}
|
||||||
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);
|
||||||
|
|
@ -41,7 +48,8 @@ public class BreakScheduling implements JobInsertedListener {
|
||||||
for(Event e : iData.getEvents()){
|
for(Event e : iData.getEvents()){
|
||||||
eventListeners.inform(e);
|
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<VehicleRoute> routes) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) {
|
||||||
|
for(VehicleRoute route : modifiedRoutes){
|
||||||
|
Break aBreak = route.getVehicle().getBreak();
|
||||||
|
route.getTourActivities().removeJob(aBreak);
|
||||||
|
}
|
||||||
|
List<Break> breaks = new ArrayList<Break>();
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -576,12 +576,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reCalculateStates(VehicleRoute route){
|
public void reCalculateStates(VehicleRoute route){
|
||||||
insertionListeners.informInsertionStarts(Arrays.asList(route), Collections.<Job>emptyList());
|
informInsertionStarts(Arrays.asList(route),Collections.<Job>emptyList());
|
||||||
for (RouteVisitor v : routeVisitors) {
|
|
||||||
v.visit(route);
|
|
||||||
}
|
|
||||||
routeActivityVisitor.visit(route);
|
|
||||||
revRouteActivityVisitor.visit(route);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -113,5 +113,9 @@ class UpdateLoads implements ActivityVisitor, StateUpdater, InsertionStartsListe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void informRouteChanged(VehicleRoute route){
|
||||||
|
insertionStarts(route);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue