heman33
heman33

Reputation: 45

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

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.

Upvotes: 1

Views: 523

Answers (2)

watchdogs132
watchdogs132

Reputation: 331

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))

Upvotes: 3

Mizux
Mizux

Reputation: 9281

  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

Upvotes: 3

Related Questions