From 89f864492f7539221a2ea8d10b78624dfe30dd67 Mon Sep 17 00:00:00 2001 From: oblonski Date: Tue, 24 Jul 2018 10:06:02 +0200 Subject: [PATCH] make job insertion more flexible --- .../recreate/BreakInsertionCalculator.java | 22 ++++---- .../algorithm/recreate/BreakScheduling.java | 3 +- .../recreate/JobInsertionCostsCalculator.java | 2 +- .../JobInsertionCostsCalculatorBuilder.java | 32 +++++++++--- .../JobInsertionCostsCalculatorFactory.java | 29 +++++++++++ .../recreate/ServiceInsertionCalculator.java | 25 ++++------ .../recreate/ShipmentInsertionCalculator.java | 25 ++++------ ...erviceInsertionAndLoadConstraintsTest.java | 11 ++-- .../ShipmentInsertionCalculatorTest.java | 50 ++++++++++--------- .../TestCalculatesServiceInsertion.java | 4 +- 10 files changed, 119 insertions(+), 84 deletions(-) create mode 100644 jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculatorFactory.java diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakInsertionCalculator.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakInsertionCalculator.java index f706f4a0..e94bad61 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakInsertionCalculator.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakInsertionCalculator.java @@ -49,25 +49,25 @@ final class BreakInsertionCalculator implements JobInsertionCostsCalculator { private static final Logger logger = LoggerFactory.getLogger(BreakInsertionCalculator.class); - private HardRouteConstraint hardRouteLevelConstraint; + private final HardRouteConstraint hardRouteLevelConstraint; - private HardActivityConstraint hardActivityLevelConstraint; + private final HardActivityConstraint hardActivityLevelConstraint; - private SoftRouteConstraint softRouteConstraint; + private final SoftRouteConstraint softRouteConstraint; - private SoftActivityConstraint softActivityConstraint; + private final SoftActivityConstraint softActivityConstraint; - private VehicleRoutingTransportCosts transportCosts; + private final VehicleRoutingTransportCosts transportCosts; private final VehicleRoutingActivityCosts activityCosts; - private ActivityInsertionCostsCalculator additionalTransportCostsCalculator; + private final ActivityInsertionCostsCalculator additionalTransportCostsCalculator; - private JobActivityFactory activityFactory; + private final JobActivityFactory activityFactory; - private AdditionalAccessEgressCalculator additionalAccessEgressCalculator; + private final AdditionalAccessEgressCalculator additionalAccessEgressCalculator; - public BreakInsertionCalculator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts, ActivityInsertionCostsCalculator additionalTransportCostsCalculator, ConstraintManager constraintManager) { + public BreakInsertionCalculator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts, ActivityInsertionCostsCalculator additionalTransportCostsCalculator, ConstraintManager constraintManager, JobActivityFactory activityFactory) { super(); this.transportCosts = routingCosts; this.activityCosts = activityCosts; @@ -77,12 +77,10 @@ final class BreakInsertionCalculator implements JobInsertionCostsCalculator { softRouteConstraint = constraintManager; this.additionalTransportCostsCalculator = additionalTransportCostsCalculator; additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts); + this.activityFactory = activityFactory; logger.debug("initialise " + this); } - public void setJobActivityFactory(JobActivityFactory jobActivityFactory) { - this.activityFactory = jobActivityFactory; - } @Override public String toString() { diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java index 90a7076f..66fbb182 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/BreakScheduling.java @@ -49,8 +49,7 @@ public class BreakScheduling implements InsertionStartsListener,JobInsertedListe public BreakScheduling(VehicleRoutingProblem vrp, StateManager stateManager, ConstraintManager constraintManager) { this.stateManager = stateManager; - this.breakInsertionCalculator = new BreakInsertionCalculator(vrp.getTransportCosts(),vrp.getActivityCosts(),new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(),vrp.getActivityCosts(),stateManager),constraintManager); - this.breakInsertionCalculator.setJobActivityFactory(vrp.getJobActivityFactory()); + this.breakInsertionCalculator = new BreakInsertionCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), stateManager), constraintManager, vrp.getJobActivityFactory()); eventListeners = new EventListeners(); } diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculator.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculator.java index 81d1670c..8a1414e3 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculator.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculator.java @@ -25,6 +25,6 @@ import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; public interface JobInsertionCostsCalculator { - public InsertionData getInsertionData(VehicleRoute currentRoute, Job newJob, Vehicle newVehicle, double newVehicleDepartureTime, Driver newDriver, double bestKnownCosts); + InsertionData getInsertionData(VehicleRoute currentRoute, Job newJob, Vehicle newVehicle, double newVehicleDepartureTime, Driver newDriver, double bestKnownCosts); } diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculatorBuilder.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculatorBuilder.java index 1135adb8..011cfe76 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculatorBuilder.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculatorBuilder.java @@ -94,6 +94,27 @@ public class JobInsertionCostsCalculatorBuilder { private boolean addDefaultCostCalc = true; + private JobInsertionCostsCalculatorFactory shipmentCalculatorFactory = new JobInsertionCostsCalculatorFactory() { + @Override + public JobInsertionCostsCalculator create(VehicleRoutingProblem vrp, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, JobActivityFactory jobActivityFactory, ConstraintManager constraintManager) { + return new ShipmentInsertionCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), activityInsertionCostsCalculator, constraintManager, jobActivityFactory); + } + }; + + private JobInsertionCostsCalculatorFactory serviceCalculatorFactory = new JobInsertionCostsCalculatorFactory() { + @Override + public JobInsertionCostsCalculator create(VehicleRoutingProblem vrp, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, JobActivityFactory jobActivityFactory, ConstraintManager constraintManager) { + return new ServiceInsertionCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), activityInsertionCostsCalculator, constraintManager, jobActivityFactory); + } + }; + + private JobInsertionCostsCalculatorFactory breakCalculatorFactory = new JobInsertionCostsCalculatorFactory() { + @Override + public JobInsertionCostsCalculator create(VehicleRoutingProblem vrp, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, JobActivityFactory jobActivityFactory, ConstraintManager constraintManager) { + return new BreakInsertionCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), activityInsertionCostsCalculator, constraintManager, jobActivityFactory); + } + }; + /** * Constructs the builder. *

@@ -287,20 +308,17 @@ public class JobInsertionCostsCalculatorBuilder { } }; - ShipmentInsertionCalculator shipmentInsertion = new ShipmentInsertionCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(),actInsertionCalc, constraintManager); - shipmentInsertion.setJobActivityFactory(activityFactory); - ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), actInsertionCalc, constraintManager); - serviceInsertion.setJobActivityFactory(activityFactory); - BreakInsertionCalculator breakInsertionCalculator = new BreakInsertionCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), actInsertionCalc, constraintManager); - breakInsertionCalculator.setJobActivityFactory(activityFactory); + JobInsertionCostsCalculator shipmentInsertion = shipmentCalculatorFactory.create(vrp, actInsertionCalc, activityFactory, constraintManager); + JobInsertionCostsCalculator serviceInsertion = serviceCalculatorFactory.create(vrp, actInsertionCalc, activityFactory, constraintManager); + JobInsertionCostsCalculator breakInsertion = breakCalculatorFactory.create(vrp, actInsertionCalc, activityFactory, constraintManager); JobCalculatorSwitcher switcher = new JobCalculatorSwitcher(); switcher.put(Shipment.class, shipmentInsertion); switcher.put(Service.class, serviceInsertion); switcher.put(Pickup.class, serviceInsertion); switcher.put(Delivery.class, serviceInsertion); - switcher.put(Break.class, breakInsertionCalculator); + switcher.put(Break.class, breakInsertion); CalculatorPlusListeners calculatorPlusListeners = new CalculatorPlusListeners(switcher); if (configLocal != null) { diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculatorFactory.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculatorFactory.java new file mode 100644 index 00000000..b683b88d --- /dev/null +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/JobInsertionCostsCalculatorFactory.java @@ -0,0 +1,29 @@ +/* + * Licensed to GraphHopper GmbH under one or more contributor + * license agreements. See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + * + * GraphHopper GmbH licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.graphhopper.jsprit.core.algorithm.recreate; + +import com.graphhopper.jsprit.core.problem.JobActivityFactory; +import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; +import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager; + +public interface JobInsertionCostsCalculatorFactory { + + JobInsertionCostsCalculator create(VehicleRoutingProblem vrp, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, JobActivityFactory jobActivityFactory, ConstraintManager constraintManager); + +} diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java index 9f91ff9b..6007decb 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java @@ -55,38 +55,35 @@ final class ServiceInsertionCalculator extends AbstractInsertionCalculator { // private HardActivityConstraint hardActivityLevelConstraint; - private SoftRouteConstraint softRouteConstraint; + private final SoftRouteConstraint softRouteConstraint; - private SoftActivityConstraint softActivityConstraint; + private final SoftActivityConstraint softActivityConstraint; - private VehicleRoutingTransportCosts transportCosts; + private final VehicleRoutingTransportCosts transportCosts; private final VehicleRoutingActivityCosts activityCosts; - private ActivityInsertionCostsCalculator additionalTransportCostsCalculator; + private final ActivityInsertionCostsCalculator activityInsertionCostsCalculator; - private JobActivityFactory activityFactory; + private final JobActivityFactory activityFactory; - private AdditionalAccessEgressCalculator additionalAccessEgressCalculator; + private final AdditionalAccessEgressCalculator additionalAccessEgressCalculator; - private ConstraintManager constraintManager; + private final ConstraintManager constraintManager; - public ServiceInsertionCalculator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts, ActivityInsertionCostsCalculator additionalTransportCostsCalculator, ConstraintManager constraintManager) { + public ServiceInsertionCalculator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, ConstraintManager constraintManager, JobActivityFactory activityFactory) { super(); this.transportCosts = routingCosts; this.activityCosts = activityCosts; this.constraintManager = constraintManager; softActivityConstraint = constraintManager; softRouteConstraint = constraintManager; - this.additionalTransportCostsCalculator = additionalTransportCostsCalculator; + this.activityInsertionCostsCalculator = activityInsertionCostsCalculator; additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts); + this.activityFactory = activityFactory; logger.debug("initialise {}", this); } - public void setJobActivityFactory(JobActivityFactory jobActivityFactory) { - this.activityFactory = jobActivityFactory; - } - @Override public String toString() { return "[name=calculatesServiceInsertion]"; @@ -151,7 +148,7 @@ final class ServiceInsertionCalculator extends AbstractInsertionCalculator { ConstraintsStatus status = fulfilled(insertionContext, prevAct, deliveryAct2Insert, nextAct, prevActStartTime, failedActivityConstraints, constraintManager); if (status.equals(ConstraintsStatus.FULFILLED)) { double additionalICostsAtActLevel = softActivityConstraint.getCosts(insertionContext, prevAct, deliveryAct2Insert, nextAct, prevActStartTime); - double additionalTransportationCosts = additionalTransportCostsCalculator.getCosts(insertionContext, prevAct, nextAct, deliveryAct2Insert, prevActStartTime); + double additionalTransportationCosts = activityInsertionCostsCalculator.getCosts(insertionContext, prevAct, nextAct, deliveryAct2Insert, prevActStartTime); if (additionalICostsAtRouteLevel + additionalICostsAtActLevel + additionalTransportationCosts < bestCost) { bestCost = additionalICostsAtRouteLevel + additionalICostsAtActLevel + additionalTransportationCosts; insertionIndex = actIndex; diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java index e8698483..d55ff150 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java @@ -48,25 +48,21 @@ final class ShipmentInsertionCalculator extends AbstractInsertionCalculator { private final ConstraintManager constraintManager; -// private HardRouteConstraint hardRouteLevelConstraint; -// -// private HardActivityConstraint hardActivityLevelConstraint; + private final SoftRouteConstraint softRouteConstraint; - private SoftRouteConstraint softRouteConstraint; + private final SoftActivityConstraint softActivityConstraint; - private SoftActivityConstraint softActivityConstraint; + private final ActivityInsertionCostsCalculator activityInsertionCostsCalculator; - private ActivityInsertionCostsCalculator activityInsertionCostsCalculator; + private final VehicleRoutingTransportCosts transportCosts; - private VehicleRoutingTransportCosts transportCosts; + private final VehicleRoutingActivityCosts activityCosts; - private VehicleRoutingActivityCosts activityCosts; + private final JobActivityFactory activityFactory; - private JobActivityFactory activityFactory; + private final AdditionalAccessEgressCalculator additionalAccessEgressCalculator; - private AdditionalAccessEgressCalculator additionalAccessEgressCalculator; - - public ShipmentInsertionCalculator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, ConstraintManager constraintManager) { + public ShipmentInsertionCalculator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, ConstraintManager constraintManager, JobActivityFactory jobActivityFactory) { super(); this.activityInsertionCostsCalculator = activityInsertionCostsCalculator; this.constraintManager = constraintManager; @@ -75,13 +71,10 @@ final class ShipmentInsertionCalculator extends AbstractInsertionCalculator { this.transportCosts = routingCosts; this.activityCosts = activityCosts; additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts); + this.activityFactory = jobActivityFactory; logger.debug("initialise {}", this); } - public void setJobActivityFactory(JobActivityFactory activityFactory) { - this.activityFactory = activityFactory; - } - @Override public String toString() { return "[name=calculatesServiceInsertion]"; diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java index 5a1a3468..3536558a 100644 --- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/ServiceInsertionAndLoadConstraintsTest.java @@ -90,7 +90,7 @@ public class ServiceInsertionAndLoadConstraintsTest { ActivityInsertionCostsCalculator activityInsertionCostsCalculator; - ShipmentInsertionCalculator insertionCalculator; +// ShipmentInsertionCalculator insertionCalculator; VehicleRoutingProblem vehicleRoutingProblem; @@ -109,7 +109,7 @@ public class ServiceInsertionAndLoadConstraintsTest { private void createInsertionCalculator(HardRouteConstraint hardRouteLevelConstraint) { ConstraintManager constraintManager = new ConstraintManager(mock(VehicleRoutingProblem.class), mock(RouteAndActivityStateGetter.class)); constraintManager.addConstraint(hardRouteLevelConstraint); - insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager); +// insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, ); } @Test @@ -143,10 +143,9 @@ public class ServiceInsertionAndLoadConstraintsTest { stateManager.informInsertionStarts(Arrays.asList(route), null); JobCalculatorSwitcher switcher = new JobCalculatorSwitcher(); - ServiceInsertionCalculator serviceInsertionCalc = new ServiceInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager); - serviceInsertionCalc.setJobActivityFactory(activityFactory); - ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager); - insertionCalculator.setJobActivityFactory(activityFactory); + ServiceInsertionCalculator serviceInsertionCalc = new ServiceInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); + ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); + switcher.put(Pickup.class, serviceInsertionCalc); switcher.put(Delivery.class, serviceInsertionCalc); diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java index 9713744a..274bb5fe 100644 --- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/ShipmentInsertionCalculatorTest.java @@ -94,21 +94,24 @@ public class ShipmentInsertionCalculatorTest { Vehicle vehicle; + ConstraintManager constraintManager; + @Before public void doBefore() { routingCosts = CostFactory.createManhattanCosts(); VehicleType type = VehicleTypeImpl.Builder.newInstance("t").addCapacityDimension(0, 2).setCostPerDistance(1).build(); vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("0,0")).setType(type).build(); activityInsertionCostsCalculator = new LocalActivityInsertionCostsCalculator(routingCosts, activityCosts, mock(StateManager.class)); - createInsertionCalculator(hardRouteLevelConstraint); + constraintManager = new ConstraintManager(mock(VehicleRoutingProblem.class), mock(RouteAndActivityStateGetter.class)); + constraintManager.addConstraint(hardRouteLevelConstraint); vehicleRoutingProblem = mock(VehicleRoutingProblem.class); } - private void createInsertionCalculator(HardRouteConstraint hardRouteLevelConstraint) { - ConstraintManager constraintManager = new ConstraintManager(mock(VehicleRoutingProblem.class), mock(RouteAndActivityStateGetter.class)); - constraintManager.addConstraint(hardRouteLevelConstraint); - insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager); - } +// private void createInsertionCalculator(HardRouteConstraint hardRouteLevelConstraint) { +// ConstraintManager constraintManager = new ConstraintManager(mock(VehicleRoutingProblem.class), mock(RouteAndActivityStateGetter.class)); +// constraintManager.addConstraint(hardRouteLevelConstraint); +// insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, ); +// } @Test public void whenCalculatingInsertionCostsOfShipment_itShouldReturnCorrectCostValue() { @@ -119,7 +122,7 @@ public class ShipmentInsertionCalculatorTest { activities.add(new PickupShipment(shipment)); activities.add(new DeliverShipment(shipment)); when(activityFactory.createActivities(shipment)).thenReturn(activities); - insertionCalculator.setJobActivityFactory(activityFactory); + insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); InsertionData iData = insertionCalculator.getInsertionData(route, shipment, vehicle, 0.0, null, Double.MAX_VALUE); assertEquals(40.0, iData.getInsertionCost(), 0.05); } @@ -137,7 +140,7 @@ public class ShipmentInsertionCalculatorTest { activities.add(new PickupShipment(shipment2)); activities.add(new DeliverShipment(shipment2)); when(activityFactory.createActivities(shipment2)).thenReturn(activities); - insertionCalculator.setJobActivityFactory(activityFactory); + insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); InsertionData iData = insertionCalculator.getInsertionData(route, shipment2, vehicle, 0.0, null, Double.MAX_VALUE); assertEquals(0.0, iData.getInsertionCost(), 0.05); @@ -161,7 +164,9 @@ 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); - createInsertionCalculator(new HardRouteConstraint() { + + constraintManager = new ConstraintManager(mock(VehicleRoutingProblem.class), mock(RouteAndActivityStateGetter.class)); + constraintManager.addConstraint(new HardRouteConstraint() { @Override public boolean fulfilled(JobInsertionContext insertionContext) { @@ -175,7 +180,7 @@ public class ShipmentInsertionCalculatorTest { activities.add(new PickupShipment(shipment2)); activities.add(new DeliverShipment(shipment2)); when(activityFactory.createActivities(shipment2)).thenReturn(activities); - insertionCalculator.setJobActivityFactory(activityFactory); + insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); InsertionData iData = insertionCalculator.getInsertionData(route, shipment2, vehicle, 0.0, null, Double.MAX_VALUE); assertTrue(iData instanceof InsertionData.NoInsertionFound); @@ -201,7 +206,7 @@ public class ShipmentInsertionCalculatorTest { activities.add(new PickupShipment(shipment3)); activities.add(new DeliverShipment(shipment3)); when(activityFactory.createActivities(shipment3)).thenReturn(activities); - insertionCalculator.setJobActivityFactory(activityFactory); + insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, null, Double.MAX_VALUE); assertEquals(0.0, iData.getInsertionCost(), 0.05); @@ -226,7 +231,7 @@ public class ShipmentInsertionCalculatorTest { activities.add(new PickupShipment(shipment3)); activities.add(new DeliverShipment(shipment3)); when(activityFactory.createActivities(shipment3)).thenReturn(activities); - insertionCalculator.setJobActivityFactory(activityFactory); + insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, null, Double.MAX_VALUE); @@ -260,8 +265,7 @@ public class ShipmentInsertionCalculatorTest { constraintManager.addConstraint(new ShipmentPickupsFirstConstraint(), ConstraintManager.Priority.CRITICAL); ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, - activityInsertionCostsCalculator, constraintManager); - insertionCalculator.setJobActivityFactory(vrp.getJobActivityFactory()); + activityInsertionCostsCalculator, constraintManager, vrp.getJobActivityFactory()); InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, DriverImpl.noDriver(), Double.MAX_VALUE); assertTrue(iData instanceof InsertionData.NoInsertionFound); @@ -293,22 +297,20 @@ public class ShipmentInsertionCalculatorTest { stateManager.informInsertionStarts(Arrays.asList(route), null); - JobCalculatorSwitcher switcher = new JobCalculatorSwitcher(); - ServiceInsertionCalculator serviceInsertionCalc = new ServiceInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager); - ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager); - switcher.put(Pickup.class, serviceInsertionCalc); - switcher.put(Service.class, serviceInsertionCalc); - switcher.put(Shipment.class, insertionCalculator); - -// Service service = Service.Builder.newInstance("pick", 1).setLocationId("5,5").build(); Pickup service = (Pickup) Pickup.Builder.newInstance("pick").addSizeDimension(0, 1).setLocation(Location.newInstance("5,5")).build(); 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); + + JobCalculatorSwitcher switcher = new JobCalculatorSwitcher(); + ServiceInsertionCalculator serviceInsertionCalc = new ServiceInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); + ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityCosts, activityInsertionCostsCalculator, constraintManager, activityFactory); + switcher.put(Pickup.class, serviceInsertionCalc); + switcher.put(Service.class, serviceInsertionCalc); + switcher.put(Shipment.class, insertionCalculator); + InsertionData iData = switcher.getInsertionData(route, service, vehicle, 0, DriverImpl.noDriver(), Double.MAX_VALUE); // routeActVisitor.visit(route); diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java index 6345e700..fe26084e 100644 --- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/recreate/TestCalculatesServiceInsertion.java @@ -136,13 +136,13 @@ public class TestCalculatesServiceInsertion { VehicleRoutingActivityCosts actCosts = mock(VehicleRoutingActivityCosts.class); - serviceInsertion = new ServiceInsertionCalculator(costs, vrp.getActivityCosts(), new LocalActivityInsertionCostsCalculator(costs, actCosts, states), cManager); - serviceInsertion.setJobActivityFactory(new JobActivityFactory() { + serviceInsertion = new ServiceInsertionCalculator(costs, vrp.getActivityCosts(), new LocalActivityInsertionCostsCalculator(costs, actCosts, states), cManager, new JobActivityFactory() { @Override public List createActivities(Job job) { return vrp.copyAndGetActivities(job); } }); + } @Test