1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

multiple tws

This commit is contained in:
oblonski 2015-07-13 19:58:24 +02:00
parent ebeae6f693
commit 0b3b07a7de
9 changed files with 219 additions and 58 deletions

View file

@ -135,8 +135,10 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{
}
double actArrTime = prevActStartTime + transportCosts.getTransportTime(prevAct.getLocation(),deliveryAct2Insert.getLocation(),prevActStartTime,newDriver,newVehicle);
Collection<TimeWindow> timeWindows = service.getTimeWindows(actArrTime);
TimeWindow timeWindow = getNextTimeWindow(actArrTime,timeWindows);
if(timeWindow == null) break;
boolean not_fulfilled_break = true;
for(TimeWindow timeWindow : timeWindows) {
// for(TimeWindow timeWindow : timeWindows) {
deliveryAct2Insert.setTheoreticalEarliestOperationStartTime(timeWindow.getStart());
deliveryAct2Insert.setTheoreticalLatestOperationStartTime(timeWindow.getEnd());
ConstraintsStatus status = hardActivityLevelConstraint.fulfilled(insertionContext, prevAct, deliveryAct2Insert, nextAct, prevActStartTime);
@ -153,7 +155,7 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{
} else if (status.equals(ConstraintsStatus.NOT_FULFILLED)) {
not_fulfilled_break = false;
}
}
// }
if(not_fulfilled_break) break;
double nextActArrTime = prevActStartTime + transportCosts.getTransportTime(prevAct.getLocation(), nextAct.getLocation(), prevActStartTime, newDriver, newVehicle);
prevActStartTime = CalculationUtils.getActivityEndTime(nextActArrTime, nextAct);
@ -172,4 +174,14 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{
return insertionData;
}
private TimeWindow getNextTimeWindow(double actArrTime, Collection<TimeWindow> timeWindows) {
for(TimeWindow tw : timeWindows){
if(actArrTime >= tw.getStart() && actArrTime <= tw.getEnd()) return tw;
else if(actArrTime < tw.getStart()){
return tw;
}
}
return null;
}
}

View file

@ -10,22 +10,19 @@ public class ActivityStartsAsSoonAsNextTimeWindowOpens implements ActivityStartS
@Override
public double getActivityStartTime(TourActivity activity, double arrivalTime) {
boolean next = false;
for(TimeWindow tw : activity.getTimeWindows()){
if(next){
return Math.max(tw.getStart(),arrivalTime);
}
TimeWindow last = null;
for(int i=activity.getTimeWindows().size()-1; i >= 0; i--){
TimeWindow tw = activity.getTimeWindows().get(i);
if(tw.getStart() <= arrivalTime && tw.getEnd() >= arrivalTime){
return arrivalTime;
}
else if(tw.getEnd() < arrivalTime){
next = true;
}
else if(tw.getStart() > arrivalTime){
return tw.getStart();
else if(arrivalTime > tw.getEnd()){
if(last != null) return last.getStart();
else return arrivalTime;
}
last = tw;
}
return arrivalTime;
return Math.max(arrivalTime,last.getStart());
}
}

View file

@ -75,6 +75,7 @@ public class UpdateVehicleDependentPracticalTimeWindows implements ReverseActivi
vehicles = vehiclesToUpdate.get(route);
for(Vehicle vehicle : vehicles){
latest_arrTimes_at_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = vehicle.getLatestArrival();
// System.out.println("vehicle latest arr time: " + latest_arrTimes_at_prevAct);
location_of_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = vehicle.getEndLocation();
}
}
@ -87,6 +88,7 @@ public class UpdateVehicleDependentPracticalTimeWindows implements ReverseActivi
double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocation(), prevLocation,
latestArrTimeAtPrevAct, route.getDriver(), vehicle) - activity.getOperationTime();
double latestArrivalTime = getLatestArrivalTime(activity.getTimeWindows(),potentialLatestArrivalTimeAtCurrAct);
// System.out.println("update latest: " + latestArrivalTime + " activity: " + activity);
stateManager.putInternalTypedActivityState(activity, vehicle, InternalStates.LATEST_OPERATION_START_TIME, latestArrivalTime);
latest_arrTimes_at_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = latestArrivalTime;
location_of_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = activity.getLocation();

View file

