Skip to content

Commit 2344365

Browse files
committed
Cost calculator correction & solution analyser infos getter
1 parent 25a1571 commit 2344365

File tree

5 files changed

+52
-17
lines changed

5 files changed

+52
-17
lines changed

jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/box/Jsprit.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -632,9 +632,11 @@ public double getCosts(VehicleRoutingProblemSolution solution) {
632632
TourActivity prevAct = route.getStart();
633633
for (TourActivity act : route.getActivities()) {
634634
if (act instanceof BreakActivity) hasBreak = true;
635-
costs += setupCosts.getSetupCost(prevAct, act, route.getVehicle());
635+
double setupTime = setupCosts.getSetupTime(prevAct, act, route.getVehicle());
636+
double actReadyTime = act.getArrTime() + setupTime;
637+
costs += setupCosts.getSetupCost(setupTime, route.getVehicle());
636638
costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle());
637-
costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle());
639+
costs += vrp.getActivityCosts().getActivityCost(act, actReadyTime, route.getDriver(), route.getVehicle());
638640
prevAct = act;
639641
}
640642
costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle());

jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/VariableTransportCostCalculator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ public double getCosts(JobInsertionContext iFacts, TourActivity prevAct, TourAct
6363

6464
double oldCosts;
6565
if (iFacts.getRoute().isEmpty()) {
66-
double tp_costs_prevAct_nextAct = routingCosts.getTransportCost(prevAct.getLocation(), nextAct.getLocation(), depTimeAtPrevAct, iFacts.getNewDriver(), iFacts.getNewVehicle());
66+
double setup_costs_prevAct_nextAct = setupCosts.getSetupCost(prevAct, nextAct, iFacts.getNewVehicle());
67+
double tp_costs_prevAct_nextAct = setup_costs_prevAct_nextAct + routingCosts.getTransportCost(prevAct.getLocation(), nextAct.getLocation(), depTimeAtPrevAct, iFacts.getNewDriver(), iFacts.getNewVehicle());
6768
oldCosts = tp_costs_prevAct_nextAct;
6869
} else {
69-
double setup_time_prevAct_nextAct = setupCosts.getSetupTime(prevAct, nextAct, iFacts.getNewVehicle());
70-
double setup_costs_prevAct_nextAct = setupCosts.getSetupCost(setup_time_prevAct_nextAct, iFacts.getNewVehicle());
70+
double setup_costs_prevAct_nextAct = setupCosts.getSetupCost(prevAct, nextAct, iFacts.getNewVehicle());
7171
double tp_costs_prevAct_nextAct = setup_costs_prevAct_nextAct + routingCosts.getTransportCost(prevAct.getLocation(), nextAct.getLocation(), prevAct.getEndTime(), iFacts.getRoute().getDriver(), iFacts.getRoute().getVehicle());
7272
oldCosts = tp_costs_prevAct_nextAct;
7373
}

jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/state/UpdateVariableCosts.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,10 @@ public void visit(TourActivity act) {
9090
timeTracker.visit(act);
9191

9292
double transportCost = this.transportCost.getTransportCost(prevAct.getLocation(), act.getLocation(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
93+
double setupTime = setupCosts.getSetupTime(prevAct, act, vehicleRoute.getVehicle());
9394
double setupCost = setupCosts.getSetupCost(prevAct, act, vehicleRoute.getVehicle());
94-
double actCost = activityCost.getActivityCost(act, timeTracker.getActArrTime(), vehicleRoute.getDriver(), vehicleRoute.getVehicle());
95+
double actReadyTime = timeTracker.getActArrTime() + setupTime;
96+
double actCost = activityCost.getActivityCost(act, actReadyTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
9597

9698
totalOperationCost += transportCost;
9799
totalOperationCost += setupCost;

jsprit-core/src/main/java/com/graphhopper/jsprit/core/analysis/SolutionAnalyser.java

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ private static class SumUpActivityTimes implements StateUpdater, ActivityVisitor
223223

224224
private StateId too_late_id;
225225

226+
private StateId setup_time_id;
227+
226228
private StateManager stateManager;
227229

228230
private final VehicleRoutingActivityCosts activityCosts;
@@ -239,13 +241,20 @@ private static class SumUpActivityTimes implements StateUpdater, ActivityVisitor
239241

240242
double sum_too_late = 0.;
241243

244+
double sum_setup_time = 0.;
245+
246+
TourActivity prevAct;
247+
242248
double prevActDeparture;
243249

244-
private SumUpActivityTimes(StateId waiting_time_id, StateId transport_time_id, StateId service_time_id, StateId too_late_id, StateManager stateManager, ActivityTimeTracker.ActivityPolicy activityPolicy, VehicleRoutingActivityCosts activityCosts) {
250+
private SetupTime setupCosts = new SetupTime();
251+
252+
private SumUpActivityTimes(StateId waiting_time_id, StateId transport_time_id, StateId service_time_id, StateId too_late_id, StateId setup_time_id, StateManager stateManager, ActivityTimeTracker.ActivityPolicy activityPolicy, VehicleRoutingActivityCosts activityCosts) {
245253
this.waiting_time_id = waiting_time_id;
246254
this.transport_time_id = transport_time_id;
247255
this.service_time_id = service_time_id;
248256
this.too_late_id = too_late_id;
257+
this.setup_time_id = setup_time_id;
249258
this.stateManager = stateManager;
250259
this.activityPolicy = activityPolicy;
251260
this.activityCosts = activityCosts;
@@ -258,6 +267,8 @@ public void begin(VehicleRoute route) {
258267
sum_transport_time = 0.;
259268
sum_service_time = 0.;
260269
sum_too_late = 0.;
270+
sum_setup_time = 0.;
271+
prevAct = route.getStart();
261272
prevActDeparture = route.getDepartureTime();
262273
}
263274

@@ -266,21 +277,25 @@ public void visit(TourActivity activity) {
266277
//waiting time & toolate
267278
double waitAtAct = 0.;
268279
double tooLate = 0.;
280+
double setupTime = setupCosts.getSetupTime(prevAct, activity, route.getVehicle());
281+
double actReadyTime = setupTime + activity.getArrTime();
269282
if (activityPolicy.equals(ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS)) {
270-
waitAtAct = Math.max(0, activity.getTheoreticalEarliestOperationStartTime() - activity.getArrTime());
271-
tooLate = Math.max(0, activity.getArrTime() - activity.getTheoreticalLatestOperationStartTime());
283+
waitAtAct = Math.max(0, activity.getTheoreticalEarliestOperationStartTime() - actReadyTime);
284+
tooLate = Math.max(0, actReadyTime - activity.getTheoreticalLatestOperationStartTime());
272285
}
273286
sum_waiting_time += waitAtAct;
274287
sum_too_late += tooLate;
275288
//transport time
276289
double transportTime = activity.getArrTime() - prevActDeparture;
290+
291+
sum_setup_time += setupTime;
277292
sum_transport_time += transportTime;
278293
prevActDeparture = activity.getEndTime();
279294
//service time
280-
sum_service_time += activityCosts.getActivityDuration(activity, activity.getArrTime(), route.getDriver(), route.getVehicle());
295+
sum_service_time += activityCosts.getActivityDuration(activity, actReadyTime, route.getDriver(), route.getVehicle());
281296

282297
stateManager.putActivityState(activity, transport_time_id, sum_transport_time);
283-
298+
prevAct = activity;
284299
}
285300

286301
@Override
@@ -291,6 +306,7 @@ public void finish() {
291306
stateManager.putRouteState(route, waiting_time_id, sum_waiting_time);
292307
stateManager.putRouteState(route, service_time_id, sum_service_time);
293308
stateManager.putRouteState(route, too_late_id, sum_too_late);
309+
stateManager.putRouteState(route, setup_time_id, sum_setup_time);
294310
}
295311
}
296312

@@ -454,6 +470,8 @@ public void finish() {
454470

455471
private StateId service_time_id;
456472

473+
private StateId setup_time_id;
474+
457475
private StateId distance_id;
458476

459477
private StateId too_late_id;
@@ -480,6 +498,7 @@ public void finish() {
480498
private Double waiting_time;
481499
private Double service_time;
482500
private Double operation_time;
501+
private Double setup_time;
483502
private Double tw_violation;
484503
private Capacity cap_violation;
485504
private Double fixed_costs;
@@ -538,6 +557,7 @@ private void initialise() {
538557
waiting_time_id = stateManager.createStateId("waiting-time");
539558
transport_time_id = stateManager.createStateId("transport-time");
540559
service_time_id = stateManager.createStateId("service-time");
560+
setup_time_id = stateManager.createStateId("setup_time");
541561
distance_id = stateManager.createStateId("distance");
542562
too_late_id = stateManager.createStateId("too-late");
543563
shipment_id = stateManager.createStateId("shipment");
@@ -547,7 +567,7 @@ private void initialise() {
547567
last_transport_distance_id = stateManager.createStateId("last-transport-distance");
548568
last_transport_time_id = stateManager.createStateId("last-transport-time");
549569

550-
stateManager.addStateUpdater(new SumUpActivityTimes(waiting_time_id, transport_time_id, service_time_id, too_late_id, stateManager, activityPolicy, vrp.getActivityCosts()));
570+
stateManager.addStateUpdater(new SumUpActivityTimes(waiting_time_id, transport_time_id, service_time_id, too_late_id, setup_time_id, stateManager, activityPolicy, vrp.getActivityCosts()));
551571
stateManager.addStateUpdater(new DistanceUpdater(distance_id, stateManager, distanceCalculator));
552572
stateManager.addStateUpdater(new BackhaulAndShipmentUpdater(backhaul_id, shipment_id, stateManager));
553573
stateManager.addStateUpdater(new SkillUpdater(stateManager, skill_id));
@@ -571,6 +591,7 @@ private void recalculateSolutionIndicators() {
571591
waiting_time += getWaitingTime(route);
572592
service_time += getServiceTime(route);
573593
operation_time += getOperationTime(route);
594+
setup_time += getSetupTime(route);
574595
tw_violation += getTimeWindowViolation(route);
575596
cap_violation = Capacity.addup(cap_violation, getCapacityViolation(route));
576597
fixed_costs += getFixedCosts(route);
@@ -597,6 +618,7 @@ private void clearSolutionIndicators() {
597618
waiting_time = 0.;
598619
service_time = 0.;
599620
operation_time = 0.;
621+
setup_time = 0.;
600622
tw_violation = 0.;
601623
cap_violation = Capacity.Builder.newInstance().build();
602624
fixed_costs = 0.;
@@ -920,6 +942,11 @@ public Double getServiceTime(VehicleRoute route) {
920942
return stateManager.getRouteState(route, service_time_id, Double.class);
921943
}
922944

945+
public Double getSetupTime(VehicleRoute route) {
946+
if (route == null) throw new IllegalArgumentException("route is missing.");
947+
return stateManager.getRouteState(route, setup_time_id, Double.class);
948+
}
949+
923950
/**
924951
* @param route to get the transport costs from
925952
* @return total variable transport costs of route, i.e. sum of transport costs specified by
@@ -1170,6 +1197,10 @@ public Double getServiceTime() {
11701197
return service_time;
11711198
}
11721199

1200+
public Double getSetupTime() {
1201+
return setup_time;
1202+
}
1203+
11731204
/**
11741205
* @return total fixed costs for specified solution
11751206
*/

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,18 @@ public void visit(TourActivity activity) {
8787
if (!beginFirst) throw new IllegalStateException("never called begin. this however is essential here");
8888
double setup_time_prevAct_activity = setupCosts.getSetupTime(prevAct, activity, route.getVehicle());
8989

90-
double transportTime = setup_time_prevAct_activity + this.transportTime.getTransportTime(prevAct.getLocation(), activity.getLocation(), startAtPrevAct, route.getDriver(), route.getVehicle());
90+
double transportTime = /*setup_time_prevAct_activity + */this.transportTime.getTransportTime(prevAct.getLocation(), activity.getLocation(), startAtPrevAct, route.getDriver(), route.getVehicle());
9191

9292
double arrivalTimeAtCurrAct = startAtPrevAct + transportTime;
93-
9493
actArrTime = arrivalTimeAtCurrAct;
94+
double readyTimeAtCurrAct = arrivalTimeAtCurrAct + setup_time_prevAct_activity;
9595
double operationStartTime;
9696

9797
if (activityPolicy.equals(ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS)) {
98-
operationStartTime = Math.max(activity.getTheoreticalEarliestOperationStartTime(), arrivalTimeAtCurrAct);
98+
operationStartTime = Math.max(activity.getTheoreticalEarliestOperationStartTime(), readyTimeAtCurrAct);
9999
} else if (activityPolicy.equals(ActivityPolicy.AS_SOON_AS_ARRIVED)) {
100-
operationStartTime = actArrTime;
101-
} else operationStartTime = actArrTime;
100+
operationStartTime = readyTimeAtCurrAct;
101+
} else operationStartTime = readyTimeAtCurrAct;
102102

103103
double operationEndTime = operationStartTime + activityCosts.getActivityDuration(activity,actArrTime,route.getDriver(),route.getVehicle());
104104

0 commit comments

Comments
 (0)