示例#1
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);
  }
示例#2
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(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
     */
    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();
  }