From cc23fa446f4b53c26e680b7f4b088980229dec57 Mon Sep 17 00:00:00 2001 From: Stefan Schroeder <4sschroeder@gmail.com> Date: Tue, 7 Jan 2014 18:17:36 +0100 Subject: [PATCH] add option for vehicles to take over a whole route or not --- .../recreate/BestInsertionBuilder.java | 1 - ...leTypeDependentJobInsertionCalculator.java | 34 ++++++++++++++++--- .../input/algorithmConfig_open.xml | 2 +- .../jsprit/examples/BicycleMessenger.java | 12 +++---- 4 files changed, 37 insertions(+), 12 deletions(-) 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 5d115c69..a83634cc 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 @@ -53,7 +53,6 @@ public class BestInsertionBuilder { } public BestInsertionBuilder setRouteLevel(int forwardLooking, int memory){ - local = false; this.forwaredLooking = forwardLooking; this.memory = memory; 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 8065ac43..b8f3418d 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 @@ -30,8 +30,6 @@ import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; import org.apache.log4j.Logger; - - final class VehicleTypeDependentJobInsertionCalculator implements JobInsertionCostsCalculator{ private Logger logger = Logger.getLogger(VehicleTypeDependentJobInsertionCalculator.class); @@ -39,6 +37,16 @@ final class VehicleTypeDependentJobInsertionCalculator implements JobInsertionCo private final VehicleFleetManager fleetManager; private final JobInsertionCostsCalculator insertionCalculator; + + /** + * true if a vehicle(-type) is allowed to take over the whole route that was previously served by another vehicle + * + *

vehicleSwitch allowed makes sense if fleet consists of vehicles with different capacities such that one + * can start with a small vehicle, but as the number of customers grows bigger vehicles can be operated, i.e. + * bigger vehicles can take over the route that was previously served by a small vehicle. + * + */ + private boolean vehicleSwitchAllowed = false; public VehicleTypeDependentJobInsertionCalculator(final VehicleFleetManager fleetManager, final JobInsertionCostsCalculator jobInsertionCalc) { this.fleetManager = fleetManager; @@ -51,6 +59,22 @@ final class VehicleTypeDependentJobInsertionCalculator implements JobInsertionCo return "[name=vehicleTypeDependentServiceInsertion]"; } + /** + * @return the vehicleSwitchAllowed + */ + public boolean isVehicleSwitchAllowed() { + return vehicleSwitchAllowed; + } + + /** + * default is true + * + * @param vehicleSwitchAllowed the vehicleSwitchAllowed to set + */ + public void setVehicleSwitchAllowed(boolean vehicleSwitchAllowed) { + this.vehicleSwitchAllowed = vehicleSwitchAllowed; + } + public InsertionData getInsertionData(final VehicleRoute currentRoute, final Job jobToInsert, final Vehicle vehicle, double newVehicleDepartureTime, final Driver driver, final double bestKnownCost) { Vehicle selectedVehicle = currentRoute.getVehicle(); Driver selectedDriver = currentRoute.getDriver(); @@ -59,12 +83,14 @@ final class VehicleTypeDependentJobInsertionCalculator implements JobInsertionCo Collection relevantVehicles = new ArrayList(); if(!(selectedVehicle instanceof NoVehicle)) { relevantVehicles.add(selectedVehicle); - relevantVehicles.addAll(fleetManager.getAvailableVehicles(selectedVehicle.getType().getTypeId(),selectedVehicle.getLocationId())); + if(vehicleSwitchAllowed){ + relevantVehicles.addAll(fleetManager.getAvailableVehicles(selectedVehicle.getType().getTypeId(),selectedVehicle.getLocationId())); + } } else{ relevantVehicles.addAll(fleetManager.getAvailableVehicles()); } - + for(Vehicle v : relevantVehicles){ double depTime = v.getEarliestDeparture(); InsertionData iData = insertionCalculator.getInsertionData(currentRoute, jobToInsert, v, depTime, selectedDriver, bestKnownCost_); diff --git a/jsprit-examples/input/algorithmConfig_open.xml b/jsprit-examples/input/algorithmConfig_open.xml index ac8ca99d..f3defc1b 100755 --- a/jsprit-examples/input/algorithmConfig_open.xml +++ b/jsprit-examples/input/algorithmConfig_open.xml @@ -42,7 +42,7 @@ - 0.5 + 0.4 diff --git a/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java b/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java index 60f2a313..75682c34 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java +++ b/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java @@ -241,7 +241,7 @@ public class BicycleMessenger { //if you want, terminate it after 1000 iterations with no change // algorithm.setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(1000)); algorithm.addListener(new AlgorithmSearchProgressChartListener("output/progress.png")); - algorithm.setNuOfIterations(2000); + algorithm.setNuOfIterations(1000); Collection solutions = algorithm.searchSolutions(); //this is just to ensure that solution meet the above constraints @@ -256,19 +256,19 @@ public class BicycleMessenger { //and the problem as well as the solution Plotter plotter1 = new Plotter(bicycleMessengerProblem, Solutions.bestOf(solutions)); - plotter1.plotShipments(true); + plotter1.plotShipments(false); plotter1.setShowFirstActivity(true); // plotter1.setBoundingBox(5000, 45500, 25000, 66500); plotter1.plot("output/bicycleMessengerSolution.png", "bicycleMessenger"); //and write out your solution in xml - new VrpXMLWriter(bicycleMessengerProblem, solutions).write("output/bicycleMessenger.xml"); +// new VrpXMLWriter(bicycleMessengerProblem, solutions).write("output/bicycleMessenger.xml"); SolutionPrinter.print(bicycleMessengerProblem, Solutions.bestOf(solutions), Print.VERBOSE); - new GraphStreamViewer(bicycleMessengerProblem).labelWith(Label.ID).setRenderShipments(true).setRenderDelay(150).display(); - - new GraphStreamViewer(bicycleMessengerProblem, Solutions.bestOf(solutions)).setGraphStreamFrameScalingFactor(1.5).setCameraView(12500, 55000, 0.25).labelWith(Label.ACTIVITY).setRenderShipments(true).setRenderDelay(150).display(); +// new GraphStreamViewer(bicycleMessengerProblem).labelWith(Label.ID).setRenderShipments(true).setRenderDelay(150).display(); +// +// new GraphStreamViewer(bicycleMessengerProblem, Solutions.bestOf(solutions)).setGraphStreamFrameScalingFactor(1.5).setCameraView(12500, 55000, 0.25).labelWith(Label.ACTIVITY).setRenderShipments(true).setRenderDelay(150).display(); }