From ba08cbab35405d91b94b487af6f246b5ce8134e1 Mon Sep 17 00:00:00 2001 From: Kandel Irina Date: Tue, 13 Mar 2018 11:31:57 +0200 Subject: [PATCH 1/2] MaxTimeInVehicleConstarint added to Unassigned jobs tracker --- .../SchrimpfInitialThresholdGenerator.java | 2 +- .../core/util/UnassignedJobReasonTracker.java | 2 ++ .../util/UnassignedJobReasonTrackerTest.java | 28 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java index 5be4180a..979caa15 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java @@ -79,7 +79,7 @@ public class SchrimpfInitialThresholdGenerator implements AlgorithmStartsListene logger.info("took {} seconds", ((System.currentTimeMillis() - now) / 1000.0)); logger.debug("initial threshold: {}", initialThreshold); - logger.info("---------------------------------------------------------------------"); + logger.debug("---------------------------------------------------------------------"); } } diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java index 0ab34dec..8e3f6d31 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java @@ -62,6 +62,7 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { codesToHumanReadableReason.put(2, "cannot be visited within time window"); codesToHumanReadableReason.put(3, "does not fit into any vehicle due to capacity"); codesToHumanReadableReason.put(4, "cannot be assigned due to max distance constraint of vehicle"); + codesToHumanReadableReason.put(5, "cannot be assigned due to max time on vehicle constraint of vehicle"); failedConstraintNamesToCode.put("HardSkillConstraint", 1); failedConstraintNamesToCode.put("VehicleDependentTimeWindowConstraints", 2); @@ -69,6 +70,7 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { failedConstraintNamesToCode.put("PickupAndDeliverShipmentLoadActivityLevelConstraint", 3); failedConstraintNamesToCode.put("ServiceLoadActivityLevelConstraint", 3); failedConstraintNamesToCode.put("MaxDistanceConstraint", 4); + failedConstraintNamesToCode.put("MaxTimeInVehicleConstraint", 5); } public void ignore(String simpleNameOfConstraint) { diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java index 0b8f639f..78a937a2 100644 --- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java @@ -22,10 +22,13 @@ import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm; import com.graphhopper.jsprit.core.algorithm.box.Jsprit; import com.graphhopper.jsprit.core.algorithm.state.StateId; import com.graphhopper.jsprit.core.algorithm.state.StateManager; +import com.graphhopper.jsprit.core.algorithm.state.UpdateMaxTimeInVehicle; import com.graphhopper.jsprit.core.problem.Location; import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager; import com.graphhopper.jsprit.core.problem.constraint.MaxDistanceConstraint; +import com.graphhopper.jsprit.core.problem.constraint.MaxTimeInVehicleConstraint; +import com.graphhopper.jsprit.core.problem.job.Delivery; import com.graphhopper.jsprit.core.problem.job.Service; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow; @@ -134,6 +137,31 @@ public class UnassignedJobReasonTrackerTest { Assert.assertEquals(4, reasonTracker.getMostLikelyReasonCode(solution.getUnassignedJobs().iterator().next().getId())); } + @Test + public void shouldReturnCorrectMaxTimeInVehicle() { + Service service = Delivery.Builder.newInstance("1").setLocation(Location.newInstance(51, 50)).setMaxTimeInVehicle(1).build(); + + Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build(); + + final VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().setFleetSize(VehicleRoutingProblem.FleetSize.FINITE).addVehicle(vehicle).addJob(service).build(); + + StateManager stateManager = new StateManager(vrp); + ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager); + StateId id = stateManager.createStateId("max-time"); + StateId openJobsId = stateManager.createStateId("open-jobs-id"); + stateManager.addStateUpdater(new UpdateMaxTimeInVehicle(stateManager, id, vrp.getVehicles(), vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId)); + constraintManager.addConstraint(new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), id, stateManager, vrp, openJobsId), ConstraintManager.Priority.CRITICAL); + + VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setStateAndConstraintManager(stateManager, constraintManager) + .buildAlgorithm(); + UnassignedJobReasonTracker reasonTracker = new UnassignedJobReasonTracker(); + vra.addListener(reasonTracker); + + VehicleRoutingProblemSolution solution = Solutions.bestOf(vra.searchSolutions()); + Assert.assertEquals(1, solution.getUnassignedJobs().size()); + Assert.assertEquals(5, reasonTracker.getMostLikelyReasonCode(solution.getUnassignedJobs().iterator().next().getId())); + } + @Test public void getMostLikelyTest() { Frequency frequency = new Frequency(); From 957fb54b378f67ebabb22e0281797855d0d64755 Mon Sep 17 00:00:00 2001 From: Kandel Irina Date: Tue, 13 Mar 2018 11:31:57 +0200 Subject: [PATCH 2/2] MaxTimeInVehicleConstarint added to Unassigned jobs tracker --- .../SchrimpfInitialThresholdGenerator.java | 2 +- .../core/util/UnassignedJobReasonTracker.java | 2 ++ .../util/UnassignedJobReasonTrackerTest.java | 28 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java index 5be4180a..979caa15 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/acceptor/SchrimpfInitialThresholdGenerator.java @@ -79,7 +79,7 @@ public class SchrimpfInitialThresholdGenerator implements AlgorithmStartsListene logger.info("took {} seconds", ((System.currentTimeMillis() - now) / 1000.0)); logger.debug("initial threshold: {}", initialThreshold); - logger.info("---------------------------------------------------------------------"); + logger.debug("---------------------------------------------------------------------"); } } diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java index 0ab34dec..8e3f6d31 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java @@ -62,6 +62,7 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { codesToHumanReadableReason.put(2, "cannot be visited within time window"); codesToHumanReadableReason.put(3, "does not fit into any vehicle due to capacity"); codesToHumanReadableReason.put(4, "cannot be assigned due to max distance constraint of vehicle"); + codesToHumanReadableReason.put(5, "cannot be assigned due to max time on vehicle constraint of vehicle"); failedConstraintNamesToCode.put("HardSkillConstraint", 1); failedConstraintNamesToCode.put("VehicleDependentTimeWindowConstraints", 2); @@ -69,6 +70,7 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { failedConstraintNamesToCode.put("PickupAndDeliverShipmentLoadActivityLevelConstraint", 3); failedConstraintNamesToCode.put("ServiceLoadActivityLevelConstraint", 3); failedConstraintNamesToCode.put("MaxDistanceConstraint", 4); + failedConstraintNamesToCode.put("MaxTimeInVehicleConstraint", 5); } public void ignore(String simpleNameOfConstraint) { diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java index 0b8f639f..78a937a2 100644 --- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java @@ -22,10 +22,13 @@ import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm; import com.graphhopper.jsprit.core.algorithm.box.Jsprit; import com.graphhopper.jsprit.core.algorithm.state.StateId; import com.graphhopper.jsprit.core.algorithm.state.StateManager; +import com.graphhopper.jsprit.core.algorithm.state.UpdateMaxTimeInVehicle; import com.graphhopper.jsprit.core.problem.Location; import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager; import com.graphhopper.jsprit.core.problem.constraint.MaxDistanceConstraint; +import com.graphhopper.jsprit.core.problem.constraint.MaxTimeInVehicleConstraint; +import com.graphhopper.jsprit.core.problem.job.Delivery; import com.graphhopper.jsprit.core.problem.job.Service; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow; @@ -134,6 +137,31 @@ public class UnassignedJobReasonTrackerTest { Assert.assertEquals(4, reasonTracker.getMostLikelyReasonCode(solution.getUnassignedJobs().iterator().next().getId())); } + @Test + public void shouldReturnCorrectMaxTimeInVehicle() { + Service service = Delivery.Builder.newInstance("1").setLocation(Location.newInstance(51, 50)).setMaxTimeInVehicle(1).build(); + + Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build(); + + final VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().setFleetSize(VehicleRoutingProblem.FleetSize.FINITE).addVehicle(vehicle).addJob(service).build(); + + StateManager stateManager = new StateManager(vrp); + ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager); + StateId id = stateManager.createStateId("max-time"); + StateId openJobsId = stateManager.createStateId("open-jobs-id"); + stateManager.addStateUpdater(new UpdateMaxTimeInVehicle(stateManager, id, vrp.getVehicles(), vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId)); + constraintManager.addConstraint(new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), id, stateManager, vrp, openJobsId), ConstraintManager.Priority.CRITICAL); + + VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setStateAndConstraintManager(stateManager, constraintManager) + .buildAlgorithm(); + UnassignedJobReasonTracker reasonTracker = new UnassignedJobReasonTracker(); + vra.addListener(reasonTracker); + + VehicleRoutingProblemSolution solution = Solutions.bestOf(vra.searchSolutions()); + Assert.assertEquals(1, solution.getUnassignedJobs().size()); + Assert.assertEquals(5, reasonTracker.getMostLikelyReasonCode(solution.getUnassignedJobs().iterator().next().getId())); + } + @Test public void getMostLikelyTest() { Frequency frequency = new Frequency();