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

refine break scheduling

This commit is contained in:
oblonski 2016-04-18 08:51:34 +02:00
parent 4782464371
commit c4c7de152f
3 changed files with 55 additions and 15 deletions

View file

@ -25,7 +25,6 @@ import com.graphhopper.jsprit.core.problem.solution.InitialSolutionFactory;
import com.graphhopper.jsprit.core.problem.solution.SolutionCostCalculator;
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -62,9 +61,9 @@ public final class InsertionInitialSolutionFactory implements InitialSolutionFac
private List<Job> getUnassignedJobs(VehicleRoutingProblem vrp) {
ArrayList<Job> jobs = new ArrayList<Job>(vrp.getJobs().values());
for (Vehicle v : vrp.getVehicles()) {
if (v.getBreak() != null) jobs.add(v.getBreak());
}
// for (Vehicle v : vrp.getVehicles()) {
// if (v.getBreak() != null) jobs.add(v.getBreak());
// }
return jobs;
}

View file

@ -1,5 +1,6 @@
package com.graphhopper.jsprit.core.algorithm.recreate;
import com.graphhopper.jsprit.core.algorithm.recreate.listener.InsertionStartsListener;
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;
@ -16,7 +17,7 @@ import java.util.*;
/**
* Created by schroeder on 07/04/16.
*/
public class BreakScheduling implements JobInsertedListener, RuinListener {
public class BreakScheduling implements InsertionStartsListener,JobInsertedListener, RuinListener {
private final static Logger logger = LogManager.getLogger();
@ -67,29 +68,68 @@ public class BreakScheduling implements JobInsertedListener, RuinListener {
@Override
public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) {
if(firstRuin){
firstRuin = false;
modifiedRoutes.clear();
modifiedRoutes.addAll(routes);
}
for(VehicleRoute route : modifiedRoutes){
// if(firstRuin){
// firstRuin = false;
// modifiedRoutes.clear();
// modifiedRoutes.addAll(routes);
// }
for(VehicleRoute route : routes){
Break aBreak = route.getVehicle().getBreak();
route.getTourActivities().removeJob(aBreak);
boolean removed = route.getTourActivities().removeJob(aBreak);
if(removed) logger.trace("ruin: {}", aBreak.getId());
}
List<Break> breaks = new ArrayList<Break>();
if(!modifiedRoutes.isEmpty()) {
// if(!modifiedRoutes.isEmpty()) {
for (Job j : unassignedJobs) {
if (j instanceof Break) {
breaks.add((Break) j);
}
}
}
// }
for(Break b : breaks){ unassignedJobs.remove(b); }
modifiedRoutes.clear();
// modifiedRoutes.clear();
}
@Override
public void removed(Job job, VehicleRoute fromRoute) {
if(fromRoute.getVehicle().getBreak() != null) modifiedRoutes.add(fromRoute);
}
@Override
public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
for(VehicleRoute route : vehicleRoutes){
Break aBreak = route.getVehicle().getBreak();
if(aBreak != null && !route.getTourActivities().servesJob(aBreak)){
if(route.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){
InsertionData iData = breakInsertionCalculator.getInsertionData(route, aBreak, route.getVehicle(), route.getDepartureTime(), route.getDriver(), Double.MAX_VALUE);
if(!(iData instanceof InsertionData.NoInsertionFound)){
logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData);
for(Event e : iData.getEvents()){
eventListeners.inform(e);
}
stateManager.informJobInserted(aBreak,route,0,0);
}
}
}
// if(aBreak != null){
// boolean removed = route.getTourActivities().removeJob(aBreak);
// if(removed){
// logger.trace("ruin: {}", aBreak.getId());
// stateManager.removed(aBreak,route);
// stateManager.reCalculateStates(route);
// }
// if(route.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){
// InsertionData iData = breakInsertionCalculator.getInsertionData(route, aBreak, route.getVehicle(), route.getDepartureTime(), route.getDriver(), Double.MAX_VALUE);
// if(!(iData instanceof InsertionData.NoInsertionFound)){
// logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData);
// for(Event e : iData.getEvents()){
// eventListeners.inform(e);
// }
// stateManager.informJobInserted(aBreak,route,0,0);
// }
// }
// }
}
}
}

View file

@ -226,6 +226,7 @@ public class TourActivities {
private void addJob(TourActivity act) {
if (act instanceof JobActivity) {
Job job = ((JobActivity) act).getJob();
if(job instanceof Service) assert !jobs.contains(job);
jobs.add(job);
}
}