From a739ab77d051cf7c9f7da48bc95d64f9e6768c61 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Wed, 11 Jun 2014 03:05:11 +0200 Subject: [PATCH 1/4] added tests to reproduce bug #105 --- .../jsprit/core/algorithm/OpenRoutesTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java new file mode 100644 index 00000000..eed63bfa --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java @@ -0,0 +1,65 @@ +package jsprit.core.algorithm; + +import static org.junit.Assert.*; + +import java.util.Collection; + +import jsprit.core.algorithm.box.SchrimpfFactory; +import jsprit.core.algorithm.recreate.NoSolutionFoundException; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + +import org.junit.Test; + +public class OpenRoutesTest { + + @Test + public void whenDealingWithOpenRoute_insertionShouldNotRequireRouteToBeClosed(){ + VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); + Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setLatestArrival(9.) + .setType(type).setReturnToDepot(false).setStartLocationCoordinate(Coordinate.newInstance(0, 0)).build(); + + Service service = Service.Builder.newInstance("s").setCoord(Coordinate.newInstance(5, 0)).build(); + + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(service).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 whenDealingWithOpenRoute_algorithmShouldCalculateCorrectCosts(){ + VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); + Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setLatestArrival(10.) + .setType(type).setReturnToDepot(false).setStartLocationCoordinate(Coordinate.newInstance(0, 0)).build(); + + Service service = Service.Builder.newInstance("s").setCoord(Coordinate.newInstance(5, 0)).build(); + + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(service).addVehicle(vehicle).build(); + + VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); + vra.setNuOfIterations(10); + + Collection solutions = vra.searchSolutions(); + + assertEquals(5.,Solutions.bestOf(solutions).getCost(),0.01); + + } + +} From e6d7c4322fe4e16c66c3403b622f160e156a0573 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Wed, 11 Jun 2014 10:40:52 +0200 Subject: [PATCH 2/4] added test-cases to reproduce bug #104 --- .../jsprit/core/algorithm/OpenRoutesTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) 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 eed63bfa..0695ac18 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java @@ -8,6 +8,7 @@ import jsprit.core.algorithm.box.SchrimpfFactory; import jsprit.core.algorithm.recreate.NoSolutionFoundException; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; import jsprit.core.problem.vehicle.Vehicle; import jsprit.core.problem.vehicle.VehicleImpl; @@ -43,6 +44,49 @@ public class OpenRoutesTest { } + @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 whenDealingWithOpenRoute_algorithmShouldCalculateCorrectCosts(){ VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); From 21cd56a77708a5eae115df61b8390b82ff6766e6 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Wed, 11 Jun 2014 10:40:52 +0200 Subject: [PATCH 3/4] added test-cases to reproduce bug #105 --- .../jsprit/core/algorithm/OpenRoutesTest.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) 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 eed63bfa..56aa7bb6 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/OpenRoutesTest.java @@ -8,6 +8,7 @@ import jsprit.core.algorithm.box.SchrimpfFactory; import jsprit.core.algorithm.recreate.NoSolutionFoundException; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.job.Service; +import jsprit.core.problem.job.Shipment; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; import jsprit.core.problem.vehicle.Vehicle; import jsprit.core.problem.vehicle.VehicleImpl; @@ -20,6 +21,31 @@ import org.junit.Test; public class OpenRoutesTest { + @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 whenDealingWithOpenRoute_insertionShouldNotRequireRouteToBeClosed(){ VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); @@ -43,6 +69,70 @@ public class OpenRoutesTest { } + + + @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); + + Collection solutions = vra.searchSolutions(); + + assertEquals(10.,Solutions.bestOf(solutions).getCost(),0.01); + + } + @Test public void whenDealingWithOpenRoute_algorithmShouldCalculateCorrectCosts(){ VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); From 7a42cef1567e0cd65b42a705e9862d8e08d283a7 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Wed, 11 Jun 2014 11:31:00 +0200 Subject: [PATCH 4/4] bugfix #105 --- .../constraint/TimeWindowConstraint.java | 7 ++ .../jsprit/core/algorithm/OpenRoutesTest.java | 89 +------------------ 2 files changed, 10 insertions(+), 86 deletions(-) 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();