@Before
  public void doBefore() {

    routingCosts = CostFactory.createManhattanCosts();
    activityCosts = new WaitingTimeCosts();

    VehicleRoutingProblem vrpMock = mock(VehicleRoutingProblem.class);
    when(vrpMock.getFleetSize()).thenReturn(VehicleRoutingProblem.FleetSize.FINITE);
    stateManager = new StateManager(vrpMock);

    reverseActivityVisitor = new ReverseRouteActivityVisitor();
    reverseActivityVisitor.addActivityVisitor(
        new UpdatePracticalTimeWindows(stateManager, routingCosts, activityCosts));

    Pickup pickup =
        (Pickup)
            Pickup.Builder.newInstance("pick")
                .setLocation(Location.newInstance("0,20"))
                .setTimeWindow(TimeWindow.newInstance(0, 30))
                .build();
    Delivery delivery =
        (Delivery)
            Delivery.Builder.newInstance("del")
                .setLocation(Location.newInstance("20,20"))
                .setTimeWindow(TimeWindow.newInstance(10, 40))
                .build();
    Pickup pickup2 =
        (Pickup)
            Pickup.Builder.newInstance("pick2")
                .setLocation(Location.newInstance("20,0"))
                .setTimeWindow(TimeWindow.newInstance(20, 50))
                .build();

    Vehicle vehicle =
        VehicleImpl.Builder.newInstance("v")
            .setStartLocation(Location.newInstance("0,0"))
            .setType(mock(VehicleType.class))
            .build();

    VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
    final VehicleRoutingProblem vrp =
        vrpBuilder.addJob(pickup).addJob(pickup2).addJob(delivery).build();

    route =
        VehicleRoute.Builder.newInstance(vehicle, mock(Driver.class))
            .setJobActivityFactory(
                new JobActivityFactory() {
                  @Override
                  public List<AbstractActivity> createActivities(Job job) {
                    return vrp.copyAndGetActivities(job);
                  }
                })
            .addService(pickup)
            .addService(delivery)
            .addService(pickup2)
            .build();

    reverseActivityVisitor.visit(route);
  }
Esempio n. 2
0
  public void read(String solomonFile) {
    vrpBuilder.setFleetSize(FleetSize.INFINITE);
    BufferedReader reader = getReader(solomonFile);
    int vehicleCapacity = 0;

    int counter = 0;
    String line;
    while ((line = readLine(reader)) != null) {
      line = line.replace("\r", "");
      line = line.trim();
      String[] tokens = line.split(" +");
      counter++;
      if (counter == 5) {
        vehicleCapacity = Integer.parseInt(tokens[1]);
        continue;
      }
      if (counter > 9) {
        if (tokens.length < 7) continue;
        Coordinate coord = makeCoord(tokens[1], tokens[2]);
        String customerId = tokens[0];
        int demand = Integer.parseInt(tokens[3]);
        double start = Double.parseDouble(tokens[4]) * timeProjectionFactor;
        double end = Double.parseDouble(tokens[5]) * timeProjectionFactor;
        double serviceTime = Double.parseDouble(tokens[6]) * timeProjectionFactor;
        if (counter == 10) {
          VehicleTypeImpl.Builder typeBuilder =
              VehicleTypeImpl.Builder.newInstance("solomonType")
                  .addCapacityDimension(0, vehicleCapacity);
          typeBuilder
              .setCostPerDistance(1.0 * variableCostProjectionFactor)
              .setFixedCost(fixedCostPerVehicle);
          VehicleTypeImpl vehicleType = typeBuilder.build();

          VehicleImpl vehicle =
              VehicleImpl.Builder.newInstance("solomonVehicle")
                  .setEarliestStart(start)
                  .setLatestArrival(end)
                  .setStartLocation(
                      Location.Builder.newInstance().setId(customerId).setCoordinate(coord).build())
                  .setType(vehicleType)
                  .build();
          vrpBuilder.addVehicle(vehicle);

        } else {
          Service service =
              new Service.Builder(customerId)
                  .addSizeDimension(0, demand)
                  .setLocation(
                      Location.Builder.newInstance().setCoordinate(coord).setId(customerId).build())
                  .setServiceTime(serviceTime)
                  .setTimeWindow(TimeWindow.newInstance(start, end))
                  .build();
          vrpBuilder.addJob(service);
        }
      }
    }
    close(reader);
  }
