diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/constraint/MaxDistanceConstraint.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/constraint/MaxDistanceConstraint.java index 96c752a5..20a90a7d 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/constraint/MaxDistanceConstraint.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/constraint/MaxDistanceConstraint.java @@ -24,6 +24,7 @@ import com.graphhopper.jsprit.core.problem.cost.TransportDistance; import com.graphhopper.jsprit.core.problem.misc.JobInsertionContext; import com.graphhopper.jsprit.core.problem.solution.route.activity.DeliverShipment; import com.graphhopper.jsprit.core.problem.solution.route.activity.End; +import com.graphhopper.jsprit.core.problem.solution.route.activity.Start; import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity; import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; @@ -74,14 +75,18 @@ public class MaxDistanceConstraint implements HardActivityConstraint{ currentDistance = stateManager.getRouteState(iFacts.getRoute(),iFacts.getNewVehicle(), distanceId,Double.class); } double maxDistance = getMaxDistance(iFacts.getNewVehicle()); + if(currentDistance > maxDistance) return ConstraintsStatus.NOT_FULFILLED_BREAK; double distancePrevAct2NewAct = distanceCalculator.getDistance(prevAct.getLocation(), newAct.getLocation(), iFacts.getNewDepTime(), iFacts.getNewVehicle()); double distanceNewAct2nextAct = distanceCalculator.getDistance(newAct.getLocation(), nextAct.getLocation(), iFacts.getNewDepTime(), iFacts.getNewVehicle()); - double distancePrevAct2NextAct = distanceCalculator.getDistance(prevAct.getLocation(), nextAct.getLocation(), prevActDepTime, iFacts.getRoute().getVehicle()); + double distancePrevAct2NextAct = distanceCalculator.getDistance(prevAct.getLocation(), nextAct.getLocation(), prevActDepTime, iFacts.getNewVehicle()); if(nextAct instanceof End && !iFacts.getNewVehicle().isReturnToDepot()){ distanceNewAct2nextAct = 0; distancePrevAct2NextAct = 0; } + double additionalDistance = distancePrevAct2NewAct + distanceNewAct2nextAct - distancePrevAct2NextAct; + if(currentDistance + additionalDistance > maxDistance) return ConstraintsStatus.NOT_FULFILLED; + double additionalDistanceOfPickup = 0; if(newAct instanceof DeliverShipment){ @@ -89,30 +94,14 @@ public class MaxDistanceConstraint implements HardActivityConstraint{ TourActivity pickup = iFacts.getAssociatedActivities().get(0); TourActivity actBeforePickup; if(iIndexOfPickup > 0) actBeforePickup = iFacts.getRoute().getActivities().get(iIndexOfPickup-1); - else actBeforePickup = iFacts.getRoute().getStart(); - - TourActivity actAfterPickup; - boolean associatedPickAndDeliveryAreDirectNeighbors = prevAct.getIndex() == pickup.getIndex(); - if(associatedPickAndDeliveryAreDirectNeighbors){ - actAfterPickup = newAct; - distancePrevAct2NextAct = distanceCalculator.getDistance(prevAct.getLocation(), nextAct.getLocation(), iFacts.getRelatedActivityContext().getEndTime(), iFacts.getNewVehicle()); - } - else actAfterPickup = iFacts.getRoute().getActivities().get(iIndexOfPickup); + else actBeforePickup = new Start(iFacts.getNewVehicle().getStartLocation(),0,Double.MAX_VALUE); + TourActivity actAfterPickup = iFacts.getRoute().getActivities().get(iIndexOfPickup); double distanceActBeforePickup2Pickup = distanceCalculator.getDistance(actBeforePickup.getLocation(), pickup.getLocation(), actBeforePickup.getEndTime(), iFacts.getNewVehicle()); double distancePickup2ActAfterPickup = distanceCalculator.getDistance(pickup.getLocation(), actAfterPickup.getLocation(), iFacts.getRelatedActivityContext().getEndTime(), iFacts.getNewVehicle()); - - double distanceBeforePickup2AfterPickup; - if(associatedPickAndDeliveryAreDirectNeighbors){ - distanceBeforePickup2AfterPickup = distanceCalculator.getDistance(actBeforePickup.getLocation(), actAfterPickup.getLocation(), actBeforePickup.getEndTime(), iFacts.getNewVehicle()); - } - else{ - distanceBeforePickup2AfterPickup = distanceCalculator.getDistance(actBeforePickup.getLocation(), actAfterPickup.getLocation(), actBeforePickup.getEndTime(), iFacts.getRoute().getVehicle()); - } + double distanceBeforePickup2AfterPickup = distanceCalculator.getDistance(actBeforePickup.getLocation(), actAfterPickup.getLocation(), actBeforePickup.getEndTime(), iFacts.getNewVehicle()); additionalDistanceOfPickup = distanceActBeforePickup2Pickup + distancePickup2ActAfterPickup - distanceBeforePickup2AfterPickup; } - double additionalDistance = distancePrevAct2NewAct + distanceNewAct2nextAct - distancePrevAct2NextAct; - if(currentDistance + additionalDistance > maxDistance) return ConstraintsStatus.NOT_FULFILLED; if(currentDistance + additionalDistance + additionalDistanceOfPickup > maxDistance){ return ConstraintsStatus.NOT_FULFILLED; @@ -122,6 +111,7 @@ public class MaxDistanceConstraint implements HardActivityConstraint{ } private boolean hasMaxDistance(Vehicle newVehicle){ + if(newVehicle.getIndex() >= this.maxDistances.length) return false; return this.maxDistances[newVehicle.getIndex()] != null; }