-
Notifications
You must be signed in to change notification settings - Fork 378
Description
This is somehow similar to #509 but whereas the latter focuses on costs this could be seen as the "time" counterpart.
Consider a job j
with TW [a(j), b(j)]
and the task t
at rank i
in route r
with TW [a(t), b(t)]
. The situation of disjoints TW can be summed up as:
- if
b(j) < a(t) + service(t) + duration(t, j)
thenj
cannot be inserted inr
after ranki
; - if
b(t) < a(j) + service(j) + duration(j, t)
thenj
cannot be inserted inr
before ranki + 1
.
This provides an embarrassingly simple way to discard a lot of local search move lookups. Contrary to #509 this would not require any tuning, just avoiding some unnecessary work (creating operator object, computing potential gain then ending up deciding it's invalid anyway). We'd only need to maintain min/max insertion ranks for all jobs into any route, which would not be expensive since only computed upon route modifications.
Of course this would not bring much in situations with loose TW constraints, but I'd expect a significant impact on instances with a lot of disjoints TW, e.g. all the usual VRPTW/PDPTW benchmarks.