Esempio n. 3
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 whenAddingDeliverShipmentWithVehDiffStartEndLocs_constraintShouldWork() {
    Shipment shipment =
        Shipment.Builder.newInstance("s")
            .setPickupLocation(Location.newInstance(0, 1))
            .setDeliveryLocation(Location.newInstance(4, 1))
            .build();
    VehicleImpl vehicle =
        VehicleImpl.Builder.newInstance("v")
            .setStartLocation(Location.newInstance(0, 0))
            .setEndLocation(Location.newInstance(0, 4))
            .build();
    final VehicleRoutingProblem vrp =
        VehicleRoutingProblem.Builder.newInstance().addJob(shipment).addVehicle(vehicle).build();
    VehicleRoute route = VehicleRoute.emptyRoute();
    JobInsertionContext context = new JobInsertionContext(route, shipment, vehicle, null, 0);
    context.getAssociatedActivities().add(vrp.getActivities(shipment).get(0));
    context.getAssociatedActivities().add(vrp.getActivities(shipment).get(1));
    maxDistanceMap = new HashMap<>();
    maxDistanceMap.put(vehicle, 10d);

    StateManager stateManager = new StateManager(vrp);
    MaxDistanceConstraint maxDistanceConstraint =
        new MaxDistanceConstraint(
            stateManager,
            traveledDistanceId,
            new TransportDistance() {
              @Override
              public double getDistance(
                  Location from, Location to, double departureTime, Vehicle vehicle) {
                return vrp.getTransportCosts()
                    .getTransportTime(from, to, departureTime, null, vehicle);
              }
            },
            maxDistanceMap);
    Assert.assertTrue(
        maxDistanceConstraint
            .fulfilled(
                context,
                new Start(vehicle.getStartLocation(), 0, Double.MAX_VALUE),
                vrp.getActivities(shipment).get(0),
                new End(vehicle.getEndLocation(), 0, Double.MAX_VALUE),
                0)
            .equals(HardActivityConstraint.ConstraintsStatus.FULFILLED));

    ActivityContext pickupContext = new ActivityContext();
    pickupContext.setArrivalTime(1);
    pickupContext.setEndTime(1);
    pickupContext.setInsertionIndex(0);
    context.setRelatedActivityContext(pickupContext);
    Assert.assertTrue(
        maxDistanceConstraint
            .fulfilled(
                context,
                vrp.getActivities(shipment).get(0),
                vrp.getActivities(shipment).get(1),
                new End(vehicle.getEndLocation(), 0, Double.MAX_VALUE),
                1)
            .equals(HardActivityConstraint.ConstraintsStatus.FULFILLED));
  }
