如何通过重载节点的析取来限制VehicleVar的域



我想为非仓库节点和重载节点限制车辆var的域。此外,重新加载也是可选的。例如,假设我有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,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的代码片段(

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

注意:在尝试此操作时,行程最大时间和最大长度没有限制。

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

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

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

最新更新