@@ -223,6 +223,8 @@ private static class SumUpActivityTimes implements StateUpdater, ActivityVisitor
223
223
224
224
private StateId too_late_id ;
225
225
226
+ private StateId setup_time_id ;
227
+
226
228
private StateManager stateManager ;
227
229
228
230
private final VehicleRoutingActivityCosts activityCosts ;
@@ -239,13 +241,20 @@ private static class SumUpActivityTimes implements StateUpdater, ActivityVisitor
239
241
240
242
double sum_too_late = 0. ;
241
243
244
+ double sum_setup_time = 0. ;
245
+
246
+ TourActivity prevAct ;
247
+
242
248
double prevActDeparture ;
243
249
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 ) {
245
253
this .waiting_time_id = waiting_time_id ;
246
254
this .transport_time_id = transport_time_id ;
247
255
this .service_time_id = service_time_id ;
248
256
this .too_late_id = too_late_id ;
257
+ this .setup_time_id = setup_time_id ;
249
258
this .stateManager = stateManager ;
250
259
this .activityPolicy = activityPolicy ;
251
260
this .activityCosts = activityCosts ;
@@ -258,6 +267,8 @@ public void begin(VehicleRoute route) {
258
267
sum_transport_time = 0. ;
259
268
sum_service_time = 0. ;
260
269
sum_too_late = 0. ;
270
+ sum_setup_time = 0. ;
271
+ prevAct = route .getStart ();
261
272
prevActDeparture = route .getDepartureTime ();
262
273
}
263
274
@@ -266,21 +277,25 @@ public void visit(TourActivity activity) {
266
277
//waiting time & toolate
267
278
double waitAtAct = 0. ;
268
279
double tooLate = 0. ;
280
+ double setupTime = setupCosts .getSetupTime (prevAct , activity , route .getVehicle ());
281
+ double actReadyTime = setupTime + activity .getArrTime ();
269
282
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 ());
272
285
}
273
286
sum_waiting_time += waitAtAct ;
274
287
sum_too_late += tooLate ;
275
288
//transport time
276
289
double transportTime = activity .getArrTime () - prevActDeparture ;
290
+
291
+ sum_setup_time += setupTime ;
277
292
sum_transport_time += transportTime ;
278
293
prevActDeparture = activity .getEndTime ();
279
294
//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 ());
281
296
282
297
stateManager .putActivityState (activity , transport_time_id , sum_transport_time );
283
-
298
+ prevAct = activity ;
284
299
}
285
300
286
301
@ Override
@@ -291,6 +306,7 @@ public void finish() {
291
306
stateManager .putRouteState (route , waiting_time_id , sum_waiting_time );
292
307
stateManager .putRouteState (route , service_time_id , sum_service_time );
293
308
stateManager .putRouteState (route , too_late_id , sum_too_late );
309
+ stateManager .putRouteState (route , setup_time_id , sum_setup_time );
294
310
}
295
311
}
296
312
@@ -454,6 +470,8 @@ public void finish() {
454
470
455
471
private StateId service_time_id ;
456
472
473
+ private StateId setup_time_id ;
474
+
457
475
private StateId distance_id ;
458
476
459
477
private StateId too_late_id ;
@@ -480,6 +498,7 @@ public void finish() {
480
498
private Double waiting_time ;
481
499
private Double service_time ;
482
500
private Double operation_time ;
501
+ private Double setup_time ;
483
502
private Double tw_violation ;
484
503
private Capacity cap_violation ;
485
504
private Double fixed_costs ;
@@ -538,6 +557,7 @@ private void initialise() {
538
557
waiting_time_id = stateManager .createStateId ("waiting-time" );
539
558
transport_time_id = stateManager .createStateId ("transport-time" );
540
559
service_time_id = stateManager .createStateId ("service-time" );
560
+ setup_time_id = stateManager .createStateId ("setup_time" );
541
561
distance_id = stateManager .createStateId ("distance" );
542
562
too_late_id = stateManager .createStateId ("too-late" );
543
563
shipment_id = stateManager .createStateId ("shipment" );
@@ -547,7 +567,7 @@ private void initialise() {
547
567
last_transport_distance_id = stateManager .createStateId ("last-transport-distance" );
548
568
last_transport_time_id = stateManager .createStateId ("last-transport-time" );
549
569
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 ()));
551
571
stateManager .addStateUpdater (new DistanceUpdater (distance_id , stateManager , distanceCalculator ));
552
572
stateManager .addStateUpdater (new BackhaulAndShipmentUpdater (backhaul_id , shipment_id , stateManager ));
553
573
stateManager .addStateUpdater (new SkillUpdater (stateManager , skill_id ));
@@ -571,6 +591,7 @@ private void recalculateSolutionIndicators() {
571
591
waiting_time += getWaitingTime (route );
572
592
service_time += getServiceTime (route );
573
593
operation_time += getOperationTime (route );
594
+ setup_time += getSetupTime (route );
574
595
tw_violation += getTimeWindowViolation (route );
575
596
cap_violation = Capacity .addup (cap_violation , getCapacityViolation (route ));
576
597
fixed_costs += getFixedCosts (route );
@@ -597,6 +618,7 @@ private void clearSolutionIndicators() {
597
618
waiting_time = 0. ;
598
619
service_time = 0. ;
599
620
operation_time = 0. ;
621
+ setup_time = 0. ;
600
622
tw_violation = 0. ;
601
623
cap_violation = Capacity .Builder .newInstance ().build ();
602
624
fixed_costs = 0. ;
@@ -920,6 +942,11 @@ public Double getServiceTime(VehicleRoute route) {
920
942
return stateManager .getRouteState (route , service_time_id , Double .class );
921
943
}
922
944
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
+
923
950
/**
924
951
* @param route to get the transport costs from
925
952
* @return total variable transport costs of route, i.e. sum of transport costs specified by
@@ -1170,6 +1197,10 @@ public Double getServiceTime() {
1170
1197
return service_time ;
1171
1198
}
1172
1199
1200
+ public Double getSetupTime () {
1201
+ return setup_time ;
1202
+ }
1203
+
1173
1204
/**
1174
1205
* @return total fixed costs for specified solution
1175
1206
*/
0 commit comments