mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
pass prev activity
This commit is contained in:
parent
5f9b9e1929
commit
b530a7c85d
4 changed files with 30 additions and 10 deletions
|
|
@ -57,6 +57,8 @@ public class UpdateMaxTimeInVehicle implements StateUpdater, ActivityVisitor{
|
||||||
|
|
||||||
private final VehicleRoutingActivityCosts activityCosts;
|
private final VehicleRoutingActivityCosts activityCosts;
|
||||||
|
|
||||||
|
private TourActivity prevTourActivity = null;
|
||||||
|
|
||||||
private UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate vehiclesToUpdate = new UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate() {
|
private UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate vehiclesToUpdate = new UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -98,6 +100,7 @@ public class UpdateMaxTimeInVehicle implements StateUpdater, ActivityVisitor{
|
||||||
prevActEndTimes[vehicleIndex] = v.getEarliestDeparture();
|
prevActEndTimes[vehicleIndex] = v.getEarliestDeparture();
|
||||||
prevActLocations[vehicleIndex] = v.getStartLocation();
|
prevActLocations[vehicleIndex] = v.getStartLocation();
|
||||||
}
|
}
|
||||||
|
prevTourActivity = route.getStart();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -111,7 +114,7 @@ public class UpdateMaxTimeInVehicle implements StateUpdater, ActivityVisitor{
|
||||||
double activityArrival = prevActEndTimes[v.getVehicleTypeIdentifier().getIndex()] + transportTime.getTransportTime(prevActLocation,activity.getLocation(),prevActEndTime,route.getDriver(),v);
|
double activityArrival = prevActEndTimes[v.getVehicleTypeIdentifier().getIndex()] + transportTime.getTransportTime(prevActLocation,activity.getLocation(),prevActEndTime,route.getDriver(),v);
|
||||||
double activityStart = Math.max(activityArrival,activity.getTheoreticalEarliestOperationStartTime());
|
double activityStart = Math.max(activityArrival,activity.getTheoreticalEarliestOperationStartTime());
|
||||||
memorizeActStart(activity,v,activityStart);
|
memorizeActStart(activity,v,activityStart);
|
||||||
double activityEnd = activityStart + activityCosts.getActivityDuration(null, activity, activityArrival, route.getDriver(), v);
|
double activityEnd = activityStart + activityCosts.getActivityDuration(prevTourActivity, activity, activityArrival, route.getDriver(), v);
|
||||||
Map<Job, Double> openPickups = openPickupEndTimesPerVehicle.get(vehicleIndex);
|
Map<Job, Double> openPickups = openPickupEndTimesPerVehicle.get(vehicleIndex);
|
||||||
if (activity instanceof ServiceActivity || activity instanceof PickupActivity) {
|
if (activity instanceof ServiceActivity || activity instanceof PickupActivity) {
|
||||||
openPickups.put(((TourActivity.JobActivity) activity).getJob(), activityEnd);
|
openPickups.put(((TourActivity.JobActivity) activity).getJob(), activityEnd);
|
||||||
|
|
@ -129,6 +132,8 @@ public class UpdateMaxTimeInVehicle implements StateUpdater, ActivityVisitor{
|
||||||
prevActEndTimes[vehicleIndex] = activityEnd;
|
prevActEndTimes[vehicleIndex] = activityEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prevTourActivity = activity;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private double getMaxTimeInVehicle(TourActivity activity) {
|
private double getMaxTimeInVehicle(TourActivity activity) {
|
||||||
|
|
|
||||||
|
|
@ -56,9 +56,14 @@ class UpdatePracticalTimeWindows implements ReverseActivityVisitor, StateUpdater
|
||||||
prevAct = route.getEnd();
|
prevAct = route.getEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(TourActivity activity) {
|
public void visit(TourActivity activity) {
|
||||||
double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocation(), prevAct.getLocation(), latestArrTimeAtPrevAct, route.getDriver(), route.getVehicle()) - activityCosts.getActivityDuration(prevAct, activity,latestArrTimeAtPrevAct,route.getDriver(),route.getVehicle());
|
double potentialLatestArrivalTimeAtCurrAct =
|
||||||
|
latestArrTimeAtPrevAct -
|
||||||
|
transportCosts.getBackwardTransportTime(activity.getLocation(), prevAct.getLocation(), latestArrTimeAtPrevAct, route.getDriver(), route.getVehicle()) -
|
||||||
|
activityCosts.getActivityDuration(activity, prevAct, latestArrTimeAtPrevAct,route.getDriver(),route.getVehicle());
|
||||||
|
|
||||||
double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
|
double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
|
||||||
|
|
||||||
states.putInternalTypedActivityState(activity, InternalStates.LATEST_OPERATION_START_TIME, latestArrivalTime);
|
states.putInternalTypedActivityState(activity, InternalStates.LATEST_OPERATION_START_TIME, latestArrivalTime);
|
||||||
|
|
|
||||||
|
|
@ -28,17 +28,22 @@ import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
public class UpdateVehicleDependentPracticalTimeWindows implements RouteVisitor, StateUpdater {
|
public class UpdateVehicleDependentPracticalTimeWindows implements RouteVisitor, StateUpdater {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(VehicleRoute route) {
|
public void visit(VehicleRoute route) {
|
||||||
begin(route);
|
begin(route);
|
||||||
Iterator<TourActivity> revIterator = route.getTourActivities().reverseActivityIterator();
|
|
||||||
while (revIterator.hasNext()) {
|
for (int i = route.getTourActivities().getActivities().size() - 1; i >= 0; --i) {
|
||||||
visit(revIterator.next());
|
|
||||||
|
if (i > 1) {
|
||||||
|
visit(route.getTourActivities().getActivities().get(i), route.getTourActivities().getActivities().get(i - 1));
|
||||||
|
} else {
|
||||||
|
visit(route.getTourActivities().getActivities().get(i), route.getStart());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,12 +104,12 @@ public class UpdateVehicleDependentPracticalTimeWindows implements RouteVisitor,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void visit(TourActivity activity) {
|
public void visit(TourActivity activity, TourActivity prev) {
|
||||||
for (Vehicle vehicle : vehicles) {
|
for (Vehicle vehicle : vehicles) {
|
||||||
double latestArrTimeAtPrevAct = latest_arrTimes_at_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()];
|
double latestArrTimeAtPrevAct = latest_arrTimes_at_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()];
|
||||||
Location prevLocation = location_of_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()];
|
Location prevLocation = location_of_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()];
|
||||||
double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocation(), prevLocation,
|
double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocation(), prevLocation,
|
||||||
latestArrTimeAtPrevAct, route.getDriver(), vehicle) - activityCosts.getActivityDuration(null, activity, latestArrTimeAtPrevAct, route.getDriver(), route.getVehicle());
|
latestArrTimeAtPrevAct, route.getDriver(), vehicle) - activityCosts.getActivityDuration(prev, activity, latestArrTimeAtPrevAct, route.getDriver(), route.getVehicle());
|
||||||
double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
|
double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
|
||||||
if (latestArrivalTime < activity.getTheoreticalEarliestOperationStartTime()) {
|
if (latestArrivalTime < activity.getTheoreticalEarliestOperationStartTime()) {
|
||||||
stateManager.putTypedInternalRouteState(route, vehicle, InternalStates.SWITCH_NOT_FEASIBLE, true);
|
stateManager.putTypedInternalRouteState(route, vehicle, InternalStates.SWITCH_NOT_FEASIBLE, true);
|
||||||
|
|
|
||||||
|
|
@ -108,12 +108,17 @@ public class VehicleDependentTimeWindowConstraints implements HardActivityConstr
|
||||||
return ConstraintsStatus.NOT_FULFILLED;
|
return ConstraintsStatus.NOT_FULFILLED;
|
||||||
}
|
}
|
||||||
// log.info("check insertion of " + newAct + " between " + prevAct + " and " + nextAct + ". prevActDepTime=" + prevActDepTime);
|
// log.info("check insertion of " + newAct + " between " + prevAct + " and " + nextAct + ". prevActDepTime=" + prevActDepTime);
|
||||||
|
double routingFromNewToNext = routingCosts.getBackwardTransportTime(newAct.getLocation(), nextActLocation, latestArrTimeAtNextAct, iFacts.getNewDriver(), iFacts.getNewVehicle());
|
||||||
double arrTimeAtNewAct = prevActDepTime + routingCosts.getTransportTime(prevAct.getLocation(), newAct.getLocation(), prevActDepTime, iFacts.getNewDriver(), iFacts.getNewVehicle());
|
double arrTimeAtNewAct = prevActDepTime + routingCosts.getTransportTime(prevAct.getLocation(), newAct.getLocation(), prevActDepTime, iFacts.getNewDriver(), iFacts.getNewVehicle());
|
||||||
double endTimeAtNewAct = Math.max(arrTimeAtNewAct, newAct.getTheoreticalEarliestOperationStartTime()) + activityCosts.getActivityDuration(prevAct, newAct, arrTimeAtNewAct,iFacts.getNewDriver(),iFacts.getNewVehicle());
|
double endTimeAtNewAct = Math.max(arrTimeAtNewAct, newAct.getTheoreticalEarliestOperationStartTime()) + activityCosts.getActivityDuration(prevAct, newAct, arrTimeAtNewAct,iFacts.getNewDriver(),iFacts.getNewVehicle());
|
||||||
|
double savingsInNextActivityDuration =
|
||||||
|
activityCosts.getActivityDuration(prevAct, nextAct, arrTimeAtNextOnDirectRouteWithNewVehicle, iFacts.getNewDriver(), iFacts.getNewVehicle()) -
|
||||||
|
activityCosts.getActivityDuration(newAct, nextAct, endTimeAtNewAct + routingFromNewToNext, iFacts.getNewDriver(), iFacts.getNewVehicle());
|
||||||
|
|
||||||
double latestArrTimeAtNewAct =
|
double latestArrTimeAtNewAct =
|
||||||
Math.min(newAct.getTheoreticalLatestOperationStartTime(),
|
Math.min(newAct.getTheoreticalLatestOperationStartTime(),
|
||||||
latestArrTimeAtNextAct -
|
latestArrTimeAtNextAct + savingsInNextActivityDuration -
|
||||||
routingCosts.getBackwardTransportTime(newAct.getLocation(), nextActLocation, latestArrTimeAtNextAct, iFacts.getNewDriver(), iFacts.getNewVehicle())
|
routingFromNewToNext
|
||||||
- activityCosts.getActivityDuration(prevAct, newAct, arrTimeAtNewAct, iFacts.getNewDriver(), iFacts.getNewVehicle())
|
- activityCosts.getActivityDuration(prevAct, newAct, arrTimeAtNewAct, iFacts.getNewDriver(), iFacts.getNewVehicle())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue