Skip to content

Commit 6e76032

Browse files
author
braktar
committed
flexible start time
1 parent b5d31f8 commit 6e76032

File tree

4 files changed

+181
-1
lines changed

4 files changed

+181
-1
lines changed

jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
5252
import com.graphhopper.jsprit.core.problem.vehicle.*;
5353
import com.graphhopper.jsprit.core.util.ActivityTimeTracker;
54+
import com.graphhopper.jsprit.core.util.ReverseActivityTimeTracker;
55+
5456
import org.apache.commons.configuration.HierarchicalConfiguration;
5557
import org.apache.commons.configuration.XMLConfiguration;
5658
import org.slf4j.Logger;
@@ -542,6 +544,7 @@ public void run() {
542544
switchAllowed = Boolean.parseBoolean(switchString);
543545
} else switchAllowed = true;
544546
ActivityTimeTracker.ActivityPolicy activityPolicy;
547+
ReverseActivityTimeTracker.ReverseActivityPolicy reverseActivityPolicy;
545548
if (stateManager.timeWindowUpdateIsActivated()) {
546549
UpdateVehicleDependentPracticalTimeWindows timeWindowUpdater = new UpdateVehicleDependentPracticalTimeWindows(stateManager, vrp.getTransportCosts(), vrp.getActivityCosts());
547550
timeWindowUpdater.setVehiclesToUpdate(new UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate() {
@@ -563,10 +566,13 @@ public Collection<Vehicle> get(VehicleRoute vehicleRoute) {
563566
});
564567
stateManager.addStateUpdater(timeWindowUpdater);
565568
activityPolicy = ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS;
569+
reverseActivityPolicy = ReverseActivityTimeTracker.ReverseActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS;
566570
} else {
567571
activityPolicy = ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_ARRIVED;
572+
reverseActivityPolicy = ReverseActivityTimeTracker.ReverseActivityPolicy.AS_SOON_AS_ARRIVED;
568573
}
569574
stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), activityPolicy, vrp.getActivityCosts()));
575+
stateManager.addStateUpdater(new UpdateReverseActivityTimes(vrp.getTransportCosts(), reverseActivityPolicy, vrp.getActivityCosts()));
570576
stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager, activityPolicy));
571577

572578
final SolutionCostCalculator costCalculator;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*******************************************************************************
2+
* Copyright (C) 2014 Stefan Schroeder
3+
*
4+
* This library is free software; you can redistribute it and/or
5+
* modify it under the terms of the GNU Lesser General Public
6+
* License as published by the Free Software Foundation; either
7+
* version 3.0 of the License, or (at your option) any later version.
8+
*
9+
* This library is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+
* Lesser General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU Lesser General Public
15+
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
16+
******************************************************************************/
17+
package com.graphhopper.jsprit.core.algorithm.state;
18+
19+
import com.graphhopper.jsprit.core.problem.cost.TransportTime;
20+
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
21+
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
22+
import com.graphhopper.jsprit.core.problem.solution.route.activity.ReverseActivityVisitor;
23+
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
24+
import com.graphhopper.jsprit.core.util.ReverseActivityTimeTracker;
25+
import com.graphhopper.jsprit.core.util.ReverseActivityTimeTracker.ReverseActivityPolicy;
26+
27+
public class UpdateReverseActivityTimes implements ReverseActivityVisitor, StateUpdater {
28+
29+
private ReverseActivityTimeTracker timeTracker;
30+
31+
private VehicleRoute route;
32+
33+
public UpdateReverseActivityTimes(TransportTime transportTime, VehicleRoutingActivityCosts activityCosts) {
34+
super();
35+
timeTracker = new ReverseActivityTimeTracker(transportTime,activityCosts);
36+
}
37+
38+
public UpdateReverseActivityTimes(TransportTime transportTime, ReverseActivityPolicy activityPolicy, VehicleRoutingActivityCosts activityCosts) {
39+
timeTracker = new ReverseActivityTimeTracker(transportTime, activityPolicy, activityCosts);
40+
}
41+
42+
@Override
43+
public void begin(VehicleRoute route) {
44+
timeTracker.begin(route);
45+
this.route = route;
46+
}
47+
48+
@Override
49+
public void visit(TourActivity activity) {
50+
timeTracker.visit(activity);
51+
}
52+
53+
@Override
54+
public void finish() {
55+
timeTracker.finish();
56+
route.getStart().setEndTime(timeTracker.getActEndTime());
57+
}
58+
59+
}

jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/ActivityTimeTracker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public double getActEndTime() {
7272
@Override
7373
public void begin(VehicleRoute route) {
7474
prevAct = route.getStart();
75-
startAtPrevAct = prevAct.getEndTime();
75+
startAtPrevAct = route.getVehicle().getEarliestDeparture();
7676
actEndTime = startAtPrevAct;
7777
this.route = route;
7878
beginFirst = true;
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*******************************************************************************
2+
* Copyright (C) 2014 Stefan Schroeder
3+
*
4+
* This library is free software; you can redistribute it and/or
5+
* modify it under the terms of the GNU Lesser General Public
6+
* License as published by the Free Software Foundation; either
7+
* version 3.0 of the License, or (at your option) any later version.
8+
*
9+
* This library is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+
* Lesser General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU Lesser General Public
15+
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
16+
******************************************************************************/
17+
package com.graphhopper.jsprit.core.util;
18+
19+
import com.graphhopper.jsprit.core.problem.cost.TransportTime;
20+
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
21+
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
22+
import com.graphhopper.jsprit.core.problem.solution.route.activity.ReverseActivityVisitor;
23+
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
24+
25+
public class ReverseActivityTimeTracker implements ReverseActivityVisitor {
26+
27+
public static enum ReverseActivityPolicy {
28+
29+
AS_SOON_AS_TIME_WINDOW_OPENS, AS_SOON_AS_ARRIVED
30+
31+
}
32+
33+
private final TransportTime transportTime;
34+
35+
private final VehicleRoutingActivityCosts activityCosts;
36+
37+
private TourActivity prevAct = null;
38+
39+
private double startAtPrevAct;
40+
41+
private VehicleRoute route;
42+
43+
private boolean beginFirst = false;
44+
45+
private double actArrTime;
46+
47+
private double actEndTime;
48+
49+
private ReverseActivityPolicy activityPolicy = ReverseActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS;
50+
51+
public ReverseActivityTimeTracker(TransportTime transportTime, VehicleRoutingActivityCosts activityCosts) {
52+
super();
53+
this.transportTime = transportTime;
54+
this.activityCosts = activityCosts;
55+
}
56+
57+
public ReverseActivityTimeTracker(TransportTime transportTime, ReverseActivityPolicy activityPolicy, VehicleRoutingActivityCosts activityCosts) {
58+
super();
59+
this.transportTime = transportTime;
60+
this.activityPolicy = activityPolicy;
61+
this.activityCosts = activityCosts;
62+
}
63+
64+
public double getActArrTime() {
65+
return actArrTime;
66+
}
67+
68+
public double getActEndTime() {
69+
return actEndTime;
70+
}
71+
72+
@Override
73+
public void begin(VehicleRoute route) {
74+
prevAct = route.getEnd();
75+
startAtPrevAct = prevAct.getArrTime();
76+
actArrTime = startAtPrevAct;
77+
this.route = route;
78+
beginFirst = true;
79+
}
80+
81+
@Override
82+
public void visit(TourActivity activity) {
83+
if (!beginFirst) throw new IllegalStateException("never called begin. this however is essential here");
84+
double transportTime = this.transportTime.getBackwardTransportTime(prevAct.getLocation(), activity.getLocation(), startAtPrevAct, route.getDriver(), route.getVehicle());
85+
double arrivalTimeAtCurrAct = startAtPrevAct - transportTime;
86+
87+
actEndTime = arrivalTimeAtCurrAct;
88+
double operationEndTime = arrivalTimeAtCurrAct;
89+
90+
double operationStartTime = operationEndTime - activityCosts.getActivityDuration(activity,actEndTime,route.getDriver(),route.getVehicle());
91+
92+
if (activityPolicy.equals(ReverseActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS)) {
93+
actArrTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), operationStartTime);
94+
} else if (activityPolicy.equals(ReverseActivityPolicy.AS_SOON_AS_ARRIVED)) {
95+
actArrTime = actEndTime;
96+
} else operationEndTime = actEndTime;
97+
98+
prevAct = activity;
99+
startAtPrevAct = actArrTime;
100+
101+
}
102+
103+
@Override
104+
public void finish() {
105+
double transportTime = this.transportTime.getBackwardTransportTime(prevAct.getLocation(), route.getStart().getLocation(), startAtPrevAct, route.getDriver(), route.getVehicle());
106+
double arrivalTimeAtCurrAct = startAtPrevAct - transportTime;
107+
108+
actArrTime = arrivalTimeAtCurrAct;
109+
actEndTime = arrivalTimeAtCurrAct;
110+
111+
beginFirst = false;
112+
}
113+
114+
115+
}

0 commit comments

Comments
 (0)