如何限制带有重载节点析取的 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)
。
其余代码似乎是正确的。
我想限制非仓库节点和重新加载节点的车辆变量域。此外,重新加载是可选的。例如,假设我有 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)
。
其余代码似乎是正确的。