diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/TimeWindowConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/TimeWindowConstraint.java index 87d7ed47..73f90485 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/constraint/TimeWindowConstraint.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/TimeWindowConstraint.java @@ -2,6 +2,7 @@ package jsprit.core.problem.constraint; import jsprit.core.problem.cost.VehicleRoutingTransportCosts; import jsprit.core.problem.misc.JobInsertionContext; +import jsprit.core.problem.solution.route.activity.End; import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; import jsprit.core.problem.solution.route.state.StateFactory; @@ -78,6 +79,12 @@ import jsprit.core.util.CalculationUtils; if(arrTimeAtNewAct > latestArrTimeAtNewAct){ return ConstraintsStatus.NOT_FULFILLED; } + + if(nextAct instanceof End){ + if(!iFacts.getNewVehicle().isReturnToDepot()){ + return ConstraintsStatus.FULFILLED; + } + } // log.info(newAct + " arrTime=" + arrTimeAtNewAct); double endTimeAtNewAct = CalculationUtils.getActivityEndTime(arrTimeAtNewAct, newAct); double arrTimeAtNextAct = endTimeAtNewAct + routingCosts.getTransportTime(newAct.getLocationId(), nextAct.getLocationId(), endTimeAtNewAct, iFacts.getNewDriver(), iFacts.getNewVehicle()); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java index 8d614c29..ccaa80c4 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java @@ -34,6 +34,7 @@ public class OpenRoutesTest { VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(shipment).addVehicle(vehicle).build(); VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); + vra.setNuOfIterations(10); try{ @SuppressWarnings("unused") @@ -57,6 +58,7 @@ public class OpenRoutesTest { VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(service).addVehicle(vehicle).build(); VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); + vra.setNuOfIterations(10); try{ @SuppressWarnings("unused") @@ -83,92 +85,7 @@ public class OpenRoutesTest { VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(shipment).addVehicle(vehicle).build(); VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); - - Collection solutions = vra.searchSolutions(); - - assertEquals(10.,Solutions.bestOf(solutions).getCost(),0.01); - - } - - @Test - public void whenDealingWithOpenRouteAndShipments_insertionShouldNotRequireRouteToBeClosed(){ - VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); - Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setLatestArrival(11.) - .setType(type).setReturnToDepot(false).setStartLocationCoordinate(Coordinate.newInstance(0, 0)).build(); - - Shipment shipment = Shipment.Builder.newInstance("s").setPickupCoord(Coordinate.newInstance(5, 0)) - .setDeliveryCoord(Coordinate.newInstance(10, 0)).build(); - - VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(shipment).addVehicle(vehicle).build(); - - VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); - - try{ - @SuppressWarnings("unused") - Collection solutions = vra.searchSolutions(); - assertTrue(true); - } - catch(NoSolutionFoundException e){ - assertFalse(true); - } - - } - - @Test - public void whenDealingWithOpenRouteAndShipments_algorithmShouldCalculateCorrectCosts(){ - VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); - Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setLatestArrival(20.) - .setType(type).setReturnToDepot(false).setStartLocationCoordinate(Coordinate.newInstance(0, 0)).build(); - - Shipment shipment = Shipment.Builder.newInstance("s").setPickupCoord(Coordinate.newInstance(5, 0)) - .setDeliveryCoord(Coordinate.newInstance(10, 0)).build(); - - VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(shipment).addVehicle(vehicle).build(); - - VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); - - Collection solutions = vra.searchSolutions(); - - assertEquals(10.,Solutions.bestOf(solutions).getCost(),0.01); - - } - - @Test - public void whenDealingWithOpenRouteAndShipments_insertionShouldNotRequireRouteToBeClosed(){ - VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); - Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setLatestArrival(11.) - .setType(type).setReturnToDepot(false).setStartLocationCoordinate(Coordinate.newInstance(0, 0)).build(); - - Shipment shipment = Shipment.Builder.newInstance("s").setPickupCoord(Coordinate.newInstance(5, 0)) - .setDeliveryCoord(Coordinate.newInstance(10, 0)).build(); - - VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(shipment).addVehicle(vehicle).build(); - - VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); - - try{ - @SuppressWarnings("unused") - Collection solutions = vra.searchSolutions(); - assertTrue(true); - } - catch(NoSolutionFoundException e){ - assertFalse(true); - } - - } - - @Test - public void whenDealingWithOpenRouteAndShipments_algorithmShouldCalculateCorrectCosts(){ - VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); - Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setLatestArrival(20.) - .setType(type).setReturnToDepot(false).setStartLocationCoordinate(Coordinate.newInstance(0, 0)).build(); - - Shipment shipment = Shipment.Builder.newInstance("s").setPickupCoord(Coordinate.newInstance(5, 0)) - .setDeliveryCoord(Coordinate.newInstance(10, 0)).build(); - - VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(shipment).addVehicle(vehicle).build(); - - VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); + vra.setNuOfIterations(10); Collection solutions = vra.searchSolutions();