diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/StateManager.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/StateManager.java index 9d9fbb63..fe10f16d 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/StateManager.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/StateManager.java @@ -301,7 +301,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart */ @Override public T getRouteState(VehicleRoute route, StateId stateId, Class type) { - if (route.isEmpty()) return null; + if (route == null) return null; T state = null; if(isIndexedBased){ try { @@ -351,7 +351,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart * @throws java.lang.IllegalStateException if !route.isEmpty() and act(0).getIndex()==0 since this suggests that act has no index at all */ public T getRouteState(VehicleRoute route, Vehicle vehicle, StateId stateId, Class type) { - if (route.isEmpty()) return null; +// if (route.isEmpty()) return null; T state = null; if(isIndexedBased){ try { @@ -458,7 +458,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart } void putTypedInternalRouteState(VehicleRoute route, StateId stateId, T state) { - if (route.isEmpty()) return; +// if (route.isEmpty()) return; if(isIndexedBased){ routeStatesArr[route.getVehicle().getIndex()][stateId.getIndex()] = state; } @@ -471,7 +471,7 @@ public class StateManager implements RouteAndActivityStateGetter, IterationStart } void putTypedInternalRouteState(VehicleRoute route, Vehicle vehicle, StateId stateId, T state) { - if (route.isEmpty()) return; +// if (route.isEmpty()) return; if(isIndexedBased){ vehicleDependentRouteStatesArr[route.getVehicle().getIndex()][vehicle.getVehicleTypeIdentifier().getIndex()][stateId.getIndex()] = state; } diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyser.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyser.java index e6cedd77..cdb82f5c 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyser.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyser.java @@ -355,11 +355,11 @@ public class SolutionAnalyser { private static class DistanceUpdater implements StateUpdater, ActivityVisitor { - private StateId distance_id; + private StateId distanceId; private StateManager stateManager; - private double sum_distance = 0.; + private double sumDistance = 0.; private TransportDistance distanceCalculator; @@ -367,15 +367,15 @@ public class SolutionAnalyser { private VehicleRoute route; - private DistanceUpdater(StateId distance_id, StateManager stateManager, TransportDistance distanceCalculator) { - this.distance_id = distance_id; + private DistanceUpdater(StateId distanceId, StateManager stateManager, TransportDistance distanceCalculator) { + this.distanceId = distanceId; this.stateManager = stateManager; this.distanceCalculator = distanceCalculator; } @Override public void begin(VehicleRoute route) { - sum_distance = 0.; + sumDistance = 0.; this.route = route; this.prevAct = route.getStart(); } @@ -383,16 +383,16 @@ public class SolutionAnalyser { @Override public void visit(TourActivity activity) { double distance = distanceCalculator.getDistance(prevAct.getLocation(), activity.getLocation(), prevAct.getEndTime(), route.getVehicle()); - sum_distance += distance; - stateManager.putActivityState(activity, distance_id, sum_distance); + sumDistance += distance; + stateManager.putActivityState(activity, distanceId, sumDistance); prevAct = activity; } @Override public void finish() { double distance = distanceCalculator.getDistance(prevAct.getLocation(), route.getEnd().getLocation(),prevAct.getEndTime(), route.getVehicle()); - sum_distance += distance; - stateManager.putRouteState(route, distance_id, sum_distance); + sumDistance += distance; + stateManager.putRouteState(route, distanceId, sumDistance); } } @@ -446,27 +446,27 @@ public class SolutionAnalyser { private TransportDistance distanceCalculator; - private StateId waiting_time_id; + private StateId waitingTimeId; - private StateId transport_time_id; + private StateId transportTimeId; - private StateId service_time_id; + private StateId serviceTimeId; - private StateId distance_id; + private StateId distanceId; - private StateId too_late_id; + private StateId tooLateId; - private StateId shipment_id; + private StateId shipmentId; - private StateId backhaul_id; + private StateId backhaulId; - private StateId skill_id; + private StateId skillId; - private StateId last_transport_distance_id; + private StateId lastTransportDistanceId; - private StateId last_transport_time_id; + private StateId lastTransportTimeId; - private StateId last_transport_cost_id; + private StateId lastTransportCostId; private ActivityTimeTracker.ActivityPolicy activityPolicy; @@ -533,24 +533,24 @@ public class SolutionAnalyser { activityPolicy = ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS; this.stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), activityPolicy, vrp.getActivityCosts())); this.stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); - waiting_time_id = stateManager.createStateId("waiting-time"); - transport_time_id = stateManager.createStateId("transport-time"); - service_time_id = stateManager.createStateId("service-time"); - distance_id = stateManager.createStateId("distance"); - too_late_id = stateManager.createStateId("too-late"); - shipment_id = stateManager.createStateId("shipment"); - backhaul_id = stateManager.createStateId("backhaul"); - skill_id = stateManager.createStateId("skills-violated"); - last_transport_cost_id = stateManager.createStateId("last-transport-cost"); - last_transport_distance_id = stateManager.createStateId("last-transport-distance"); - last_transport_time_id = stateManager.createStateId("last-transport-time"); + waitingTimeId = stateManager.createStateId("waiting-time"); + transportTimeId = stateManager.createStateId("transport-time"); + serviceTimeId = stateManager.createStateId("service-time"); + distanceId = stateManager.createStateId("distance"); + tooLateId = stateManager.createStateId("too-late"); + shipmentId = stateManager.createStateId("shipment"); + backhaulId = stateManager.createStateId("backhaul"); + skillId = stateManager.createStateId("skills-violated"); + lastTransportCostId = stateManager.createStateId("last-transport-cost"); + lastTransportDistanceId = stateManager.createStateId("last-transport-distance"); + lastTransportTimeId = stateManager.createStateId("last-transport-time"); - stateManager.addStateUpdater(new SumUpActivityTimes(waiting_time_id, transport_time_id, service_time_id, too_late_id, stateManager, activityPolicy, vrp.getActivityCosts())); - stateManager.addStateUpdater(new DistanceUpdater(distance_id, stateManager, distanceCalculator)); - stateManager.addStateUpdater(new BackhaulAndShipmentUpdater(backhaul_id, shipment_id, stateManager)); - stateManager.addStateUpdater(new SkillUpdater(stateManager, skill_id)); + stateManager.addStateUpdater(new SumUpActivityTimes(waitingTimeId, transportTimeId, serviceTimeId, tooLateId, stateManager, activityPolicy, vrp.getActivityCosts())); + stateManager.addStateUpdater(new DistanceUpdater(distanceId, stateManager, distanceCalculator)); + stateManager.addStateUpdater(new BackhaulAndShipmentUpdater(backhaulId, shipmentId, stateManager)); + stateManager.addStateUpdater(new SkillUpdater(stateManager, skillId)); stateManager.addStateUpdater(new LoadAndActivityCounter(stateManager)); - stateManager.addStateUpdater(new LastTransportUpdater(stateManager, vrp.getTransportCosts(), distanceCalculator, last_transport_distance_id, last_transport_time_id, last_transport_cost_id)); + stateManager.addStateUpdater(new LastTransportUpdater(stateManager, vrp.getTransportCosts(), distanceCalculator, lastTransportDistanceId, lastTransportTimeId, lastTransportCostId)); } @@ -779,7 +779,7 @@ public class SolutionAnalyser { */ public Double getTimeWindowViolation(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); - return stateManager.getRouteState(route, too_late_id, Double.class); + return stateManager.getRouteState(route, tooLateId, Double.class); } /** @@ -800,7 +800,7 @@ public class SolutionAnalyser { */ public Boolean hasSkillConstraintViolation(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); - return stateManager.getRouteState(route, skill_id, Boolean.class); + return stateManager.getRouteState(route, skillId, Boolean.class); } /** @@ -816,7 +816,7 @@ public class SolutionAnalyser { if (activity instanceof Start) return false; if (activity instanceof End) return false; verifyThatRouteContainsAct(activity, route); - return stateManager.getActivityState(activity, skill_id, Boolean.class); + return stateManager.getActivityState(activity, skillId, Boolean.class); } /** @@ -831,7 +831,7 @@ public class SolutionAnalyser { */ public Boolean hasBackhaulConstraintViolation(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); - return stateManager.getRouteState(route, backhaul_id, Boolean.class); + return stateManager.getRouteState(route, backhaulId, Boolean.class); } /** @@ -846,7 +846,7 @@ public class SolutionAnalyser { if (activity instanceof Start) return false; if (activity instanceof End) return false; verifyThatRouteContainsAct(activity, route); - return stateManager.getActivityState(activity, backhaul_id, Boolean.class); + return stateManager.getActivityState(activity, backhaulId, Boolean.class); } /** @@ -859,7 +859,7 @@ public class SolutionAnalyser { */ public Boolean hasShipmentConstraintViolation(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); - return stateManager.getRouteState(route, shipment_id, Boolean.class); + return stateManager.getRouteState(route, shipmentId, Boolean.class); } /** @@ -877,7 +877,7 @@ public class SolutionAnalyser { if (activity instanceof Start) return false; if (activity instanceof End) return false; verifyThatRouteContainsAct(activity, route); - return stateManager.getActivityState(activity, shipment_id, Boolean.class); + return stateManager.getActivityState(activity, shipmentId, Boolean.class); } @@ -897,7 +897,7 @@ public class SolutionAnalyser { */ public Double getWaitingTime(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); - return stateManager.getRouteState(route, waiting_time_id, Double.class); + return stateManager.getRouteState(route, waitingTimeId, Double.class); } /** @@ -906,7 +906,7 @@ public class SolutionAnalyser { */ public Double getTransportTime(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); - return stateManager.getRouteState(route, transport_time_id, Double.class); + return stateManager.getRouteState(route, transportTimeId, Double.class); } /** @@ -915,7 +915,7 @@ public class SolutionAnalyser { */ public Double getServiceTime(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); - return stateManager.getRouteState(route, service_time_id, Double.class); + return stateManager.getRouteState(route, serviceTimeId, Double.class); } /** @@ -965,7 +965,7 @@ public class SolutionAnalyser { if (activity instanceof Start) return 0.; if (activity instanceof End) return getTransportTime(route); verifyThatRouteContainsAct(activity, route); - return stateManager.getActivityState(activity, transport_time_id, Double.class); + return stateManager.getActivityState(activity, transportTimeId, Double.class); } /** @@ -974,7 +974,7 @@ public class SolutionAnalyser { * @return The transport time from the previous activity to this one. */ public Double getLastTransportTimeAtActivity(TourActivity activity, VehicleRoute route) { - return getLastTransport(activity, route, last_transport_time_id); + return getLastTransport(activity, route, lastTransportTimeId); } /** @@ -983,7 +983,7 @@ public class SolutionAnalyser { * @return The transport distance from the previous activity to this one. */ public Double getLastTransportDistanceAtActivity(TourActivity activity, VehicleRoute route) { - return getLastTransport(activity, route, last_transport_distance_id); + return getLastTransport(activity, route, lastTransportDistanceId); } /** @@ -992,7 +992,7 @@ public class SolutionAnalyser { * @return The transport cost from the previous activity to this one. */ public Double getLastTransportCostAtActivity(TourActivity activity, VehicleRoute route) { - return getLastTransport(activity, route, last_transport_cost_id); + return getLastTransport(activity, route, lastTransportCostId); } @@ -1026,7 +1026,7 @@ public class SolutionAnalyser { */ public Double getDistance(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); - return stateManager.getRouteState(route, distance_id, Double.class); + return stateManager.getRouteState(route, distanceId, Double.class); } /** @@ -1039,7 +1039,7 @@ public class SolutionAnalyser { if (activity instanceof Start) return 0.; if (activity instanceof End) return getDistance(route); verifyThatRouteContainsAct(activity, route); - return stateManager.getActivityState(activity, distance_id, Double.class); + return stateManager.getActivityState(activity, distanceId, Double.class); } /** diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyserTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyserTest.java index 3ce9bcfa..28284bcf 100644 --- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyserTest.java +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyserTest.java @@ -22,6 +22,7 @@ package com.graphhopper.jsprit.core.analysis; import com.graphhopper.jsprit.core.problem.Capacity; import com.graphhopper.jsprit.core.problem.Location; import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; +import com.graphhopper.jsprit.core.problem.cost.TransportDistance; import com.graphhopper.jsprit.core.problem.job.Delivery; import com.graphhopper.jsprit.core.problem.job.Pickup; import com.graphhopper.jsprit.core.problem.job.Service; @@ -1615,4 +1616,21 @@ public class SolutionAnalyserTest { assertFalse(violated); } + @Test + public void shouldWorkWithRouteWithoutActivities() { + Vehicle vehicle = VehicleImpl.Builder.newInstance("vehicle").setStartLocation(Location.newInstance(0, 0)) + .setEndLocation(Location.newInstance(10, 0)).build(); + VehicleRoute vehicleRoute = VehicleRoute.Builder.newInstance(vehicle).build(); + + VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(vehicle).build(); + VehicleRoutingProblemSolution solution = new VehicleRoutingProblemSolution(Arrays.asList(vehicleRoute), 0); + SolutionAnalyser analyser = new SolutionAnalyser(vrp, solution, new TransportDistance() { + @Override + public double getDistance(Location from, Location to, double departureTime, Vehicle vehicle) { + return 100; + } + }); + + } + }