diff --git a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/AlgorithmEventsRecorder.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/AlgorithmEventsRecorder.java index 7541c595..e90ff380 100644 --- a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/AlgorithmEventsRecorder.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/AlgorithmEventsRecorder.java @@ -124,10 +124,17 @@ public class AlgorithmEventsRecorder implements RuinListener, IterationStartsLis public void ruinStarts(Collection routes) { if(!record()) return; fileSink.stepBegins(graph.getId(),0,BEFORE_RUIN_RENDER_SOLUTION); + markAllNodesAsInserted(); addRoutes(routes); fileSink.stepBegins(graph.getId(),0,RUIN); } + private void markAllNodesAsInserted() { + for(Job j : vrp.getJobs().values()){ + markInserted(j); + } + } + private void addRoutes(Collection routes) { for(VehicleRoute route : routes){ String prevNode = makeStartId(route.getVehicle()); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java index d9886b73..36df5d2f 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java @@ -473,8 +473,8 @@ public class VehicleRoutingAlgorithms { stateManager.updateSkillStates(); stateManager.addStateUpdater(new UpdateEndLocationIfRouteIsOpen()); stateManager.addStateUpdater(new OpenRouteStateVerifier()); - stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts())); - stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); +// stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts())); +// stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); /* * define constraints diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java index 44840401..c276c0e3 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java @@ -83,6 +83,13 @@ public class RegretInsertion extends AbstractInsertionStrategy { } } + static class BadJob extends ScoredJob { + + BadJob(Job job) { + super(job, 0., null, null, false); + } + } + /** * Scorer to include other impacts on score such as time-window length or distance to depot. * @@ -216,25 +223,24 @@ public class RegretInsertion extends AbstractInsertionStrategy { while (!jobs.isEmpty()) { List unassignedJobList = new ArrayList(jobs); - ScoredJob bestScoredJob = nextJob(routes, unassignedJobList); - Job handledJob; - if(bestScoredJob == null){ - handledJob = unassignedJobList.get(0); - badJobs.add(handledJob); - } - else { + List badJobList = new ArrayList(); + ScoredJob bestScoredJob = nextJob(routes, unassignedJobList, badJobList); + if(bestScoredJob != null){ if(bestScoredJob.isNewRoute()){ routes.add(bestScoredJob.getRoute()); } insertJob(bestScoredJob.getJob(),bestScoredJob.getInsertionData(),bestScoredJob.getRoute()); - handledJob = bestScoredJob.getJob(); + jobs.remove(bestScoredJob.getJob()); + } + for(Job bad : badJobList) { + jobs.remove(bad); + badJobs.add(bad); } - jobs.remove(handledJob); } return badJobs; } - private ScoredJob nextJob(Collection routes, List unassignedJobList) { + private ScoredJob nextJob(Collection routes, List unassignedJobList, List badJobs) { ScoredJob bestScoredJob = null; double bestScore = -1 * Double.MAX_VALUE; @@ -277,7 +283,10 @@ public class RegretInsertion extends AbstractInsertionStrategy { secondBest = iData; } } - + if(best == null){ + badJobs.add(unassignedJob); + continue; + } double score = score(unassignedJob, best, secondBest); if (score > bestScore) { if(bestRoute == emptyRoute){ @@ -292,9 +301,6 @@ public class RegretInsertion extends AbstractInsertionStrategy { private double score(Job unassignedJob, InsertionData best, InsertionData secondBest) { - if(best == null){ - throw new IllegalStateException("cannot insert job " + unassignedJob.getId()); - } double score; if(secondBest == null){ score = best.getInsertionCost() + scoringFunction.score(best,unassignedJob); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java index eeffe4fe..8c8f31dc 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java @@ -93,25 +93,24 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { while (!jobs.isEmpty()) { List unassignedJobList = new ArrayList(jobs); - ScoredJob bestScoredJob = nextJob(routes, unassignedJobList); - Job handledJob; - if(bestScoredJob == null){ - handledJob = unassignedJobList.get(0); - badJobs.add(handledJob); - } - else { + List badJobList = new ArrayList(); + ScoredJob bestScoredJob = nextJob(routes, unassignedJobList, badJobList); + if(bestScoredJob != null){ if(bestScoredJob.isNewRoute()){ routes.add(bestScoredJob.getRoute()); } insertJob(bestScoredJob.getJob(),bestScoredJob.getInsertionData(),bestScoredJob.getRoute()); - handledJob = bestScoredJob.getJob(); + jobs.remove(bestScoredJob.getJob()); + } + for(Job j : badJobList) { + jobs.remove(j); + badJobs.add(j); } - jobs.remove(handledJob); } return badJobs; } - private ScoredJob nextJob(final Collection routes, List unassignedJobList) { + private ScoredJob nextJob(final Collection routes, List unassignedJobList, List badJobList) { ScoredJob bestScoredJob = null; for (final Job unassignedJob : unassignedJobList) { @@ -129,7 +128,8 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { for(int i=0; i < unassignedJobList.size(); i++){ Future fsj = completionService.take(); ScoredJob sJob = fsj.get(); - if(sJob == null){ + if(sJob instanceof RegretInsertion.BadJob){ + badJobList.add(sJob.getJob()); continue; } if(bestScoredJob == null){ @@ -191,7 +191,9 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { secondBest = iData; } } - + if(best == null){ + return new RegretInsertion.BadJob(unassignedJob); + } double score = score(unassignedJob, best, secondBest); ScoredJob scoredJob; if(bestRoute == emptyRoute){ diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java index b2f8fb75..daf1e99c 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/StateManager.java @@ -46,7 +46,6 @@ import java.util.*; */ public class StateManager implements RouteAndActivityStateGetter, IterationStartsListener, RuinListener, InsertionStartsListener, JobInsertedListener, InsertionEndsListener { - static class States_ { private Map states = new HashMap(); @@ -104,10 +103,6 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart private Object[][][] vehicle_dependent_activity_states; -// private Object[][] route_states; -// -// private Object[][][] vehicle_dependent_route_states; - private Map route_state_map; private Map vehicle_dependent_route_state_map; @@ -496,6 +491,10 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart updaters.add(updater); } + public void addAllStateUpdater(Collection updaters){ + for(StateUpdater u : updaters) addStateUpdater(u); + } + /** * Returns an unmodifiable collections of stateUpdaters that have been added to this stateManager. * @@ -618,5 +617,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart addActivityVisitor(new UpdateSkills(this)); } - + public void addCoreUpdater(){ + + } }