From 82dd341d748a1839615c1a0d0377e5aa8802821a Mon Sep 17 00:00:00 2001 From: Stefan Schroeder <4sschroeder@gmail.com> Date: Tue, 3 Sep 2013 09:57:10 +0200 Subject: [PATCH] add examples --- .../SimplePickupAndDeliveryExample.java | 124 ++++++++++++++++++ .../examples/VRPWithBackhaulsExample2.java | 9 +- 2 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 jsprit-examples/src/main/java/examples/SimplePickupAndDeliveryExample.java diff --git a/jsprit-examples/src/main/java/examples/SimplePickupAndDeliveryExample.java b/jsprit-examples/src/main/java/examples/SimplePickupAndDeliveryExample.java new file mode 100644 index 00000000..1c397aaa --- /dev/null +++ b/jsprit-examples/src/main/java/examples/SimplePickupAndDeliveryExample.java @@ -0,0 +1,124 @@ +/******************************************************************************* + * Copyright (C) 2013 Stefan Schroeder + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributors: + * Stefan Schroeder - initial API and implementation + ******************************************************************************/ +package examples; + +import java.io.File; +import java.util.Collection; + +import util.Coordinate; +import util.Solutions; +import algorithms.SchrimpfFactory; +import analysis.Plotter; +import analysis.SolutionPlotter; +import analysis.SolutionPrinter; +import analysis.Plotter.Label; +import analysis.SolutionPrinter.Print; +import basics.Delivery; +import basics.Pickup; +import basics.Service; +import basics.VehicleRoutingAlgorithm; +import basics.VehicleRoutingProblem; +import basics.VehicleRoutingProblem.Constraint; +import basics.VehicleRoutingProblemSolution; +import basics.io.VrpXMLWriter; +import basics.route.Vehicle; +import basics.route.VehicleImpl; +import basics.route.VehicleImpl.Builder; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; + +public class SimplePickupAndDeliveryExample { + + public static void main(String[] args) { + /* + * some preparation - create output folder + */ + File dir = new File("output"); + // if the directory does not exist, create it + if (!dir.exists()){ + System.out.println("creating directory ./output"); + boolean result = dir.mkdir(); + if(result) System.out.println("./output created"); + } + + /* + * get a vehicle type-builder and build a type with the typeId "vehicleType" and a capacity of 2 + */ + VehicleTypeImpl.Builder vehicleTypeBuilder = VehicleTypeImpl.Builder.newInstance("vehicleType", 2); + VehicleType vehicleType = vehicleTypeBuilder.build(); + + /* + * get a vehicle-builder and build a vehicle located at (10,10) with type "vehicleType" + */ + Builder vehicleBuilder = VehicleImpl.Builder.newInstance("vehicle"); + vehicleBuilder.setLocationCoord(Coordinate.newInstance(10, 10)); + vehicleBuilder.setType(vehicleType); + Vehicle vehicle = vehicleBuilder.build(); + + /* + * build pickups and deliveries at the required locations, each with a capacity-demand of 1. + */ + Pickup pickup1 = (Pickup) Pickup.Builder.newInstance("1", 1).setCoord(Coordinate.newInstance(5, 7)).build(); + Delivery delivery1 = (Delivery) Delivery.Builder.newInstance("2", 1).setCoord(Coordinate.newInstance(5, 13)).build(); + + Pickup pickup2 = (Pickup) Pickup.Builder.newInstance("3", 1).setCoord(Coordinate.newInstance(15, 7)).build(); + Delivery delivery2 = (Delivery) Delivery.Builder.newInstance("4", 1).setCoord(Coordinate.newInstance(15, 13)).build(); + + + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + vrpBuilder.addVehicle(vehicle); + vrpBuilder.addService(pickup1).addService(pickup2).addService(delivery1).addService(delivery2); + + // + vrpBuilder.addProblemConstraint(Constraint.DELIVERIES_FIRST); + + VehicleRoutingProblem problem = vrpBuilder.build(); + + /* + * get the algorithm out-of-the-box. + */ + VehicleRoutingAlgorithm algorithm = new SchrimpfFactory().createAlgorithm(problem); + + /* + * and search a solution + */ + Collection solutions = algorithm.searchSolutions(); + + /* + * get the best + */ + VehicleRoutingProblemSolution bestSolution = Solutions.getBest(solutions); + + new VrpXMLWriter(problem, solutions).write("output/problem-with-solution.xml"); + + SolutionPrinter.print(bestSolution,Print.VERBOSE); + + /* + * plot + */ + Plotter plotter = new Plotter(problem,bestSolution); + plotter.setLabel(Label.SIZE); + plotter.setShowFirstActivity(true); + plotter.plot("output/solution.png", "solution"); + + } + +} diff --git a/jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample2.java b/jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample2.java index 99aabc15..a36b852d 100644 --- a/jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample2.java +++ b/jsprit-examples/src/main/java/examples/VRPWithBackhaulsExample2.java @@ -65,9 +65,13 @@ public class VRPWithBackhaulsExample2 { new VrpXMLReader(vrpBuilder).read("input/pd_christophides_vrpnc1_vcap50.xml"); /* - * Finally, the problem can be built. By default, transportCosts are crowFlyDistances (as usually used for vrp-instances). + * add the backhaul constraint to the problem */ vrpBuilder.addProblemConstraint(Constraint.DELIVERIES_FIRST); + + /* + * Finally, the problem can be built. By default, transportCosts are crowFlyDistances (as usually used for vrp-instances). + */ VehicleRoutingProblem vrp = vrpBuilder.build(); SolutionPlotter.plotVrpAsPNG(vrp, "output/pd_christophides_vrpnc1.png", "pd_vrpnc1"); @@ -77,9 +81,8 @@ public class VRPWithBackhaulsExample2 { * * The algorithm can be defined and configured in an xml-file. */ -// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_solomon.xml"); - vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png")); + /* * Solve the problem. *