From 8e3977e78f5beb965206de793a3a803febb012fe Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Wed, 23 Jul 2014 23:12:13 +0200 Subject: [PATCH] rename core.problem.JobActivityFactory.createActivity to .createActivities --- .../core/problem/JobActivityFactory.java | 4 +- .../problem/solution/route/VehicleRoute.java | 6 +- ...dPDVRPWithShipmentsAlgoFromScratch_IT.java | 4 +- ...erviceInsertionAndLoadConstraintsTest.java | 32 +++++-- .../ShipmentInsertionCalculatorTest.java | 75 ++++++++++++--- .../TestCalculatesServiceInsertion.java | 23 +++-- ...alculatesServiceInsertionOnRouteLevel.java | 14 ++- ...teLevelActivityInsertionCostEstimator.java | 2 +- ...uteLevelServiceInsertionCostEstimator.java | 93 ++++++++++++++++--- .../core/algorithm/state/LoadStateTest.java | 6 +- .../core/algorithm/state/Solomon_IT.java | 32 +++++++ .../state/UpdatePracticalTimeWindowTest.java | 2 +- .../UpdateVehicleDependentTimeWindowTest.java | 2 +- .../constraint/LoadConstraintTest.java | 6 +- .../VehicleDependentTimeWindowTest.java | 2 +- 15 files changed, 237 insertions(+), 66 deletions(-) create mode 100644 jsprit-core/src/test/java/jsprit/core/algorithm/state/Solomon_IT.java diff --git a/jsprit-core/src/main/java/jsprit/core/problem/JobActivityFactory.java b/jsprit-core/src/main/java/jsprit/core/problem/JobActivityFactory.java index 7bad6d88..82fae577 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/JobActivityFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/JobActivityFactory.java @@ -5,10 +5,10 @@ import jsprit.core.problem.job.Job; import java.util.List; /** - * Created by schroeder on 14.07.14. + * JobActivityFactory that creates the activities to the specified job. */ public interface JobActivityFactory { - public List createActivity(Job job); + public List createActivities(Job job); } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/solution/route/VehicleRoute.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/VehicleRoute.java index 826a0a1b..00d88c1a 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/solution/route/VehicleRoute.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/route/VehicleRoute.java @@ -128,7 +128,7 @@ public class VehicleRoute { private JobActivityFactory jobActivityFactory = new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { List acts = new ArrayList(); if(job instanceof Service){ acts.add(serviceActivityFactory.createActivity((Service) job)); @@ -241,7 +241,7 @@ public class VehicleRoute { */ @Deprecated public Builder addService(Service service, double arrTime, double endTime){ - List acts = jobActivityFactory.createActivity(service); + List acts = jobActivityFactory.createActivities(service); TourActivity act = acts.get(0); act.setArrTime(arrTime); act.setEndTime(endTime); @@ -272,7 +272,7 @@ public class VehicleRoute { @Deprecated public Builder addPickup(Shipment shipment, double arrTime, double endTime){ if(openShipments.contains(shipment)) throw new IllegalStateException("shipment has already been added. cannot add it twice."); - List acts = jobActivityFactory.createActivity(shipment); + List acts = jobActivityFactory.createActivities(shipment); TourActivity act = acts.get(0); act.setArrTime(arrTime); act.setEndTime(endTime); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPWithShipmentsAlgoFromScratch_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPWithShipmentsAlgoFromScratch_IT.java index d17ed0d5..77b0d5d3 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPWithShipmentsAlgoFromScratch_IT.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/BuildPDVRPWithShipmentsAlgoFromScratch_IT.java @@ -54,11 +54,11 @@ public class BuildPDVRPWithShipmentsAlgoFromScratch_IT { final StateManager stateManager = new StateManager(vrp); stateManager.updateLoadStates(); - stateManager.updateTimeWindowStates(); +// stateManager.updateTimeWindowStates(); stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); - constraintManager.addTimeWindowConstraint(); +// constraintManager.addTimeWindowConstraint(); constraintManager.addLoadConstraint(); VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager(); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java index e3c0f06e..46766ad0 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java @@ -21,6 +21,7 @@ package jsprit.core.algorithm.recreate; import jsprit.core.algorithm.recreate.listener.InsertionListeners; import jsprit.core.algorithm.state.StateManager; import jsprit.core.problem.AbstractActivity; +import jsprit.core.problem.JobActivityFactory; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.constraint.ConstraintManager; import jsprit.core.problem.constraint.HardActivityStateLevelConstraint; @@ -30,11 +31,13 @@ import jsprit.core.problem.cost.VehicleRoutingTransportCosts; import jsprit.core.problem.driver.Driver; import jsprit.core.problem.driver.DriverImpl; import jsprit.core.problem.job.Delivery; +import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Pickup; import jsprit.core.problem.job.Shipment; import jsprit.core.problem.misc.JobInsertionContext; import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.solution.route.activity.DeliverService; +import jsprit.core.problem.solution.route.activity.PickupService; import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; import jsprit.core.problem.vehicle.Vehicle; @@ -112,7 +115,7 @@ public class ServiceInsertionAndLoadConstraintsTest { public void whenInsertingServiceWhileNoCapIsAvailable_itMustReturnTheCorrectInsertionIndex(){ Delivery delivery = (Delivery) Delivery.Builder.newInstance("del").addSizeDimension(0, 41).setLocationId("10,10").build(); Pickup pickup = (Pickup) Pickup.Builder.newInstance("pick").addSizeDimension(0, 15).setLocationId("0,10").build(); - + VehicleType type = VehicleTypeImpl.Builder.newInstance("t").addCapacityDimension(0, 50).setCostPerDistance(1).build(); Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocationId("0,0").setType(type).build(); @@ -120,11 +123,25 @@ public class ServiceInsertionAndLoadConstraintsTest { route.setVehicleAndDepartureTime(vehicle, 0.0); Inserter inserter = new Inserter(new InsertionListeners(), vehicleRoutingProblem); - List acts = new ArrayList(); - acts.add(new DeliverService(delivery)); - when(vehicleRoutingProblem.copyAndGetActivities(delivery)).thenReturn(acts); - inserter.insertJob(delivery, new InsertionData(0,0,0,vehicle,null), route); - + { + List acts = new ArrayList(); + acts.add(new DeliverService(delivery)); + when(vehicleRoutingProblem.copyAndGetActivities(delivery)).thenReturn(acts); + } + { + List acts = new ArrayList(); + acts.add(new PickupService(pickup)); + when(vehicleRoutingProblem.copyAndGetActivities(pickup)).thenReturn(acts); + } + inserter.insertJob(delivery, new InsertionData(0,0,0,vehicle,null), route); + + JobActivityFactory activityFactory = new JobActivityFactory() { + @Override + public List createActivities(Job job) { + return vehicleRoutingProblem.copyAndGetActivities(job); + } + }; + VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class); StateManager stateManager = new StateManager(vrp); @@ -139,7 +156,10 @@ public class ServiceInsertionAndLoadConstraintsTest { JobCalculatorSwitcher switcher = new JobCalculatorSwitcher(); ServiceInsertionCalculator serviceInsertionCalc = new ServiceInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager); + serviceInsertionCalc.setJobActivityFactory(activityFactory); ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager); + insertionCalculator.setJobActivityFactory(activityFactory); + switcher.put(Pickup.class, serviceInsertionCalc); switcher.put(Delivery.class, serviceInsertionCalc); switcher.put(Shipment.class, insertionCalculator); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java index 31d88cbe..499fbbdf 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java @@ -21,6 +21,7 @@ package jsprit.core.algorithm.recreate; import jsprit.core.algorithm.recreate.listener.InsertionListeners; import jsprit.core.algorithm.state.StateManager; import jsprit.core.problem.AbstractActivity; +import jsprit.core.problem.JobActivityFactory; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.constraint.*; import jsprit.core.problem.constraint.ConstraintManager.Priority; @@ -34,6 +35,7 @@ import jsprit.core.problem.job.Shipment; import jsprit.core.problem.misc.JobInsertionContext; import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.solution.route.activity.DeliverShipment; +import jsprit.core.problem.solution.route.activity.PickupService; import jsprit.core.problem.solution.route.activity.PickupShipment; import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; @@ -113,7 +115,12 @@ public class ShipmentInsertionCalculatorTest { public void whenCalculatingInsertionCostsOfShipment_itShouldReturnCorrectCostValue(){ Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation("0,10").setDeliveryLocation("10,0").build(); VehicleRoute route = VehicleRoute.emptyRoute(); - + JobActivityFactory activityFactory = mock(JobActivityFactory.class); + List activities = new ArrayList(); + activities.add(new PickupShipment(shipment)); + activities.add(new DeliverShipment(shipment)); + when(activityFactory.createActivities(shipment)).thenReturn(activities); + insertionCalculator.setJobActivityFactory(activityFactory); InsertionData iData = insertionCalculator.getInsertionData(route, shipment, vehicle, 0.0, null, Double.MAX_VALUE); assertEquals(40.0,iData.getInsertionCost(),0.05); } @@ -125,7 +132,14 @@ public class ShipmentInsertionCalculatorTest { VehicleRoute route = VehicleRoute.emptyRoute(); when(vehicleRoutingProblem.copyAndGetActivities(shipment)).thenReturn(getTourActivities(shipment)); new Inserter(new InsertionListeners(), vehicleRoutingProblem).insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route); - + + JobActivityFactory activityFactory = mock(JobActivityFactory.class); + List activities = new ArrayList(); + activities.add(new PickupShipment(shipment2)); + activities.add(new DeliverShipment(shipment2)); + when(activityFactory.createActivities(shipment2)).thenReturn(activities); + insertionCalculator.setJobActivityFactory(activityFactory); + InsertionData iData = insertionCalculator.getInsertionData(route, shipment2, vehicle, 0.0, null, Double.MAX_VALUE); assertEquals(0.0,iData.getInsertionCost(),0.05); assertEquals(1,iData.getPickupInsertionIndex()); @@ -156,7 +170,15 @@ public class ShipmentInsertionCalculatorTest { } }); - InsertionData iData = insertionCalculator.getInsertionData(route, shipment2, vehicle, 0.0, null, Double.MAX_VALUE); + + JobActivityFactory activityFactory = mock(JobActivityFactory.class); + List activities = new ArrayList(); + activities.add(new PickupShipment(shipment2)); + activities.add(new DeliverShipment(shipment2)); + when(activityFactory.createActivities(shipment2)).thenReturn(activities); + insertionCalculator.setJobActivityFactory(activityFactory); + + InsertionData iData = insertionCalculator.getInsertionData(route, shipment2, vehicle, 0.0, null, Double.MAX_VALUE); assertEquals(InsertionData.createEmptyInsertionData(),iData); } @@ -174,7 +196,14 @@ public class ShipmentInsertionCalculatorTest { Inserter inserter = new Inserter(new InsertionListeners(),vehicleRoutingProblem ); inserter.insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route); inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null),route); - + + JobActivityFactory activityFactory = mock(JobActivityFactory.class); + List activities = new ArrayList(); + activities.add(new PickupShipment(shipment3)); + activities.add(new DeliverShipment(shipment3)); + when(activityFactory.createActivities(shipment3)).thenReturn(activities); + insertionCalculator.setJobActivityFactory(activityFactory); + InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, null, Double.MAX_VALUE); assertEquals(0.0,iData.getInsertionCost(),0.05); assertEquals(0,iData.getPickupInsertionIndex()); @@ -192,8 +221,16 @@ public class ShipmentInsertionCalculatorTest { Inserter inserter = new Inserter(new InsertionListeners(), vehicleRoutingProblem); inserter.insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route); inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null),route); - - InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, null, Double.MAX_VALUE); + + JobActivityFactory activityFactory = mock(JobActivityFactory.class); + List activities = new ArrayList(); + activities.add(new PickupShipment(shipment3)); + activities.add(new DeliverShipment(shipment3)); + when(activityFactory.createActivities(shipment3)).thenReturn(activities); + insertionCalculator.setJobActivityFactory(activityFactory); + + + InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, null, Double.MAX_VALUE); assertEquals(2.0,iData.getInsertionCost(),0.05); assertEquals(0,iData.getPickupInsertionIndex()); assertEquals(1,iData.getDeliveryInsertionIndex()); @@ -215,10 +252,8 @@ public class ShipmentInsertionCalculatorTest { inserter.insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route); inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null), route); - -// VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class); - - StateManager stateManager = new StateManager(vrp); + + StateManager stateManager = new StateManager(vrp); stateManager.updateLoadStates(); stateManager.informInsertionStarts(Arrays.asList(route), null); @@ -228,8 +263,14 @@ public class ShipmentInsertionCalculatorTest { ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager); - - + + JobActivityFactory activityFactory = mock(JobActivityFactory.class); + List activities = new ArrayList(); + activities.add(new PickupShipment(shipment3)); + activities.add(new DeliverShipment(shipment3)); + when(activityFactory.createActivities(shipment3)).thenReturn(activities); + insertionCalculator.setJobActivityFactory(activityFactory); + InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, DriverImpl.noDriver(), Double.MAX_VALUE); assertTrue(iData instanceof InsertionData.NoInsertionFound); @@ -269,7 +310,15 @@ public class ShipmentInsertionCalculatorTest { // Service service = Service.Builder.newInstance("pick", 1).setLocationId("5,5").build(); Pickup service = (Pickup)Pickup.Builder.newInstance("pick").addSizeDimension(0, 1).setLocationId("5,5").build(); - InsertionData iData = switcher.getInsertionData(route, service, vehicle, 0, DriverImpl.noDriver(), Double.MAX_VALUE); + + JobActivityFactory activityFactory = mock(JobActivityFactory.class); + List activities = new ArrayList(); + activities.add(new PickupService(service)); + when(activityFactory.createActivities(service)).thenReturn(activities); + insertionCalculator.setJobActivityFactory(activityFactory); + serviceInsertionCalc.setJobActivityFactory(activityFactory); + + InsertionData iData = switcher.getInsertionData(route, service, vehicle, 0, DriverImpl.noDriver(), Double.MAX_VALUE); // routeActVisitor.visit(route); assertEquals(3, iData.getDeliveryInsertionIndex()); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java index 916a5bb8..0920e543 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java @@ -17,6 +17,8 @@ package jsprit.core.algorithm.recreate; import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.AbstractActivity; +import jsprit.core.problem.JobActivityFactory; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.constraint.ConstraintManager; import jsprit.core.problem.cost.AbstractForwardVehicleRoutingTransportCosts; @@ -30,7 +32,6 @@ import jsprit.core.problem.job.Service; import jsprit.core.problem.misc.JobInsertionContext; import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.solution.route.activity.TimeWindow; -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.VehicleType; @@ -48,7 +49,6 @@ import java.util.*; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; @@ -59,9 +59,9 @@ public class TestCalculatesServiceInsertion { VehicleRoutingTransportCosts costs; - Vehicle vehicle; + VehicleImpl vehicle; - Vehicle newVehicle; + VehicleImpl newVehicle; private Service first; @@ -121,7 +121,7 @@ public class TestCalculatesServiceInsertion { jobs.add(third); jobs.add(second); - VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addVehicle(vehicle).setRoutingCost(costs).build(); + final VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addVehicle(vehicle).setRoutingCost(costs).build(); states = new StateManager(vrp); states.updateLoadStates(); @@ -134,13 +134,12 @@ public class TestCalculatesServiceInsertion { VehicleRoutingActivityCosts actCosts = mock(VehicleRoutingActivityCosts.class); serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, actCosts), cManager); - - } - - public TourActivity getActivityMock(String id, double earliestOperationStart, double currCost){ - TourActivity act = mock(TourActivity.class); - when(act.getLocationId()).thenReturn(id); - return act; + serviceInsertion.setJobActivityFactory(new JobActivityFactory() { + @Override + public List createActivities(Job job) { + return vrp.copyAndGetActivities(job); + } + }); } @Test diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java index b2ec0fc6..95a8f5fa 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertionOnRouteLevel.java @@ -19,9 +19,7 @@ package jsprit.core.algorithm.recreate; import jsprit.core.algorithm.ExampleActivityCostFunction; import jsprit.core.algorithm.state.StateManager; import jsprit.core.algorithm.state.UpdateVariableCosts; -import jsprit.core.problem.AbstractVehicle; -import jsprit.core.problem.Capacity; -import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.*; import jsprit.core.problem.constraint.ConstraintManager; import jsprit.core.problem.cost.AbstractForwardVehicleRoutingTransportCosts; import jsprit.core.problem.cost.VehicleRoutingTransportCosts; @@ -46,6 +44,7 @@ import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; @@ -114,7 +113,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { jobs.add(second); jobs.add(third); - VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addVehicle(vehicle).addVehicle(newVehicle).setRoutingCost(costs).build(); + final VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addVehicle(vehicle).addVehicle(newVehicle).setRoutingCost(costs).build(); states = new StateManager(vrp); states.updateLoadStates(); @@ -131,7 +130,12 @@ public class TestCalculatesServiceInsertionOnRouteLevel { serviceInsertion = new ServiceInsertionOnRouteLevelCalculator(costs,activityCosts, actInsertionCostCalculator, cManager, cManager); serviceInsertion.setNuOfActsForwardLooking(4); serviceInsertion.setStates(states); - + serviceInsertion.setJobActivityFactory(new JobActivityFactory() { + @Override + public List createActivities(Job job) { + return vrp.copyAndGetActivities(job); + } + }); } diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestRouteLevelActivityInsertionCostEstimator.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestRouteLevelActivityInsertionCostEstimator.java index c6053a58..9894c493 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestRouteLevelActivityInsertionCostEstimator.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestRouteLevelActivityInsertionCostEstimator.java @@ -85,7 +85,7 @@ public class TestRouteLevelActivityInsertionCostEstimator { route = VehicleRoute.Builder.newInstance(vehicle).setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return vrp.copyAndGetActivities(job); } diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestRouteLevelServiceInsertionCostEstimator.java b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestRouteLevelServiceInsertionCostEstimator.java index ab455fc0..28a495c1 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestRouteLevelServiceInsertionCostEstimator.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/recreate/TestRouteLevelServiceInsertionCostEstimator.java @@ -20,6 +20,8 @@ package jsprit.core.algorithm.recreate; import jsprit.core.algorithm.state.StateManager; import jsprit.core.algorithm.state.UpdateVariableCosts; +import jsprit.core.problem.AbstractActivity; +import jsprit.core.problem.JobActivityFactory; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.constraint.ConstraintManager; import jsprit.core.problem.cost.VehicleRoutingActivityCosts; @@ -28,6 +30,7 @@ import jsprit.core.problem.driver.Driver; import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Service; import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.PickupService; import jsprit.core.problem.solution.route.activity.TimeWindow; import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.vehicle.Vehicle; @@ -40,10 +43,10 @@ import org.junit.Test; import java.util.Arrays; import java.util.Collections; +import java.util.List; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; /** * Created by schroeder on 02.07.14. @@ -60,9 +63,16 @@ public class TestRouteLevelServiceInsertionCostEstimator { private ConstraintManager constraintManager; + private VehicleRoutingProblem vrp; + + private JobActivityFactory activityFactory; + @Before public void doBefore(){ + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + routingCosts = CostFactory.createEuclideanCosts(); + vrpBuilder.setRoutingCost(routingCosts); activityCosts = new VehicleRoutingActivityCosts() { @@ -72,57 +82,94 @@ public class TestRouteLevelServiceInsertionCostEstimator { } }; + vrpBuilder.setActivityCosts(activityCosts); + Service s1 = Service.Builder.newInstance("s1").setLocationId("10,0").setTimeWindow(TimeWindow.newInstance(10.,10.)).build(); Service s2 = Service.Builder.newInstance("s2").setLocationId("20,0").setTimeWindow(TimeWindow.newInstance(20.,20.)).build(); Service s3 = Service.Builder.newInstance("s3").setLocationId("30,0").setTimeWindow(TimeWindow.newInstance(30.,30.)).build(); + vrpBuilder.addJob(s1).addJob(s2).addJob(s3); VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build(); - Vehicle vehicle = VehicleImpl.Builder.newInstance("vehicle").setStartLocationId("0,0").setType(type).build(); + VehicleImpl vehicle = VehicleImpl.Builder.newInstance("vehicle").setStartLocationId("0,0").setType(type).build(); + vrpBuilder.addVehicle(vehicle); + vrp = vrpBuilder.build(); - route = VehicleRoute.Builder.newInstance(vehicle).addService(s1).addService(s2).addService(s3).build(); + activityFactory = new JobActivityFactory() { + @Override + public List createActivities(Job job) { + return vrp.copyAndGetActivities(job); + } + }; + route = VehicleRoute.Builder.newInstance(vehicle).setJobActivityFactory(activityFactory).addService(s1).addService(s2).addService(s3).build(); stateManager = new StateManager(mock(VehicleRoutingProblem.class)); stateManager.addStateUpdater(new UpdateVariableCosts(activityCosts,routingCosts,stateManager)); stateManager.informInsertionStarts(Arrays.asList(route), Collections.emptyList()); - - VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class); - when(vrp.getTransportCosts()).thenReturn(routingCosts); - constraintManager = new ConstraintManager(vrp,stateManager); } @Test public void whenNewServiceNeedToBeInserted_itShouldReturnCorrectInsertionCosts(){ - Service s4 = Service.Builder.newInstance("s4").setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(5.,5.)).build(); + final Service s4 = Service.Builder.newInstance("s4").setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(5.,5.)).build(); RouteLevelActivityInsertionCostsEstimator estimator = new RouteLevelActivityInsertionCostsEstimator(routingCosts,activityCosts,stateManager); estimator.setForwardLooking(0); ServiceInsertionOnRouteLevelCalculator routeInserter = new ServiceInsertionOnRouteLevelCalculator(routingCosts, activityCosts,estimator,constraintManager,constraintManager); routeInserter.setStates(stateManager); + routeInserter.setJobActivityFactory(new JobActivityFactory() { + @Override + public List createActivities(Job job) { + List acts = activityFactory.createActivities(job); + if(acts.isEmpty()){ + acts.add(new PickupService(s4)); + } + return acts; + } + }); InsertionData iData = routeInserter.getInsertionData(route,s4,route.getVehicle(),route.getDepartureTime(),route.getDriver(),Double.MAX_VALUE); assertEquals(0.,iData.getInsertionCost(),0.01); } @Test public void whenNewServiceNeedToBeInserted_itShouldReturnCorrectInsertionIndex(){ - Service s4 = Service.Builder.newInstance("s4").setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(5.,5.)).build(); + final Service s4 = Service.Builder.newInstance("s4").setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(5.,5.)).build(); RouteLevelActivityInsertionCostsEstimator estimator = new RouteLevelActivityInsertionCostsEstimator(routingCosts,activityCosts,stateManager); estimator.setForwardLooking(0); - ServiceInsertionOnRouteLevelCalculator routeInserter = new ServiceInsertionOnRouteLevelCalculator(routingCosts, + final ServiceInsertionOnRouteLevelCalculator routeInserter = new ServiceInsertionOnRouteLevelCalculator(routingCosts, activityCosts,estimator,constraintManager,constraintManager); routeInserter.setStates(stateManager); + routeInserter.setJobActivityFactory(new JobActivityFactory() { + @Override + public List createActivities(Job job) { + List acts = activityFactory.createActivities(job); + if(acts.isEmpty()){ + acts.add(new PickupService(s4)); + } + return acts; + } + }); InsertionData iData = routeInserter.getInsertionData(route,s4,route.getVehicle(),route.getDepartureTime(),route.getDriver(),Double.MAX_VALUE); assertEquals(0,iData.getDeliveryInsertionIndex(),0.01); } @Test public void whenNewServiceWithServiceTimeNeedToBeInserted_itShouldReturnCorrectInsertionData(){ - Service s4 = Service.Builder.newInstance("s4").setServiceTime(10.).setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(5.,5.)).build(); + final Service s4 = Service.Builder.newInstance("s4").setServiceTime(10.).setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(5.,5.)).build(); RouteLevelActivityInsertionCostsEstimator estimator = new RouteLevelActivityInsertionCostsEstimator(routingCosts,activityCosts,stateManager); estimator.setForwardLooking(0); ServiceInsertionOnRouteLevelCalculator routeInserter = new ServiceInsertionOnRouteLevelCalculator(routingCosts, activityCosts,estimator,constraintManager,constraintManager); routeInserter.setStates(stateManager); + routeInserter.setJobActivityFactory(new JobActivityFactory() { + @Override + public List createActivities(Job job) { + List acts = activityFactory.createActivities(job); + if(acts.isEmpty()){ + acts.add(new PickupService(s4)); + } + return acts; + } + }); InsertionData iData = routeInserter.getInsertionData(route,s4,route.getVehicle(),route.getDepartureTime(),route.getDriver(),Double.MAX_VALUE); assertEquals(0,iData.getDeliveryInsertionIndex(),0.01); assertEquals(30.,iData.getInsertionCost(),0.01); @@ -131,7 +178,7 @@ public class TestRouteLevelServiceInsertionCostEstimator { @Test public void whenNewServiceWithServiceTimeNeedToBeInsertedAndRouteIsEmpty_itShouldReturnCorrectInsertionData(){ - Service s4 = Service.Builder.newInstance("s4").setServiceTime(10.).setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(5.,5.)).build(); + final Service s4 = Service.Builder.newInstance("s4").setServiceTime(10.).setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(5.,5.)).build(); // PickupActivity pickupService = new PickupService(s4); VehicleRoute emptyroute = VehicleRoute.emptyRoute(); RouteLevelActivityInsertionCostsEstimator estimator = new RouteLevelActivityInsertionCostsEstimator(routingCosts,activityCosts,stateManager); @@ -139,6 +186,16 @@ public class TestRouteLevelServiceInsertionCostEstimator { ServiceInsertionOnRouteLevelCalculator routeInserter = new ServiceInsertionOnRouteLevelCalculator(routingCosts, activityCosts,estimator,constraintManager,constraintManager); routeInserter.setStates(stateManager); + routeInserter.setJobActivityFactory(new JobActivityFactory() { + @Override + public List createActivities(Job job) { + List acts = activityFactory.createActivities(job); + if(acts.isEmpty()){ + acts.add(new PickupService(s4)); + } + return acts; + } + }); InsertionData iData = routeInserter.getInsertionData(emptyroute,s4,route.getVehicle(),route.getDepartureTime(),route.getDriver(),Double.MAX_VALUE); assertEquals(0,iData.getDeliveryInsertionIndex(),0.01); assertEquals(10.,iData.getInsertionCost(),0.01); @@ -146,7 +203,7 @@ public class TestRouteLevelServiceInsertionCostEstimator { @Test public void whenNewServiceWithServiceTimeAndTWNeedToBeInsertedAndRouteIsEmpty_itShouldReturnCorrectInsertionData(){ - Service s4 = Service.Builder.newInstance("s4").setServiceTime(10.).setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(3.,3.)).build(); + final Service s4 = Service.Builder.newInstance("s4").setServiceTime(10.).setLocationId("5,0").setTimeWindow(TimeWindow.newInstance(3.,3.)).build(); // PickupActivity pickupService = new PickupService(s4); VehicleRoute emptyroute = VehicleRoute.emptyRoute(); RouteLevelActivityInsertionCostsEstimator estimator = new RouteLevelActivityInsertionCostsEstimator(routingCosts,activityCosts,stateManager); @@ -154,6 +211,16 @@ public class TestRouteLevelServiceInsertionCostEstimator { ServiceInsertionOnRouteLevelCalculator routeInserter = new ServiceInsertionOnRouteLevelCalculator(routingCosts, activityCosts,estimator,constraintManager,constraintManager); routeInserter.setStates(stateManager); + routeInserter.setJobActivityFactory(new JobActivityFactory() { + @Override + public List createActivities(Job job) { + List acts = activityFactory.createActivities(job); + if(acts.isEmpty()){ + acts.add(new PickupService(s4)); + } + return acts; + } + }); InsertionData iData = routeInserter.getInsertionData(emptyroute,s4,route.getVehicle(),route.getDepartureTime(),route.getDriver(),Double.MAX_VALUE); assertEquals(0,iData.getDeliveryInsertionIndex(),0.01); assertEquals(10.+2.,iData.getInsertionCost(),0.01); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/state/LoadStateTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/LoadStateTest.java index af626b25..86bb1783 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/state/LoadStateTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/LoadStateTest.java @@ -62,7 +62,7 @@ public class LoadStateTest { serviceRouteBuilder.setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return serviceProblem.copyAndGetActivities(job); } @@ -72,7 +72,7 @@ public class LoadStateTest { VehicleRoute.Builder pdRouteBuilder = VehicleRoute.Builder.newInstance(vehicle); pdRouteBuilder.setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return pdProblem.copyAndGetActivities(job); } }); @@ -81,7 +81,7 @@ public class LoadStateTest { VehicleRoute.Builder shipmentRouteBuilder = VehicleRoute.Builder.newInstance(vehicle); shipmentRouteBuilder.setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return shipmentProblem.copyAndGetActivities(job); } }); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/state/Solomon_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/Solomon_IT.java new file mode 100644 index 00000000..4470371e --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/Solomon_IT.java @@ -0,0 +1,32 @@ +package jsprit.core.algorithm.state; + +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.io.VrpXMLReader; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.util.Solutions; +import org.junit.Test; + +import java.util.Collection; + +import static org.junit.Assert.assertEquals; + +/** + * Created by schroeder on 23.07.14. + */ +public class Solomon_IT { + + @Test + public void itShouldFindTheBestKnownSolution(){ + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpBuilder).read("src/test/resources/solomon_c101.xml"); + VehicleRoutingProblem vrp = vrpBuilder.build(); + + VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp,"src/test/resources/algorithmConfig.xml"); + vra.setNuOfIterations(500); + Collection solutions = vra.searchSolutions(); + assertEquals(828.94, Solutions.bestOf(solutions).getCost(),0.01); + } + +} diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdatePracticalTimeWindowTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdatePracticalTimeWindowTest.java index 0e175dea..11a26357 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdatePracticalTimeWindowTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdatePracticalTimeWindowTest.java @@ -73,7 +73,7 @@ public class UpdatePracticalTimeWindowTest { route = VehicleRoute.Builder.newInstance(vehicle, mock(Driver.class)).setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return vrp.copyAndGetActivities(job); } }) diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateVehicleDependentTimeWindowTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateVehicleDependentTimeWindowTest.java index b6c0112f..5d8071d5 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateVehicleDependentTimeWindowTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateVehicleDependentTimeWindowTest.java @@ -77,7 +77,7 @@ public class UpdateVehicleDependentTimeWindowTest { route = VehicleRoute.Builder.newInstance(vehicle).setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return vrp.copyAndGetActivities(job); } }).addService(service).addService(service2).addService(service3).build(); diff --git a/jsprit-core/src/test/java/jsprit/core/problem/constraint/LoadConstraintTest.java b/jsprit-core/src/test/java/jsprit/core/problem/constraint/LoadConstraintTest.java index c0651452..e5979e20 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/constraint/LoadConstraintTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/constraint/LoadConstraintTest.java @@ -64,7 +64,7 @@ public class LoadConstraintTest { serviceRouteBuilder.setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return serviceProblem.copyAndGetActivities(job); } @@ -74,7 +74,7 @@ public class LoadConstraintTest { VehicleRoute.Builder pdRouteBuilder = VehicleRoute.Builder.newInstance(vehicle); pdRouteBuilder.setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return pdProblem.copyAndGetActivities(job); } }); @@ -83,7 +83,7 @@ public class LoadConstraintTest { VehicleRoute.Builder shipmentRouteBuilder = VehicleRoute.Builder.newInstance(vehicle); shipmentRouteBuilder.setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return shipmentProblem.copyAndGetActivities(job); } }); diff --git a/jsprit-core/src/test/java/jsprit/core/problem/constraint/VehicleDependentTimeWindowTest.java b/jsprit-core/src/test/java/jsprit/core/problem/constraint/VehicleDependentTimeWindowTest.java index d8b93d2b..8af2233e 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/constraint/VehicleDependentTimeWindowTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/constraint/VehicleDependentTimeWindowTest.java @@ -82,7 +82,7 @@ public class VehicleDependentTimeWindowTest { route = VehicleRoute.Builder.newInstance(vehicle).setJobActivityFactory(new JobActivityFactory() { @Override - public List createActivity(Job job) { + public List createActivities(Job job) { return vrp.copyAndGetActivities(job); }