diff --git a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java index 53d8d73f..47be6346 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java +++ b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java @@ -216,9 +216,9 @@ class CalculatorBuilder { if(constraintManager == null) throw new IllegalStateException("constraint-manager is null"); ActivityInsertionCostsCalculator defaultCalc = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), constraintManager); - JobInsertionCalculator standardServiceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), defaultCalc, constraintManager); + JobInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), defaultCalc, constraintManager); - ((CalculatesServiceInsertion) standardServiceInsertion).setNeighborhood(vrp.getNeighborhood()); + ((ServiceInsertionCalculator) standardServiceInsertion).setNeighborhood(vrp.getNeighborhood()); CalculatorPlusListeners calcPlusListeners = new CalculatorPlusListeners(standardServiceInsertion); return calcPlusListeners; diff --git a/jsprit-core/src/main/java/algorithms/JobCalculatorSwitcher.java b/jsprit-core/src/main/java/algorithms/JobCalculatorSwitcher.java new file mode 100644 index 00000000..617da19d --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/JobCalculatorSwitcher.java @@ -0,0 +1,25 @@ +package algorithms; + +import java.util.HashMap; +import java.util.Map; + +import basics.Job; +import basics.route.Driver; +import basics.route.Vehicle; +import basics.route.VehicleRoute; + +public class JobCalculatorSwitcher implements JobInsertionCalculator{ + + private Map,JobInsertionCalculator> calcMap = new HashMap, JobInsertionCalculator>(); + + void put(Class jobClass, JobInsertionCalculator jic){ + calcMap.put(jobClass, jic); + } + + public InsertionData calculate(VehicleRoute currentRoute, Job jobToInsert, Vehicle newVehicle, double newVehicleDepartureTime, Driver newDriver, double bestKnownScore){ + JobInsertionCalculator jic = calcMap.get(jobToInsert.getClass()); + if(jic==null) throw new IllegalStateException("cannot find calculator for " + jobToInsert.getClass()); + return jic.calculate(currentRoute, jobToInsert, newVehicle, newVehicleDepartureTime, newDriver, bestKnownScore); + } + +} diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java b/jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java similarity index 96% rename from jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java rename to jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java index e3042b28..582f395a 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java +++ b/jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java @@ -36,9 +36,9 @@ import basics.route.VehicleRoute; -final class CalculatesServiceInsertion implements JobInsertionCalculator{ +final class ServiceInsertionCalculator implements JobInsertionCalculator{ - private static final Logger logger = Logger.getLogger(CalculatesServiceInsertion.class); + private static final Logger logger = Logger.getLogger(ServiceInsertionCalculator.class); private HardRouteLevelConstraint hardRouteLevelConstraint; @@ -61,7 +61,7 @@ final class CalculatesServiceInsertion implements JobInsertionCalculator{ logger.info("initialise neighborhood " + neighborhood); } - public CalculatesServiceInsertion(VehicleRoutingTransportCosts routingCosts, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, HardRouteLevelConstraint hardRouteLevelConstraint) { + public ServiceInsertionCalculator(VehicleRoutingTransportCosts routingCosts, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, HardRouteLevelConstraint hardRouteLevelConstraint) { super(); this.activityInsertionCostsCalculator = activityInsertionCostsCalculator; this.hardRouteLevelConstraint = hardRouteLevelConstraint; diff --git a/jsprit-core/src/main/java/basics/route/DeliverService.java b/jsprit-core/src/main/java/basics/route/DeliverService.java index bda27137..12ad4adb 100644 --- a/jsprit-core/src/main/java/basics/route/DeliverService.java +++ b/jsprit-core/src/main/java/basics/route/DeliverService.java @@ -81,4 +81,8 @@ public final class DeliverService implements DeliveryActivity{ return delivery; } + @Override + public String toString() { + return "[act="+getName()+"][loc="+getLocationId()+"]"; + } } diff --git a/jsprit-core/src/main/java/basics/route/PickupService.java b/jsprit-core/src/main/java/basics/route/PickupService.java index 11a46c9c..26139e95 100644 --- a/jsprit-core/src/main/java/basics/route/PickupService.java +++ b/jsprit-core/src/main/java/basics/route/PickupService.java @@ -86,6 +86,9 @@ public final class PickupService implements PickupActivity{ return pickup.getCapacityDemand(); } - + @Override + public String toString() { + return "[act="+getName()+"][loc="+getLocationId()+"]"; + } } diff --git a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java index a625bab6..00659c2e 100644 --- a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java @@ -61,7 +61,7 @@ public class BuildCVRPAlgoFromScratchTest { } }; ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), hardActLevelConstraint); - CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); + ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles()); JobInsertionCalculator finalServiceInsertion = new CalculatesVehTypeDepServiceInsertion(fleetManager, serviceInsertion); diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java index 74935c5c..138f0e83 100644 --- a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java @@ -67,7 +67,7 @@ public class BuildPDVRPAlgoFromScratchTest { ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), actLevelConstraintAccumulator); - CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardPickupAndDeliveryLoadConstraint(stateManager)); + ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardPickupAndDeliveryLoadConstraint(stateManager)); // CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles()); diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java index 598f54a7..5f28c633 100644 --- a/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java @@ -35,6 +35,7 @@ import algorithms.selectors.SelectBest; import basics.Delivery; import basics.Job; import basics.Pickup; +import basics.Service; import basics.Shipment; import basics.VehicleRoutingAlgorithm; import basics.VehicleRoutingProblem; @@ -69,7 +70,11 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest { Shipment s1 = Shipment.Builder.newInstance("s1", 1).setPickupCoord(Coordinate.newInstance(0, 0)).setDeliveryCoord(Coordinate.newInstance(10, 10)).build(); Shipment s2 = Shipment.Builder.newInstance("s2", 1).setPickupCoord(Coordinate.newInstance(1, 1)).setDeliveryCoord(Coordinate.newInstance(10, 10)).build(); - builder.addJob(s1).addJob(s2); + + Service serv1 = Service.Builder.newInstance("serv1", 1).setCoord(Coordinate.newInstance(0, 5)).build(); + Service serv2 = Service.Builder.newInstance("serv2", 1).setCoord(Coordinate.newInstance(5, 0)).build(); + + builder.addJob(s1).addJob(s2).addJob(serv1).addJob(serv2); builder.addVehicle(v); vrp = builder.build(); @@ -82,11 +87,16 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest { ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), actLevelConstraintAccumulator); - ShipmentInsertionCalculator serviceInsertion = new ShipmentInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardPickupAndDeliveryLoadConstraint(stateManager)); -// CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); + ShipmentInsertionCalculator shipmentInsertion = new ShipmentInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardPickupAndDeliveryLoadConstraint(stateManager)); + + ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); + + JobCalculatorSwitcher switcher = new JobCalculatorSwitcher(); + switcher.put(Shipment.class, shipmentInsertion); + switcher.put(Service.class, serviceInsertion); VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles()); - JobInsertionCalculator finalServiceInsertion = new CalculatesVehTypeDepServiceInsertion(fleetManager, serviceInsertion); + JobInsertionCalculator finalServiceInsertion = new CalculatesVehTypeDepServiceInsertion(fleetManager, switcher); BestInsertion bestInsertion = new BestInsertion(finalServiceInsertion); diff --git a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java index 7fb0e227..01701200 100644 --- a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java +++ b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java @@ -148,7 +148,7 @@ public class GendreauPostOptTest { activityCosts = new ExampleActivityCostFunction(); - CalculatesServiceInsertion standardServiceInsertion = new CalculatesServiceInsertion(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts, new HardConstraints.HardTimeWindowActivityLevelConstraint(states, cost)), new HardConstraints.HardLoadConstraint(states)); + ServiceInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts, new HardConstraints.HardTimeWindowActivityLevelConstraint(states, cost)), new HardConstraints.HardLoadConstraint(states)); CalculatesServiceInsertionConsideringFixCost withFixCost = new CalculatesServiceInsertionConsideringFixCost(standardServiceInsertion, states); withFixCost.setWeightOfFixCost(1.2); diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java index 03cc8b05..b6c3e7fd 100644 --- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java +++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java @@ -45,7 +45,7 @@ import basics.route.VehicleRoute; public class TestCalculatesServiceInsertion { - CalculatesServiceInsertion serviceInsertion; + ServiceInsertionCalculator serviceInsertion; VehicleRoutingTransportCosts costs; @@ -153,7 +153,7 @@ public class TestCalculatesServiceInsertion { ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction(); - serviceInsertion = new CalculatesServiceInsertion(costs, new LocalActivityInsertionCostsCalculator(costs, activityCosts, new HardConstraints.HardTimeWindowActivityLevelConstraint(states, costs)), new HardConstraints.HardLoadConstraint(states)); + serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, activityCosts, new HardConstraints.HardTimeWindowActivityLevelConstraint(states, costs)), new HardConstraints.HardLoadConstraint(states)); stateUpdater = new UpdateStates(states, costs, activityCosts);