From 5593671e7acb20302ef8ecdbb0fc5940d9565425 Mon Sep 17 00:00:00 2001 From: Stefan Schroeder <4sschroeder@gmail.com> Date: Fri, 10 Jan 2014 15:17:23 +0100 Subject: [PATCH] add option 'allowVehicleSwitch' it determines whether a route served by vehicle A can be taken over entirely by vehicle B. --- .../jsprit/core/algorithm/io/InsertionFactory.java | 6 +++++- .../core/algorithm/io/VehicleRoutingAlgorithms.java | 8 -------- .../core/algorithm/recreate/BestInsertionBuilder.java | 7 +++++++ .../core/algorithm/recreate/CalculatorBuilder.java | 10 +++++++++- .../VehicleTypeDependentJobInsertionCalculator.java | 4 ++-- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/io/InsertionFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/io/InsertionFactory.java index 8e358303..00a18fe3 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/io/InsertionFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/io/InsertionFactory.java @@ -95,11 +95,15 @@ class InsertionFactory { if(timeSliceString != null && neighbors != null){ iBuilder.experimentalTimeScheduler(Double.parseDouble(timeSliceString),Integer.parseInt(neighbors)); } - + String allowVehicleSwitch = config.getString("allowVehicleSwitch"); + if(allowVehicleSwitch != null){ + iBuilder.setAllowVehicleSwitch(Boolean.parseBoolean(allowVehicleSwitch)); + } if(insertionName.equals("bestInsertion")){ insertionStrategy = iBuilder.build(); } else throw new IllegalStateException("currently only 'bestInsertion' is supported"); + for(InsertionListener l : insertionListeners) insertionStrategy.addListener(l); algorithmListeners.addAll(algoListeners); 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 da80db8f..0a636235 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 @@ -857,14 +857,6 @@ public class VehicleRoutingAlgorithms { } else if(ruin_name.equals("radialRuin")){ JobDistance jobDistance = new AvgServiceAndShipmentDistance(vrp.getTransportCosts()); -// if(ruin_distance == null) jobDistance -// else { -// if(ruin_distance.equals("euclidean")){ -// jobDistance = new EuclideanServiceDistance(); -// } -// else throw new IllegalStateException("does not know ruin.distance " + ruin_distance + ". either ommit ruin.distance then the " -// + "default is used or use 'euclidean'"); -// } ruin = getRadialRuin(vrp, routeStates, definedClasses, ruinKey, shareToRuin, jobDistance); } else throw new IllegalStateException("ruin[@name] " + ruin_name + " is not known. Use either randomRuin or radialRuin."); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionBuilder.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionBuilder.java index a83634cc..7c0a1b5c 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionBuilder.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionBuilder.java @@ -43,6 +43,8 @@ public class BestInsertionBuilder { private int nNeighbors; private boolean timeScheduling=false; + + private boolean allowVehicleSwitch=true; public BestInsertionBuilder(VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, StateManager stateManager, ConstraintManager constraintManager) { super(); @@ -103,6 +105,7 @@ public class BestInsertionBuilder { if(timeScheduling){ calcBuilder.experimentalTimeScheduler(timeSlice, nNeighbors); } + calcBuilder.setAllowVehicleSwitch(allowVehicleSwitch); JobInsertionCostsCalculator jobInsertions = calcBuilder.build(); InsertionStrategy bestInsertion; if(executor == null){ @@ -130,6 +133,10 @@ public class BestInsertionBuilder { timeScheduling=true; } + public void setAllowVehicleSwitch(boolean allowVehicleSwitch) { + this.allowVehicleSwitch = allowVehicleSwitch; + } + diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java index ece96408..32ec036a 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java @@ -91,6 +91,8 @@ class CalculatorBuilder { private ActivityInsertionCostsCalculator activityInsertionCostCalculator = null; + private boolean allowVehicleSwitch = true; + /** * Constructs the builder. * @@ -297,13 +299,19 @@ class CalculatorBuilder { } private JobInsertionCostsCalculator createFinalInsertion(VehicleFleetManager fleetManager, JobInsertionCostsCalculator baseCalc, RouteAndActivityStateGetter activityStates2){ - return new VehicleTypeDependentJobInsertionCalculator(fleetManager, baseCalc); + VehicleTypeDependentJobInsertionCalculator vehicleTypeDependentJobInsertionCalculator = new VehicleTypeDependentJobInsertionCalculator(fleetManager, baseCalc); + vehicleTypeDependentJobInsertionCalculator.setVehicleSwitchAllowed(allowVehicleSwitch); + return vehicleTypeDependentJobInsertionCalculator; } public void setConstraintManager(ConstraintManager constraintManager) { this.constraintManager = constraintManager; } + public void setAllowVehicleSwitch(boolean allowVehicleSwitch) { + this.allowVehicleSwitch = allowVehicleSwitch; + } + } diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleTypeDependentJobInsertionCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleTypeDependentJobInsertionCalculator.java index b8f3418d..11be2212 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleTypeDependentJobInsertionCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/VehicleTypeDependentJobInsertionCalculator.java @@ -72,6 +72,7 @@ final class VehicleTypeDependentJobInsertionCalculator implements JobInsertionCo * @param vehicleSwitchAllowed the vehicleSwitchAllowed to set */ public void setVehicleSwitchAllowed(boolean vehicleSwitchAllowed) { + logger.info("set vehicleSwitchAllowed to " + vehicleSwitchAllowed); this.vehicleSwitchAllowed = vehicleSwitchAllowed; } @@ -87,10 +88,9 @@ final class VehicleTypeDependentJobInsertionCalculator implements JobInsertionCo relevantVehicles.addAll(fleetManager.getAvailableVehicles(selectedVehicle.getType().getTypeId(),selectedVehicle.getLocationId())); } } - else{ + else{ //if no vehicle has been assigned, i.e. it is an empty route relevantVehicles.addAll(fleetManager.getAvailableVehicles()); } - for(Vehicle v : relevantVehicles){ double depTime = v.getEarliestDeparture(); InsertionData iData = insertionCalculator.getInsertionData(currentRoute, jobToInsert, v, depTime, selectedDriver, bestKnownCost_);