@ -18,7 +18,7 @@ package jsprit.core.util;
import jsprit.core.algorithm.state.ActivityStartAsSoonAsArrived;
import jsprit.core.algorithm.state.ActivityStartStrategy;
import jsprit.core.algorithm.state.ActivityStartsAsSoonAsTimeWindowOpens;
import jsprit.core.algorithm.state.ActivityStartsAsSoonAsNextTimeWindowOpens;
import jsprit.core.problem.cost.ForwardTransportTime;
import jsprit.core.problem.solution.route.VehicleRoute;
import jsprit.core.problem.solution.route.activity.ActivityVisitor;
@ -51,16 +51,16 @@ public class ActivityTimeTracker implements ActivityVisitor{
public ActivityTimeTracker(ForwardTransportTime transportTime) {
super();
this.transportTime = transportTime;
this.startStrategy = new ActivityStartsAsSoonAsTimeWindowOpens();
this.startStrategy = new ActivityStartsAsSoonAsNextTimeWindowOpens();
}
public ActivityTimeTracker(ForwardTransportTime transportTime, ActivityPolicy activityPolicy) {
super();
this.transportTime = transportTime;
if(activityPolicy.equals(ActivityPolicy.AS_SOON_AS_ARRIVED)){
this.startStrategy = new ActivityStartsAsSoonAsTimeWindowOpens();
this.startStrategy = new ActivityStartAsSoonAsArrived();
}
else this.startStrategy = new ActivityStartAsSoonAsArrived();
else this.startStrategy = new ActivityStartsAsSoonAsNextTimeWindowOpens();
}
public ActivityTimeTracker(ForwardTransportTime transportTime, ActivityStartStrategy startStrategy) {
@ -79,7 +79,8 @@ public class ActivityTimeTracker implements ActivityVisitor{
@Override
public void begin(VehicleRoute route) {
prevAct = route.getStart();
prevAct = route.getStart();
// System.out.println(prevAct);
startAtPrevAct = prevAct.getEndTime();
actEndTime = startAtPrevAct;
this.route = route;
@ -92,6 +93,11 @@ public class ActivityTimeTracker implements ActivityVisitor{
double transportTime = this.transportTime.getTransportTime(prevAct.getLocation(), activity.getLocation(), startAtPrevAct, route.getDriver(), route.getVehicle());
double arrivalTimeAtCurrAct = startAtPrevAct + transportTime;
actArrTime = arrivalTimeAtCurrAct;
// System.out.println("oldArrTime: " + activity.getArrTime());
// System.out.println(actArrTime + " " + activity + " tws: " + activity.getTimeWindows().toString());
assert actArrTime <= activity.getTimeWindows().get(activity.getTimeWindows().size()-1).getEnd() : "that should not be";
double operationEndTime = startStrategy.getActivityStartTime(activity,arrivalTimeAtCurrAct) + activity.getOperationTime();
actEndTime = operationEndTime;
prevAct = activity;
@ -103,6 +109,10 @@ public class ActivityTimeTracker implements ActivityVisitor{
double transportTime = this.transportTime.getTransportTime(prevAct.getLocation(), route.getEnd().getLocation(), startAtPrevAct, route.getDriver(), route.getVehicle());
double arrivalTimeAtCurrAct = startAtPrevAct + transportTime;
actArrTime = arrivalTimeAtCurrAct;
// System.out.println("end arr time: " + actArrTime);
assert actArrTime <= route.getVehicle().getLatestArrival() : "oohh. this should not be";
actEndTime = arrivalTimeAtCurrAct;
beginFirst = false;
}

View file

@ -18,6 +18,7 @@
package jsprit.core.util;
import jsprit.core.algorithm.state.ActivityStartsAsSoonAsNextTimeWindowOpens;
import jsprit.core.problem.solution.route.activity.TourActivity;
public class CalculationUtils {
@ -31,6 +32,7 @@ public class CalculationUtils {
* @return
*/
public static double getActivityEndTime(double actArrTime, TourActivity act){
return Math.max(actArrTime, act.getTheoreticalEarliestOperationStartTime()) + act.getOperationTime();
return new ActivityStartsAsSoonAsNextTimeWindowOpens().getActivityStartTime(act,actArrTime) + act.getOperationTime();
// return Math.max(actArrTime, act.getTheoreticalEarliestOperationStartTime()) + act.getOperationTime();
}
}