From 5d80a4caf00db7ee2bac0cf8b850ce4b64c077e1 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Mon, 10 Feb 2014 21:39:45 +0100 Subject: [PATCH] added another example --- ...potsAndVehicleAccessConstraintExample.java | 225 ++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 jsprit-examples/src/main/java/jsprit/examples/EnRoutePickupAndDeliveryWithMultipleDepotsAndVehicleAccessConstraintExample.java diff --git a/jsprit-examples/src/main/java/jsprit/examples/EnRoutePickupAndDeliveryWithMultipleDepotsAndVehicleAccessConstraintExample.java b/jsprit-examples/src/main/java/jsprit/examples/EnRoutePickupAndDeliveryWithMultipleDepotsAndVehicleAccessConstraintExample.java new file mode 100644 index 00000000..ae5a2749 --- /dev/null +++ b/jsprit-examples/src/main/java/jsprit/examples/EnRoutePickupAndDeliveryWithMultipleDepotsAndVehicleAccessConstraintExample.java @@ -0,0 +1,225 @@ +/******************************************************************************* + * Copyright (C) 2013 Stefan Schroeder + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + ******************************************************************************/ +package jsprit.examples; + +import java.util.Collection; + +import jsprit.analysis.toolbox.GraphStreamViewer; +import jsprit.analysis.toolbox.GraphStreamViewer.Label; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.recreate.listener.JobInsertedListener; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.algorithm.state.StateUpdater; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.constraint.HardRouteStateLevelConstraint; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleImpl.Builder; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; +import jsprit.util.Examples; + + +public class EnRoutePickupAndDeliveryWithMultipleDepotsAndVehicleAccessConstraintExample { + + static class ClusterMem implements StateUpdater, JobInsertedListener { + + private StateManager stateManager; + + public ClusterMem(StateManager stateManager) { + super(); + this.stateManager = stateManager; + } + + @Override + public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { + + } + + + } + + public static void main(String[] args) { + /* + * some preparation - create output folder + */ + Examples.createOutputFolder(); + + /* + * 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); + vehicleTypeBuilder.setCostPerDistance(1.0); + VehicleType vehicleType = vehicleTypeBuilder.build(); + + /* + * define two depots, i.e. two vehicle locations ([10,10],[50,50]) and equip them with an infinite number of vehicles of type 'vehicleType' + */ + Builder vehicleBuilder1 = VehicleImpl.Builder.newInstance("v1"); + vehicleBuilder1.setLocationCoord(Coordinate.newInstance(10, 10)); + vehicleBuilder1.setType(vehicleType); + Vehicle vehicle1 = vehicleBuilder1.build(); + + Builder vehicleBuilder2 = VehicleImpl.Builder.newInstance("v2"); + vehicleBuilder2.setLocationCoord(Coordinate.newInstance(30, 30)); + vehicleBuilder2.setType(vehicleType); + Vehicle vehicle2 = vehicleBuilder2.build(); + + Builder vehicleBuilder3 = VehicleImpl.Builder.newInstance("v3"); + vehicleBuilder3.setLocationCoord(Coordinate.newInstance(10, 30)); + vehicleBuilder3.setType(vehicleType); + Vehicle vehicle3 = vehicleBuilder3.build(); + + Builder vehicleBuilder4 = VehicleImpl.Builder.newInstance("v4"); + vehicleBuilder4.setLocationCoord(Coordinate.newInstance(30, 10)); + vehicleBuilder4.setType(vehicleType); + Vehicle vehicle4 = vehicleBuilder4.build(); + + /* + * build shipments at the required locations, each with a capacity-demand of 1. + * 4 shipments + * 1: (5,7)->(6,9) + * 2: (5,13)->(6,11) + * 3: (15,7)->(14,9) + * 4: (15,13)->(14,11) + */ + + Shipment shipment1 = Shipment.Builder.newInstance("1", 1).setPickupCoord(Coordinate.newInstance(5, 7)).setDeliveryCoord(Coordinate.newInstance(6, 9)).build(); + Shipment shipment2 = Shipment.Builder.newInstance("2", 1).setPickupCoord(Coordinate.newInstance(5, 13)).setDeliveryCoord(Coordinate.newInstance(6, 11)).build(); + + Shipment shipment3 = Shipment.Builder.newInstance("3", 1).setPickupCoord(Coordinate.newInstance(15, 7)).setDeliveryCoord(Coordinate.newInstance(14, 9)).build(); + Shipment shipment4 = Shipment.Builder.newInstance("4", 1).setPickupCoord(Coordinate.newInstance(15, 13)).setDeliveryCoord(Coordinate.newInstance(14, 11)).build(); + + Shipment shipment5 = Shipment.Builder.newInstance("5", 1).setPickupCoord(Coordinate.newInstance(25, 27)).setDeliveryCoord(Coordinate.newInstance(26, 29)).build(); + Shipment shipment6 = Shipment.Builder.newInstance("6", 1).setPickupCoord(Coordinate.newInstance(25, 33)).setDeliveryCoord(Coordinate.newInstance(26, 31)).build(); + + Shipment shipment7 = Shipment.Builder.newInstance("7", 1).setPickupCoord(Coordinate.newInstance(35, 27)).setDeliveryCoord(Coordinate.newInstance(34, 29)).build(); + Shipment shipment8 = Shipment.Builder.newInstance("8", 1).setPickupCoord(Coordinate.newInstance(35, 33)).setDeliveryCoord(Coordinate.newInstance(34, 31)).build(); + + Shipment shipment9 = Shipment.Builder.newInstance("9", 1).setPickupCoord(Coordinate.newInstance(5, 27)).setDeliveryCoord(Coordinate.newInstance(6, 29)).build(); + Shipment shipment10 = Shipment.Builder.newInstance("10", 1).setPickupCoord(Coordinate.newInstance(5, 33)).setDeliveryCoord(Coordinate.newInstance(6, 31)).build(); + + Shipment shipment11 = Shipment.Builder.newInstance("11", 1).setPickupCoord(Coordinate.newInstance(15, 27)).setDeliveryCoord(Coordinate.newInstance(14, 29)).build(); + Shipment shipment12 = Shipment.Builder.newInstance("12", 1).setPickupCoord(Coordinate.newInstance(15, 33)).setDeliveryCoord(Coordinate.newInstance(14, 31)).build(); + + Shipment shipment13 = Shipment.Builder.newInstance("13", 1).setPickupCoord(Coordinate.newInstance(25, 7)).setDeliveryCoord(Coordinate.newInstance(26, 9)).build(); + Shipment shipment14 = Shipment.Builder.newInstance("14", 1).setPickupCoord(Coordinate.newInstance(25, 13)).setDeliveryCoord(Coordinate.newInstance(26, 11)).build(); + + Shipment shipment15 = Shipment.Builder.newInstance("15", 1).setPickupCoord(Coordinate.newInstance(35, 7)).setDeliveryCoord(Coordinate.newInstance(34, 9)).build(); + Shipment shipment16 = Shipment.Builder.newInstance("16", 1).setPickupCoord(Coordinate.newInstance(35, 13)).setDeliveryCoord(Coordinate.newInstance(34, 11)).build(); + + Shipment shipment17 = Shipment.Builder.newInstance("17", 1).setPickupCoord(Coordinate.newInstance(5, 14)).setDeliveryCoord(Coordinate.newInstance(6, 16)).build(); + Shipment shipment18 = Shipment.Builder.newInstance("18", 1).setPickupCoord(Coordinate.newInstance(5, 20)).setDeliveryCoord(Coordinate.newInstance(6, 18)).build(); + + Shipment shipment19 = Shipment.Builder.newInstance("19", 1).setPickupCoord(Coordinate.newInstance(15, 14)).setDeliveryCoord(Coordinate.newInstance(14, 16)).build(); + Shipment shipment20 = Shipment.Builder.newInstance("20", 1).setPickupCoord(Coordinate.newInstance(15, 20)).setDeliveryCoord(Coordinate.newInstance(14, 18)).build(); + + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + vrpBuilder.addVehicle(vehicle1).addVehicle(vehicle2); +// vrpBuilder.addVehicle(vehicle1).addVehicle(vehicle2).addVehicle(vehicle3).addVehicle(vehicle4); + vrpBuilder.addJob(shipment1).addJob(shipment2).addJob(shipment3).addJob(shipment4); + vrpBuilder.addJob(shipment5).addJob(shipment6).addJob(shipment7).addJob(shipment8); + vrpBuilder.addJob(shipment9).addJob(shipment10).addJob(shipment11).addJob(shipment12); + vrpBuilder.addJob(shipment13).addJob(shipment14).addJob(shipment15).addJob(shipment16); + vrpBuilder.addJob(shipment17).addJob(shipment18).addJob(shipment19).addJob(shipment20); + + vrpBuilder.setFleetSize(FleetSize.FINITE); + + //vehicle1 cannot go to x>15 and vehicle2 cannot go to x<15 + /* + * switch off the geoConstraints to show the effects without + */ + HardRouteStateLevelConstraint geoClusterConstraint = new HardRouteStateLevelConstraint() { + + @Override + public boolean fulfilled(JobInsertionContext insertionContext) { + Shipment shipment2insert = ((Shipment)insertionContext.getJob()); + if(insertionContext.getNewVehicle().getId().equals("v2")){ + if(shipment2insert.getPickupCoord().getX() > 15. || shipment2insert.getDeliveryCoord().getX() > 15.){ + return false; + } + } + if(insertionContext.getNewVehicle().getId().equals("v1")){ + if(shipment2insert.getPickupCoord().getX() < 15. || shipment2insert.getDeliveryCoord().getX() < 15.){ + return false; + } + } + return true; + } + }; + vrpBuilder.addConstraint(geoClusterConstraint); + + VehicleRoutingProblem problem = vrpBuilder.build(); + +// StateManager stateManager = new StateManager(problem); + + + /* + * get the algorithm out-of-the-box. + */ + VehicleRoutingAlgorithm algorithm = VehicleRoutingAlgorithms.readAndCreateAlgorithm(problem, "input/algorithmConfig_noVehicleSwitch.xml"); +// algorithm.setNuOfIterations(30000); + /* + * and search a solution + */ + Collection solutions = algorithm.searchSolutions(); + + /* + * get the best + */ + VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions); + + /* + * write out problem and solution to xml-file + */ +// new VrpXMLWriter(problem, solutions).write("output/shipment-problem-with-solution.xml"); + + /* + * print nRoutes and totalCosts of bestSolution + */ + SolutionPrinter.print(bestSolution); + + /* + * plot problem without solution + */ +// Plotter problemPlotter = new Plotter(problem); +// problemPlotter.plotShipments(true); +// problemPlotter.plot("output/enRoutePickupAndDeliveryWithMultipleLocationsExample_problem.png", "en-route pickup and delivery"); +// +// /* +// * plot problem with solution +// */ +// Plotter solutionPlotter = new Plotter(problem,Arrays.asList(Solutions.bestOf(solutions).getRoutes().iterator().next())); +// solutionPlotter.plotShipments(true); +// solutionPlotter.plot("output/enRoutePickupAndDeliveryWithMultipleLocationsExample_solution.png", "en-route pickup and delivery"); + + new GraphStreamViewer(problem,Solutions.bestOf(solutions)).labelWith(Label.ACTIVITY).setRenderDelay(100).setRenderShipments(true).display(); + + } + +} +