예제 #1
0
 @Test
 @Category(IntegrationTest.class)
 public void
     whenSolvingVRPNC1withDeliveriesWithJsprit_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
   VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
   new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-deliveries.xml");
   VehicleRoutingProblem vrp = vrpBuilder.build();
   VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
   Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
   assertEquals(530.0, Solutions.bestOf(solutions).getCost(), 50.0);
   assertEquals(5, Solutions.bestOf(solutions).getRoutes().size());
 }
  @Test
  public void itShouldSolveProblemWithIniSolutionExternallyCreated() {

    Service s1 = Service.Builder.newInstance("s1").setLocation(Location.newInstance(10, 0)).build();
    Service s2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance(0, 10)).build();

    VehicleImpl vehicle =
        VehicleImpl.Builder.newInstance("v1").setStartLocation(Location.newInstance(0, 0)).build();

    VehicleRoutingProblem vrp =
        VehicleRoutingProblem.Builder.newInstance()
            .addJob(s1)
            .addJob(s2)
            .addVehicle(vehicle)
            .build();

    VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);

    /*
    create ini sol
     */
    VehicleRoute route1 =
        VehicleRoute.Builder.newInstance(vehicle)
            .setJobActivityFactory(vrp.getJobActivityFactory())
            .addService(s1)
            .build();

    vra.addInitialSolution(new VehicleRoutingProblemSolution(Arrays.asList(route1), 20.));

    try {
      vra.searchSolutions();
      Assert.assertTrue(true);
    } catch (Exception e) {
      Assert.assertFalse(true);
    }
  }
  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");
    }

    /*
     * Build the problem.
     *
     * But define a problem-builder first.
     */
    VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();

    /*
     * A solomonReader reads solomon-instance files, and stores the required information in the builder.
     */
    new VrpXMLReader(vrpBuilder)
        .read("input/deliveries_solomon_specifiedVehicleEndLocations_c101.xml");

    /*
     * Finally, the problem can be built. By default, transportCosts are crowFlyDistances (as usually used for vrp-instances).
     */
    VehicleRoutingProblem vrp = vrpBuilder.build();

    Plotter pblmPlotter = new Plotter(vrp);
    pblmPlotter.plot("output/solomon_C101_specifiedVehicleEndLocations.png", "C101");

    /*
     * Define the required vehicle-routing algorithms to solve the above problem.
     *
     * The algorithm can be defined and configured in an xml-file.
     */
    //		VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
    VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
    vra.setMaxIterations(20000);
    //		vra.setPrematureBreak(100);
    vra.getAlgorithmListeners()
        .addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
    /*
     * Solve the problem.
     *
     *
     */
    Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();

    /*
     * Retrieve best solution.
     */
    VehicleRoutingProblemSolution solution = new SelectBest().selectSolution(solutions);

    /*
     * print solution
     */
    SolutionPrinter.print(solution);

    /*
     * Plot solution.
     */
    //		SolutionPlotter.plotSolutionAsPNG(vrp, solution,
    // "output/solomon_C101_specifiedVehicleEndLocations_solution.png","C101");
    Plotter solPlotter = new Plotter(vrp, solution);
    solPlotter.plot("output/solomon_C101_specifiedVehicleEndLocations_solution.png", "C101");

    new GraphStreamViewer(vrp, solution).setRenderDelay(50).labelWith(Label.ID).display();
  }
  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").addCapacityDimension(0, 2);
    vehicleTypeBuilder.setCostPerDistance(1.0);
    VehicleType vehicleType = vehicleTypeBuilder.build();

    /*
     * define two vehicles and their start-locations
     *
     * the first two do need to return to depot
     */
    Builder vehicleBuilder1 = VehicleImpl.Builder.newInstance("vehicles@[10,10]");
    vehicleBuilder1.setStartLocation(loc(Coordinate.newInstance(10, 10))).setReturnToDepot(false);
    vehicleBuilder1.setType(vehicleType);
    VehicleImpl vehicle1 = vehicleBuilder1.build();

    Builder vehicleBuilder2 = VehicleImpl.Builder.newInstance("vehicles@[30,30]");
    vehicleBuilder2.setStartLocation(loc(Coordinate.newInstance(30, 30))).setReturnToDepot(false);
    vehicleBuilder2.setType(vehicleType);
    VehicleImpl vehicle2 = vehicleBuilder2.build();

    Builder vehicleBuilder3 = VehicleImpl.Builder.newInstance("vehicles@[10,30]");
    vehicleBuilder3.setStartLocation(loc(Coordinate.newInstance(10, 30)));
    vehicleBuilder3.setType(vehicleType);
    VehicleImpl vehicle3 = vehicleBuilder3.build();

    Builder vehicleBuilder4 = VehicleImpl.Builder.newInstance("vehicles@[30,10]");
    vehicleBuilder4.setStartLocation(loc(Coordinate.newInstance(30, 10)));
    vehicleBuilder4.setType(vehicleType);
    VehicleImpl vehicle4 = vehicleBuilder4.build();

    /*
          * build shipments at the required locations, each with a capacity-demand of 1.

    */

    Shipment shipment1 =
        Shipment.Builder.newInstance("1")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(5, 7)))
            .setDeliveryLocation(loc(Coordinate.newInstance(6, 9)))
            .build();
    Shipment shipment2 =
        Shipment.Builder.newInstance("2")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(5, 13)))
            .setDeliveryLocation(loc(Coordinate.newInstance(6, 11)))
            .build();

    Shipment shipment3 =
        Shipment.Builder.newInstance("3")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(15, 7)))
            .setDeliveryLocation(loc(Coordinate.newInstance(14, 9)))
            .build();
    Shipment shipment4 =
        Shipment.Builder.newInstance("4")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(15, 13)))
            .setDeliveryLocation(loc(Coordinate.newInstance(14, 11)))
            .build();

    Shipment shipment5 =
        Shipment.Builder.newInstance("5")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(25, 27)))
            .setDeliveryLocation(loc(Coordinate.newInstance(26, 29)))
            .build();
    Shipment shipment6 =
        Shipment.Builder.newInstance("6")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(25, 33)))
            .setDeliveryLocation(loc(Coordinate.newInstance(26, 31)))
            .build();

    Shipment shipment7 =
        Shipment.Builder.newInstance("7")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(35, 27)))
            .setDeliveryLocation(loc(Coordinate.newInstance(34, 29)))
            .build();
    Shipment shipment8 =
        Shipment.Builder.newInstance("8")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(35, 33)))
            .setDeliveryLocation(loc(Coordinate.newInstance(34, 31)))
            .build();

    Shipment shipment9 =
        Shipment.Builder.newInstance("9")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(5, 27)))
            .setDeliveryLocation(loc(Coordinate.newInstance(6, 29)))
            .build();
    Shipment shipment10 =
        Shipment.Builder.newInstance("10")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(5, 33)))
            .setDeliveryLocation(loc(Coordinate.newInstance(6, 31)))
            .build();

    Shipment shipment11 =
        Shipment.Builder.newInstance("11")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(15, 27)))
            .setDeliveryLocation(loc(Coordinate.newInstance(14, 29)))
            .build();
    Shipment shipment12 =
        Shipment.Builder.newInstance("12")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(15, 33)))
            .setDeliveryLocation(loc(Coordinate.newInstance(14, 31)))
            .build();

    Shipment shipment13 =
        Shipment.Builder.newInstance("13")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(25, 7)))
            .setDeliveryLocation(loc(Coordinate.newInstance(26, 9)))
            .build();
    Shipment shipment14 =
        Shipment.Builder.newInstance("14")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(25, 13)))
            .setDeliveryLocation(loc(Coordinate.newInstance(26, 11)))
            .build();

    Shipment shipment15 =
        Shipment.Builder.newInstance("15")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(35, 7)))
            .setDeliveryLocation(loc(Coordinate.newInstance(34, 9)))
            .build();
    Shipment shipment16 =
        Shipment.Builder.newInstance("16")
            .addSizeDimension(0, 1)
            .setPickupLocation(loc(Coordinate.newInstance(35, 13)))
            .setDeliveryLocation(loc(Coordinate.newInstance(34, 11)))
            .build();

    VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
    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.setFleetSize(FleetSize.FINITE);
    VehicleRoutingProblem problem = vrpBuilder.build();

    /*
     * get the algorithm out-of-the-box.
     */
    VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(problem);
    //		algorithm.setMaxIterations(30000);
    /*
     * and search a solution
     */
    Collection<VehicleRoutingProblemSolution> 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();
  }