Skip to content

Prune local search moves based on TW constraints #583

@jcoupey

Description

@jcoupey

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) then j cannot be inserted in r after rank i;
  • if b(t) < a(j) + service(j) + duration(j, t) then j cannot be inserted in r before rank i + 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.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions