我想限制由同一辆车服务的位置。我使用容量限制来实现这一点。假设我们有l = [[1,2], [3,4]]
这意味着位置 1、2 必须由同一辆车服务,3、4 也必须由同一辆车服务。所以 1, 2 结束route_1
, 3, 4结束route_2
我实现这一目标的代码是:
for idx, route_constraint in enumerate(l):
vehicle_capacities = [0] * NUM_VEHICLES
vehicle_capacities[idx] = len(route_constraint)
route_dimension_name = 'Same_Route_' + str(idx)
def callback(from_index):
from_node = manager.IndexToNode(from_index)
return 1 if from_node in route_constraint else 0
same_routes_callback_index = routing.RegisterUnaryTransitCallback(callback)
routing.AddDimensionWithVehicleCapacity(
same_routes_callback_index,
0, # null capacity slack
vehicle_capacities, # vehicle maximum capacities
True, # start cumul to zero
route_dimension_name)
这个想法是 1,2 每个 1 单位的容量需求(所有其他单位为零)。由于只有车辆 1 的容量为 2,因此它是唯一能够为 1,2 服务的车辆。
如果 len(l) == 1,这似乎工作正常。如果更大,如果我在没有上述代码的情况下放入 l 对位于同一路线上的位置(因此没有上述容量),则求解器无法找到解决方案约束。
- 有没有更优雅的方式来模拟我的需求?
- 为什么求解器找不到解决方案?
我还考虑了放弃访问的可能性(以高成本),以使求解器有可能从放弃访问的解决方案开始,这样它就会找到从这一点到没有任何放弃的解决方案的方法。我没有运气。
提前致谢。