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:
parent
4782464371
commit
c4c7de152f
3 changed files with 55 additions and 15 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue