mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
refine max distance constraint - related to #292
This commit is contained in:
parent
3dcbe71fcf
commit
26878a3b51
1 changed files with 10 additions and 20 deletions
|
|
@ -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.misc.JobInsertionContext;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.activity.DeliverShipment;
|
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.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.solution.route.activity.TourActivity;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
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);
|
currentDistance = stateManager.getRouteState(iFacts.getRoute(),iFacts.getNewVehicle(), distanceId,Double.class);
|
||||||
}
|
}
|
||||||
double maxDistance = getMaxDistance(iFacts.getNewVehicle());
|
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 distancePrevAct2NewAct = distanceCalculator.getDistance(prevAct.getLocation(), newAct.getLocation(), iFacts.getNewDepTime(), iFacts.getNewVehicle());
|
||||||
double distanceNewAct2nextAct = distanceCalculator.getDistance(newAct.getLocation(), nextAct.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()){
|
if(nextAct instanceof End && !iFacts.getNewVehicle().isReturnToDepot()){
|
||||||
distanceNewAct2nextAct = 0;
|
distanceNewAct2nextAct = 0;
|
||||||
distancePrevAct2NextAct = 0;
|
distancePrevAct2NextAct = 0;
|
||||||
}
|
}
|
||||||
|
double additionalDistance = distancePrevAct2NewAct + distanceNewAct2nextAct - distancePrevAct2NextAct;
|
||||||
|
if(currentDistance + additionalDistance > maxDistance) return ConstraintsStatus.NOT_FULFILLED;
|
||||||
|
|
||||||
|
|
||||||
double additionalDistanceOfPickup = 0;
|
double additionalDistanceOfPickup = 0;
|
||||||
if(newAct instanceof DeliverShipment){
|
if(newAct instanceof DeliverShipment){
|
||||||
|
|
@ -89,30 +94,14 @@ public class MaxDistanceConstraint implements HardActivityConstraint{
|
||||||
TourActivity pickup = iFacts.getAssociatedActivities().get(0);
|
TourActivity pickup = iFacts.getAssociatedActivities().get(0);
|
||||||
TourActivity actBeforePickup;
|
TourActivity actBeforePickup;
|
||||||
if(iIndexOfPickup > 0) actBeforePickup = iFacts.getRoute().getActivities().get(iIndexOfPickup-1);
|
if(iIndexOfPickup > 0) actBeforePickup = iFacts.getRoute().getActivities().get(iIndexOfPickup-1);
|
||||||
else actBeforePickup = iFacts.getRoute().getStart();
|
else actBeforePickup = new Start(iFacts.getNewVehicle().getStartLocation(),0,Double.MAX_VALUE);
|
||||||
|
TourActivity actAfterPickup = iFacts.getRoute().getActivities().get(iIndexOfPickup);
|
||||||
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);
|
|
||||||
double distanceActBeforePickup2Pickup = distanceCalculator.getDistance(actBeforePickup.getLocation(), pickup.getLocation(), actBeforePickup.getEndTime(), iFacts.getNewVehicle());
|
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 distancePickup2ActAfterPickup = distanceCalculator.getDistance(pickup.getLocation(), actAfterPickup.getLocation(), iFacts.getRelatedActivityContext().getEndTime(), iFacts.getNewVehicle());
|
||||||
|
double distanceBeforePickup2AfterPickup = distanceCalculator.getDistance(actBeforePickup.getLocation(), actAfterPickup.getLocation(), actBeforePickup.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());
|
|
||||||
}
|
|
||||||
additionalDistanceOfPickup = distanceActBeforePickup2Pickup + distancePickup2ActAfterPickup - distanceBeforePickup2AfterPickup;
|
additionalDistanceOfPickup = distanceActBeforePickup2Pickup + distancePickup2ActAfterPickup - distanceBeforePickup2AfterPickup;
|
||||||
}
|
}
|
||||||
|
|
||||||
double additionalDistance = distancePrevAct2NewAct + distanceNewAct2nextAct - distancePrevAct2NextAct;
|
|
||||||
if(currentDistance + additionalDistance > maxDistance) return ConstraintsStatus.NOT_FULFILLED;
|
|
||||||
|
|
||||||
if(currentDistance + additionalDistance + additionalDistanceOfPickup > maxDistance){
|
if(currentDistance + additionalDistance + additionalDistanceOfPickup > maxDistance){
|
||||||
return ConstraintsStatus.NOT_FULFILLED;
|
return ConstraintsStatus.NOT_FULFILLED;
|
||||||
|
|
@ -122,6 +111,7 @@ public class MaxDistanceConstraint implements HardActivityConstraint{
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasMaxDistance(Vehicle newVehicle){
|
private boolean hasMaxDistance(Vehicle newVehicle){
|
||||||
|
if(newVehicle.getIndex() >= this.maxDistances.length) return false;
|
||||||
return this.maxDistances[newVehicle.getIndex()] != null;
|
return this.maxDistances[newVehicle.getIndex()] != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue