From 093baf1abef889f5121eeed57b8e6e4533a277db Mon Sep 17 00:00:00 2001 From: oblonski Date: Thu, 15 Oct 2015 18:12:54 +0200 Subject: [PATCH] speed up regret insertion --- .../recreate/InsertionDataUpdater.java | 10 +++-- .../algorithm/recreate/RegretInsertion.java | 37 ++++++++++++++----- .../recreate/RegretInsertionConcurrent.java | 22 ++++++++++- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionDataUpdater.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionDataUpdater.java index ffc63cdf..e056fb42 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionDataUpdater.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionDataUpdater.java @@ -13,12 +13,12 @@ import java.util.*; */ class InsertionDataUpdater { - static boolean update(VehicleFleetManager fleetManager, JobInsertionCostsCalculator insertionCostsCalculator, TreeSet insertionDataSet, int updateRound, Job unassignedJob, Collection routes) { + static boolean update(boolean addAllAvailable, Set initialVehicleIds, VehicleFleetManager fleetManager, JobInsertionCostsCalculator insertionCostsCalculator, TreeSet insertionDataSet, int updateRound, Job unassignedJob, Collection routes) { for(VehicleRoute route : routes) { Collection relevantVehicles = new ArrayList(); if (!(route.getVehicle() instanceof VehicleImpl.NoVehicle)) { relevantVehicles.add(route.getVehicle()); - relevantVehicles.addAll(fleetManager.getAvailableVehicles(route.getVehicle())); + if(addAllAvailable && initialVehicleIds.contains(route.getVehicle().getId())) relevantVehicles.addAll(fleetManager.getAvailableVehicles(route.getVehicle())); } else relevantVehicles.addAll(fleetManager.getAvailableVehicles()); for (Vehicle v : relevantVehicles) { double depTime = v.getEarliestDeparture(); @@ -32,6 +32,8 @@ class InsertionDataUpdater { return true; } + + static VehicleRoute findRoute(Collection routes, Job job) { for(VehicleRoute r : routes){ if(r.getVehicle().getBreak() == job) return r; @@ -49,7 +51,7 @@ class InsertionDataUpdater { }; } - static ScoredJob getBest(VehicleFleetManager fleetManager, JobInsertionCostsCalculator insertionCostsCalculator, ScoringFunction scoringFunction, TreeSet[] priorityQueues, Map updates, List unassignedJobList, List badJobs) { + static ScoredJob getBest(boolean switchAllowed, Set initialVehicleIds, VehicleFleetManager fleetManager, JobInsertionCostsCalculator insertionCostsCalculator, ScoringFunction scoringFunction, TreeSet[] priorityQueues, Map updates, List unassignedJobList, List badJobs) { ScoredJob bestScoredJob = null; for(Job j : unassignedJobList){ VehicleRoute bestRoute = null; @@ -65,6 +67,8 @@ class InsertionDataUpdater { } } if(versionedIData.getiData() instanceof InsertionData.NoInsertionFound) continue; + if(versionedIData.getiData().getSelectedVehicle() != versionedIData.getRoute().getVehicle() && !switchAllowed) continue; + if(versionedIData.getiData().getSelectedVehicle() != versionedIData.getRoute().getVehicle() && initialVehicleIds.contains(versionedIData.getRoute().getVehicle().getId())) continue; if(versionedIData.getiData().getSelectedVehicle() != versionedIData.getRoute().getVehicle()) { if (fleetManager.isLocked(versionedIData.getiData().getSelectedVehicle())) { Vehicle available = fleetManager.getAvailableVehicle(versionedIData.getiData().getSelectedVehicle().getVehicleTypeIdentifier()); 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 48771a41..624ddbb4 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 @@ -47,6 +47,22 @@ public class RegretInsertion extends AbstractInsertionStrategy { private VehicleFleetManager fleetManager; + private Set initialVehicleIds; + + private boolean switchAllowed = true; + + + + public RegretInsertion(JobInsertionCostsCalculator jobInsertionCalculator, VehicleRoutingProblem vehicleRoutingProblem, VehicleFleetManager fleetManager) { + super(vehicleRoutingProblem); + this.scoringFunction = new DefaultScorer(vehicleRoutingProblem); + this.insertionCostsCalculator = jobInsertionCalculator; + this.fleetManager = fleetManager; + this.vrp = vehicleRoutingProblem; + this.initialVehicleIds = getInitialVehicleIds(vehicleRoutingProblem); + logger.debug("initialise {}", this); + } + /** * Sets the scoring function. *

@@ -58,13 +74,16 @@ public class RegretInsertion extends AbstractInsertionStrategy { this.scoringFunction = scoringFunction; } - public RegretInsertion(JobInsertionCostsCalculator jobInsertionCalculator, VehicleRoutingProblem vehicleRoutingProblem, VehicleFleetManager fleetManager) { - super(vehicleRoutingProblem); - this.scoringFunction = new DefaultScorer(vehicleRoutingProblem); - this.insertionCostsCalculator = jobInsertionCalculator; - this.fleetManager = fleetManager; - this.vrp = vehicleRoutingProblem; - logger.debug("initialise {}", this); + public void setSwitchAllowed(boolean switchAllowed) { + this.switchAllowed = switchAllowed; + } + + private Set getInitialVehicleIds(VehicleRoutingProblem vehicleRoutingProblem) { + Set ids = new HashSet(); + for(VehicleRoute r : vehicleRoutingProblem.getInitialVehicleRoutes()){ + ids.add(r.getVehicle().getId()); + } + return ids; } @Override @@ -122,7 +141,7 @@ public class RegretInsertion extends AbstractInsertionStrategy { updates.put(lastModified,updateRound); } updateRound++; - ScoredJob bestScoredJob = InsertionDataUpdater.getBest(fleetManager,insertionCostsCalculator,scoringFunction,priorityQueues,updates,unassignedJobList,badJobList); + ScoredJob bestScoredJob = InsertionDataUpdater.getBest(switchAllowed,initialVehicleIds,fleetManager,insertionCostsCalculator,scoringFunction,priorityQueues,updates,unassignedJobList,badJobList); if (bestScoredJob != null) { if (bestScoredJob.isNewRoute()) { routes.add(bestScoredJob.getRoute()); @@ -145,7 +164,7 @@ public class RegretInsertion extends AbstractInsertionStrategy { if(priorityQueues[unassignedJob.getIndex()] == null){ priorityQueues[unassignedJob.getIndex()] = new TreeSet(InsertionDataUpdater.getComparator()); } - InsertionDataUpdater.update(fleetManager,insertionCostsCalculator, priorityQueues[unassignedJob.getIndex()], updateRound, unassignedJob, routes); + InsertionDataUpdater.update(switchAllowed, initialVehicleIds,fleetManager,insertionCostsCalculator, priorityQueues[unassignedJob.getIndex()], updateRound, unassignedJob, routes); } } 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 9bc33503..eb80e67d 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 @@ -53,6 +53,11 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { private VehicleFleetManager fleetManager; + private Set initialVehicleIds; + + private boolean switchAllowed = true; + + /** * Sets the scoring function. *

@@ -71,6 +76,7 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { this.vrp = vehicleRoutingProblem; this.executor = executorService; this.fleetManager = fleetManager; + this.initialVehicleIds = getInitialVehicleIds(vehicleRoutingProblem); logger.debug("initialise " + this); } @@ -79,6 +85,18 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { return "[name=regretInsertion][additionalScorer=" + scoringFunction + "]"; } + public void setSwitchAllowed(boolean switchAllowed) { + this.switchAllowed = switchAllowed; + } + + private Set getInitialVehicleIds(VehicleRoutingProblem vehicleRoutingProblem) { + Set ids = new HashSet(); + for(VehicleRoute r : vehicleRoutingProblem.getInitialVehicleRoutes()){ + ids.add(r.getVehicle().getId()); + } + return ids; + } + /** * Runs insertion. @@ -131,7 +149,7 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { updates.put(lastModified,updateRound); } updateRound++; - ScoredJob bestScoredJob = InsertionDataUpdater.getBest(fleetManager, insertionCostsCalculator, scoringFunction, priorityQueues, updates, unassignedJobList, badJobList); + ScoredJob bestScoredJob = InsertionDataUpdater.getBest(switchAllowed,initialVehicleIds,fleetManager, insertionCostsCalculator, scoringFunction, priorityQueues, updates, unassignedJobList, badJobList); if (bestScoredJob != null) { if (bestScoredJob.isNewRoute()) { routes.add(bestScoredJob.getRoute()); @@ -159,7 +177,7 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { tasks.add(new Callable() { @Override public Boolean call() throws Exception { - return InsertionDataUpdater.update(fleetManager, insertionCostsCalculator, priorityQueue, updateRound, unassignedJob, routes); + return InsertionDataUpdater.update(switchAllowed,initialVehicleIds,fleetManager, insertionCostsCalculator, priorityQueue, updateRound, unassignedJob, routes); } }); }