Esempio n. 5
0
 public void read(String filename) {
   readShipments(filename);
   buildShipments();
   VehicleTypeImpl type =
       VehicleTypeImpl.Builder.newInstance("type")
           .addCapacityDimension(0, vehicleCapacity)
           .setCostPerDistance(1.0)
           .setFixedCost(fixCosts)
           .build();
   VehicleImpl vehicle =
       VehicleImpl.Builder.newInstance("vehicle")
           .setEarliestStart(depotOpeningTime)
           .setLatestArrival(depotClosingTime)
           .setStartLocation(
               Location.Builder.newInstance().setCoordinate(customers.get(depotId).coord).build())
           .setType(type)
           .build();
   vrpBuilder.addVehicle(vehicle);
 }
  @Test
  public void whenEndLocationIsSet_constraintShouldWork() {
    VehicleImpl vehicle =
        VehicleImpl.Builder.newInstance("v")
            .setStartLocation(Location.newInstance(0, 0))
            .setEndLocation(Location.newInstance(10, 0))
            .build();
    Pickup pickup =
        Pickup.Builder.newInstance("pickup").setLocation(Location.newInstance(10, 0)).build();
    vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(vehicle).addJob(pickup).build();
    route = VehicleRoute.emptyRoute();
    maxDistanceMap = new HashMap<>();
    maxDistanceMap.put(vehicle, 5d);

    MaxDistanceConstraint maxDistanceConstraint =
        new MaxDistanceConstraint(
            new StateManager(vrp),
            traveledDistanceId,
            new TransportDistance() {
              @Override
              public double getDistance(
                  Location from, Location to, double departureTime, Vehicle vehicle) {
                return vrp.getTransportCosts()
                    .getTransportTime(from, to, departureTime, null, vehicle);
              }
            },
            maxDistanceMap);
    JobInsertionContext context = new JobInsertionContext(route, pickup, vehicle, null, 0);
    Assert.assertTrue(
        maxDistanceConstraint
            .fulfilled(
                context,
                new Start(vehicle.getStartLocation(), 0, Double.MAX_VALUE),
                vrp.getActivities(pickup).get(0),
                new End(vehicle.getEndLocation(), 0, Double.MAX_VALUE),
                0)
            .equals(HardActivityConstraint.ConstraintsStatus.NOT_FULFILLED));
  }
  @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);
    }
  }
