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

View file

@ -1,5 +1,6 @@
package com.graphhopper.jsprit.core.algorithm.recreate; 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.recreate.listener.JobInsertedListener;
import com.graphhopper.jsprit.core.algorithm.ruin.listener.RuinListener; 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;
@ -16,7 +17,7 @@ import java.util.*;
/** /**
* Created by schroeder on 07/04/16. * 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(); private final static Logger logger = LogManager.getLogger();
@ -67,29 +68,68 @@ 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){ // if(firstRuin){
firstRuin = false; // firstRuin = false;
modifiedRoutes.clear(); // modifiedRoutes.clear();
modifiedRoutes.addAll(routes); // modifiedRoutes.addAll(routes);
} // }
for(VehicleRoute route : modifiedRoutes){ for(VehicleRoute route : routes){
Break aBreak = route.getVehicle().getBreak(); 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>(); List<Break> breaks = new ArrayList<Break>();
if(!modifiedRoutes.isEmpty()) { // if(!modifiedRoutes.isEmpty()) {
for (Job j : unassignedJobs) { for (Job j : unassignedJobs) {
if (j instanceof Break) { if (j instanceof Break) {
breaks.add((Break) j); breaks.add((Break) j);
} }
} }
} // }
for(Break b : breaks){ unassignedJobs.remove(b); } for(Break b : breaks){ unassignedJobs.remove(b); }
modifiedRoutes.clear(); // modifiedRoutes.clear();
} }
@Override @Override
public void removed(Job job, VehicleRoute fromRoute) { public void removed(Job job, VehicleRoute fromRoute) {
if(fromRoute.getVehicle().getBreak() != null) modifiedRoutes.add(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) { private void addJob(TourActivity act) {
if (act instanceof JobActivity) { if (act instanceof JobActivity) {
Job job = ((JobActivity) act).getJob(); Job job = ((JobActivity) act).getJob();
if(job instanceof Service) assert !jobs.contains(job);
jobs.add(job); jobs.add(job);
} }
} }