首页 > 解决方案 > 如何通过重新加载节点的析取来限制 VehicleVar 的域?

问题描述

我想限制非仓库节点的车辆变量域以及重新加载节点。此外,重新加载是可选的。例如,假设我有 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]

我试图实现这一目标的方式:

重新加载节点(第一个)没有分离。(已编辑)

#[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 没有限制。

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

标签: or-tools

解决方案


车辆 var 的索引node_i不是node_i,它是index_manager.NodeToIndex(node_i)

其余的代码似乎是正确的。


推荐阅读