Esempio n. 8
0
 private void buildShipments() {
   Integer counter = 0;
   for (Relation rel : relations) {
     counter++;
     String from = rel.from;
     String to = rel.to;
     int demand = rel.demand;
     Shipment s =
         Shipment.Builder.newInstance(counter.toString())
             .addSizeDimension(0, demand)
             .setPickupLocation(
                 Location.Builder.newInstance().setCoordinate(customers.get(from).coord).build())
             .setPickupServiceTime(customers.get(from).serviceTime)
             .setPickupTimeWindow(
                 TimeWindow.newInstance(customers.get(from).start, customers.get(from).end))
             .setDeliveryLocation(
                 Location.Builder.newInstance().setCoordinate(customers.get(to).coord).build())
             .setDeliveryServiceTime(customers.get(to).serviceTime)
             .setDeliveryTimeWindow(
                 TimeWindow.newInstance(customers.get(to).start, customers.get(to).end))
             .build();
     vrpBuilder.addJob(s);
   }
 }
  @Test(expected = UnsupportedOperationException.class)
  public void
      whenHavingShipmentsAndServicesInOneProblem_andInsertionShouldBeMadeOnRouteLevel_throwException() {
    /* 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);
    VehicleType vehicleType = vehicleTypeBuilder.build();

    /*
     * get a vehicle-builder and build a vehicle located at (10,10) with type "vehicleType"
     */
    VehicleImpl.Builder vehicleBuilder = VehicleImpl.Builder.newInstance("vehicle");
    vehicleBuilder.setStartLocation(Location.newInstance(10, 10));
    vehicleBuilder.setType(vehicleType);
    VehicleImpl vehicle = vehicleBuilder.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")
            .addSizeDimension(0, 1)
            .setPickupLocation(TestUtils.loc(Coordinate.newInstance(5, 7)))
            .setDeliveryLocation(TestUtils.loc(Coordinate.newInstance(6, 9)))
            .build();
    Shipment shipment2 =
        Shipment.Builder.newInstance("2")
            .addSizeDimension(0, 1)
            .setPickupLocation(TestUtils.loc(Coordinate.newInstance(5, 13)))
            .setDeliveryLocation(TestUtils.loc(Coordinate.newInstance(6, 11)))
            .build();

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

    /*
     * build deliveries, (implicitly picked up in the depot)
     * 1: (4,8)
     * 2: (4,12)
     * 3: (16,8)
     * 4: (16,12)
     */
    Delivery delivery1 =
        (Delivery)
            Delivery.Builder.newInstance("5")
                .addSizeDimension(0, 1)
                .setLocation(TestUtils.loc(Coordinate.newInstance(4, 8)))
                .build();
    Delivery delivery2 =
        (Delivery)
            Delivery.Builder.newInstance("6")
                .addSizeDimension(0, 1)
                .setLocation(TestUtils.loc(Coordinate.newInstance(4, 12)))
                .build();
    Delivery delivery3 =
        (Delivery)
            Delivery.Builder.newInstance("7")
                .addSizeDimension(0, 1)
                .setLocation(TestUtils.loc(Coordinate.newInstance(16, 8)))
                .build();
    Delivery delivery4 =
        (Delivery)
            Delivery.Builder.newInstance("8")
                .addSizeDimension(0, 1)
                .setLocation(TestUtils.loc(Coordinate.newInstance(16, 12)))
                .build();

    VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
    vrpBuilder.addVehicle(vehicle);
    vrpBuilder
        .addJob(shipment1)
        .addJob(shipment2)
        .addJob(shipment3)
        .addJob(shipment4)
        .addJob(delivery1)
        .addJob(delivery2)
        .addJob(delivery3)
        .addJob(delivery4)
        .build();

    VehicleRoutingProblem vrp = vrpBuilder.build();

    final StateManager stateManager = new StateManager(vrp);

    ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
    constraintManager.addLoadConstraint();
    constraintManager.addTimeWindowConstraint();

    VehicleFleetManager fleetManager =
        new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();

    BestInsertionBuilder bestIBuilder =
        new BestInsertionBuilder(vrp, fleetManager, stateManager, constraintManager);
    bestIBuilder.setRouteLevel(2, 2);
    @SuppressWarnings("unused")
    InsertionStrategy bestInsertion = bestIBuilder.build();
  }
  @Test
  public void
      whenHavingOnlyServicesInOneProblem_andInsertionShouldBeMadeOnRouteLevel_itShouldAssertTrue() {
    /* 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);
    VehicleType vehicleType = vehicleTypeBuilder.build();

    /*
     * get a vehicle-builder and build a vehicle located at (10,10) with type "vehicleType"
     */
    VehicleImpl.Builder vehicleBuilder = VehicleImpl.Builder.newInstance("vehicle");
    vehicleBuilder.setStartLocation(Location.newInstance(10, 10));
    vehicleBuilder.setType(vehicleType);
    VehicleImpl vehicle = vehicleBuilder.build();

    /*
     * build deliveries, (implicitly picked up in the depot)
     * 1: (4,8)
     * 2: (4,12)
     * 3: (16,8)
     * 4: (16,12)
     */
    Delivery delivery1 =
        (Delivery)
            Delivery.Builder.newInstance("5")
                .addSizeDimension(0, 1)
                .setLocation(Location.newInstance(4, 8))
                .build();
    Delivery delivery2 =
        (Delivery)
            Delivery.Builder.newInstance("6")
                .addSizeDimension(0, 1)
                .setLocation(Location.newInstance(4, 12))
                .build();
    Delivery delivery3 =
        (Delivery)
            Delivery.Builder.newInstance("7")
                .addSizeDimension(0, 1)
                .setLocation(Location.newInstance(16, 8))
                .build();
    Delivery delivery4 =
        (Delivery)
            Delivery.Builder.newInstance("8")
                .addSizeDimension(0, 1)
                .setLocation(Location.newInstance(16, 12))
                .build();

    VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
    vrpBuilder
        .addVehicle(vehicle)
        //		vrpBuilder.addJob(shipment1).addJob(shipment2).addJob(shipment3).addJob(shipment4)
        .addJob(delivery1)
        .addJob(delivery2)
        .addJob(delivery3)
        .addJob(delivery4)
        .build();

    VehicleRoutingProblem vrp = vrpBuilder.build();

    final StateManager stateManager = new StateManager(vrp);

    ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
    constraintManager.addLoadConstraint();
    constraintManager.addTimeWindowConstraint();

    VehicleFleetManager fleetManager =
        new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();

    BestInsertionBuilder bestIBuilder =
        new BestInsertionBuilder(vrp, fleetManager, stateManager, constraintManager);
    bestIBuilder.setRouteLevel(2, 2);
    @SuppressWarnings("unused")
    InsertionStrategy bestInsertion = bestIBuilder.build();

    assertTrue(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();
  }
Esempio n. 12
0
  public static void main(String[] args) {
    /*
     * some preparation - create output folder
     */
    Examples.createOutputFolder();

    /*
     * 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 SolomonReader(vrpBuilder).read("input/C101_solomon.txt");

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

    new Plotter(vrp).plot("output/solomon_C101.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);

    /*
     * Solve the problem.
     *
     *
     */
    Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();

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

    /*
     * print solution
     */
    SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE);

    /*
     * Plot solution.
     */
    Plotter plotter = new Plotter(vrp, solution);
    //		plotter.setBoundingBox(30, 0, 50, 20);
    plotter.plot("output/solomon_C101_solution.png", "C101");

    new GraphStreamViewer(vrp, solution)
        .setCameraView(30, 30, 0.25)
        .labelWith(Label.ID)
        .setRenderDelay(100)
        .display();
  }
  @Before
  public void doBefore() {
    vehicle =
        VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build();
    vehicle2 =
        VehicleImpl.Builder.newInstance("v2")
            .setStartLocation(Location.newInstance(10, 10))
            .build();

    maxDistanceMap = new HashMap<>();
    maxDistanceMap.put(vehicle, 200d);
    maxDistanceMap.put(vehicle2, 200d);

    d1 = Delivery.Builder.newInstance("d1").setLocation(Location.newInstance(10, 10)).build();
    d2 = Delivery.Builder.newInstance("d2").setLocation(Location.newInstance(20, 15)).build();
    pickup = Pickup.Builder.newInstance("pickup").setLocation(Location.newInstance(50, 50)).build();
    s1 =
        Shipment.Builder.newInstance("s1")
            .setPickupLocation(Location.newInstance(35, 30))
            .setDeliveryLocation(Location.newInstance(20, 25))
            .build();

    newDelivery =
        Delivery.Builder.newInstance("new").setLocation(Location.newInstance(-10, 10)).build();

    vrp =
        VehicleRoutingProblem.Builder.newInstance()
            .setRoutingCost(new ManhattanCosts())
            .addVehicle(vehicle)
            .addVehicle(vehicle2)
            .addJob(d1)
            .addJob(d2)
            .addJob(s1)
            .addJob(pickup)
            .addJob(newDelivery)
            .build();

    route =
        VehicleRoute.Builder.newInstance(vehicle)
            .setJobActivityFactory(vrp.getJobActivityFactory())
            .addDelivery(d1)
            .addDelivery(d2)
            .addPickup(s1)
            .addPickup(pickup)
            .addDelivery(s1)
            .build();

    stateManager = new StateManager(vrp);

    traveledDistanceId = stateManager.createStateId("traveledDistance");

    com.graphhopper.jsprit.core.algorithm.state.VehicleDependentTraveledDistance traveledDistance =
        new com.graphhopper.jsprit.core.algorithm.state.VehicleDependentTraveledDistance(
            new TransportDistance() {
              @Override
              public double getDistance(
                  Location from, Location to, double departureTime, Vehicle vehicle) {
                return new ManhattanCosts().getDistance(from, to, departureTime, vehicle);
              }
            },
            stateManager,
            traveledDistanceId,
            Arrays.asList(vehicle, vehicle2));

    stateManager.addStateUpdater(traveledDistance);
    stateManager.informInsertionStarts(Arrays.asList(route), Collections.<Job>emptyList());
  }
  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();
  }