or-tools - 如何通过重新加载节点的析取来限制 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 没有限制。
请帮我解决这个问题,我觉得我在析取方面做错了:)
解决方案
车辆 var 的索引node_i
不是node_i
,它是index_manager.NodeToIndex(node_i)
。
其余的代码似乎是正确的。
推荐阅读
- reporting-services - SSRS 表达式求和值 IIF YearMonth = 参数
- c# - Unity 拖放 x 和 z 位置
- javascript - 根据用户权限允许访问 Firebase Firestore
- c# - 单击仪表板中的菜单时 C# 表单提示密码
- assembly - 整数溢出 irvine32
- css - CSS Offset 封面背景图片
- mongodb - MongoDB中的边界框限制
- python - InvalidArgumentError:_MklConcatOp:输入的尺寸应该匹配
- linux - 如何在鱼壳中的每个会话中永久设置环境?
- java - 查找给定 ArrayList 的所有可能排列
, 并将它们存储在全局变量中