如何限制带有重载节点析取的 VehicleVar 的域?

How to restrict the domain of a VehicleVar with disjunction for reload nodes?

我想限制非仓库节点和重新加载节点的车辆变量域。此外,重新加载是可选的。例如,假设我有 8 个节点和 2 辆车,

车辆 1:容量 (3)

车辆 2:容量 (4)

0 -> 站点(所有车辆从这里开始和结束)

1 -> 重新加载(允许的车辆 -> {1,2})

2 -> 重新加载(允许的车辆 -> {1,2})

3 -> 落点(需求 = 1)(允许车辆 -> 1)

4 -> 落点(需求 = 1)(允许车辆 -> 1)

5 -> 落点(需求 = 2)(允许车辆 -> 1)

6 -> 落点(需求 = 1)(允许车辆 -> 2)

7 -> 落点(需求 = 2)(允许车辆 -> 2)

预期访问顺序:

车辆 1 -> [0,3,4,1,5,0]

车辆 2 -> [0,6,7,0]

我尝试实现的方式:

重新加载节点(第 1 个)没有析取。 (已编辑)

#[routing.AddDisjunction([manager.NodeToIndex(i)], 0)
#for i in data['reloadNodes']]  # without penalty

添加限制

for node_i in range(routing.nodes()):
  index_i = manager.NodeToIndex(node_i)  # internal index
  if node_i is depot_node: continue # Leave depot node
  allowed_vehicles = list(data['vehiclesAllowed'][node_i]) # Vehicles allowed to visit `node_i`
  if node_i in data['reloadNodes']:
     allowed_vehicles.insert(0, -1) # because reload nodes are optional.
  routing.VehicleVar(index_i).SetValues(allowed_vehicles)

但是通过这种方式,我得到了所有重载节点都被访问的结果(在这种情况下,车辆 2 在其最后一个仓库节点之前访问了重载节点 2,就像这样 [0,6,7,2,0]) .我尝试了更多的重新加载节点,但每次都得到相同的行为。

这很好,因为不存在分离,因此访问了每个节点。 (已编辑)

然后我尝试了析取(取消注释 1st 点的代码片段)

进行此更改后,我在 50 秒 运行 时间后没有得到任何结果,状态为 ROUTING_FAIL_TIMEOUT

注意:尝试此操作时对行程 max_time 和 max_length 没有限制。

请帮我解决这个问题,我觉得我在析取方面做错了:)

node_i的车辆变量索引不是node_i,而是index_manager.NodeToIndex(node_i)

其余代码似乎是正确的。