In or-tools, VRPTW, how can I incorporate the constraint that some stops should be visited by only one subset of vehicles?

Question:

vehicle 1 vehicle 2 vehicle 3 vehicle 4
node 1 1 1 0 0
node 2 0 1 1 0
node 3 0 0 1 1

As could be seen from the matrix, a node could only be served by a specified list of vehicles. Node 1 should be served by vehicle 1 or vehicle 2, but not vehicle 3 or vehicle 4.

I tried to modify the solution proposed here (In or-tools, VRPTW, how can I give each vehicle a different weight/score for each node?), but it didn’t work. Is there any way to add this type of constraint to VRPTW.

Asked By: heman33

||

Answers:

  1. you can use routing.VehicleVar(node_index).RemoveValues([list of vehicle to remove])

e.g. for node 1

node_one_idx = manager.NodeToIndex(1)
routing.VehicleVar(node_one_idx).RemoveValues([3, 4]) # forbidd vehicle 3 and 4

note: vehicle index start at 0 so 3rd and 4th vehicle should be vehicle index 2 and 3…

ref: https://github.com/google/or-tools/blob/5a3b2f304438dad72b3a877b26e9cf2d9cf6f8a2/ortools/constraint_solver/routing.h#L1499-L1501

Answered By: Mizux

There is also SetAllowedVehiclesForIndex.

  /// Sets the vehicles which can visit a given node. If the node is in a
  /// disjunction, this will not prevent it from being unperformed.
  /// Specifying an empty vector of vehicles has no effect (all vehicles
  /// will be allowed to visit the node).
  void SetAllowedVehiclesForIndex(const std::vector<int>& vehicles,
                                  int64_t index);

Example use in py:

routing.SetAllowedVehiclesForIndex([0, 1], manager.NodeToIndex(1))
Answered By: watchdogs132
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.