diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/PDTW_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/PDTW_IT.java new file mode 100644 index 00000000..637d895d --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/PDTW_IT.java @@ -0,0 +1,99 @@ +package jsprit.core.algorithm; + + +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.problem.Location; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Shipment; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TourActivity; +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.reporting.SolutionPrinter; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; +import org.junit.Test; + +import java.util.Collection; +import java.util.Random; + +import static org.junit.Assert.assertFalse; + + +public class PDTW_IT { + + int nShipments = 200; + int nVehicles = 15; + Random random = new Random(1623); + int nextShipmentId=1; + int nextVehicleId=1; + + @Test + public void timeWindowsShouldNOTbeBroken() { + + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + for(int i =0 ; i < nVehicles ; i++){ + vrpBuilder.addVehicle(createVehicle()); + } + for(int i =0 ; i < nShipments ;i++){ + vrpBuilder.addJob(createShipment()); + } + vrpBuilder.setFleetSize(FleetSize.FINITE); + VehicleRoutingProblem problem = vrpBuilder.build(); + VehicleRoutingAlgorithm algorithm = new SchrimpfFactory().createAlgorithm(problem); + algorithm.setMaxIterations(10); + Collection solutions = algorithm.searchSolutions(); + VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions); + + for(VehicleRoute route : bestSolution.getRoutes()){ + Vehicle v = route.getVehicle(); + for(TourActivity ta : route.getActivities()){ + if(ta.getArrTime() * 1.000001 > v.getLatestArrival()){ + assertFalse(true); + } + } + } + + SolutionPrinter.print(bestSolution); + } + + private Location createLocation(){ + return loc(new Coordinate(50*random.nextDouble(), 50*random.nextDouble())); + } + private Shipment createShipment(){ + Shipment.Builder b = Shipment.Builder.newInstance(Integer.toString(nextShipmentId++)); + b.addSizeDimension(0, 1); + b.setPickupServiceTime(random.nextDouble() * 5); + b.setDeliveryServiceTime(random.nextDouble() * 5); + b.setDeliveryLocation(createLocation()); + b.setPickupLocation(createLocation()); + return b.build(); + } + private VehicleImpl createVehicle(){ + VehicleTypeImpl.Builder vehicleTypeBuilder = VehicleTypeImpl.Builder.newInstance("vehicleType" + nextVehicleId).addCapacityDimension(0, 2); + vehicleTypeBuilder.setCostPerDistance(1.0); + vehicleTypeBuilder.setCostPerTime(1); + vehicleTypeBuilder.setFixedCost(1000); + VehicleType vehicleType = vehicleTypeBuilder.build(); + Builder v = VehicleImpl.Builder.newInstance("vehicle" + nextVehicleId); + Location l = createLocation(); + v.setStartLocation(l); + v.setEndLocation(l); + v.setType(vehicleType); + v.setEarliestStart(50); + v.setLatestArrival(200); + nextVehicleId++; + return v.build(); + } + + + private static Location loc(Coordinate coordinate){ + return Location.Builder.newInstance().setCoordinate(coordinate).build(); + } +} +