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
094a04c2ce
commit
4782464371
1 changed files with 13 additions and 0 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue