如何在 Google OR-Tools Route Optimization 中限制每辆车的位置数量
How to limit number of locations for each vehicle in Google OR-Tools Route Optimization
我已经实现了用于路线优化的 Or-Tools。它工作正常。只有一件事我想达到每辆车的位置限制数量。例如,为每辆车定义最多两 (2) 个位置。
我尝试实施容量限制,但它不起作用。我还尝试实现 SetSpanUpperBoundForVehicle 函数,在这种情况下,解决方案对象为空。
这是我的代码
RoutingDimension timeDimension = routing.GetMutableDimension("Time");
timeDimension.SetSpanUpperBoundForVehicle(2, 0);
timeDimension.SetSpanUpperBoundForVehicle(2, 1);
timeDimension.SetSpanUpperBoundForVehicle(2, 2);
我如何限制这条路线的数量?请帮忙
只需创建一个计数器维度,在每个位置加 1,然后将每辆车的容量限制为允许的最大位置数。
例如重复使用 vrp.py 个示例并添加:
# Create counter
def counter_callback(from_index):
"""Returns 1 for any locations except depot."""
# Convert from routing variable Index to user NodeIndex.
from_node = manager.IndexToNode(from_index)
return 1 if (from_node != 0) else 0;
counter_callback_index = routing.RegisterUnaryTransitCallback(counter_callback)
routing.AddDimensionWithVehicleCapacity(
counter_callback_index,
0, # null slack
[4,5,4,6], # maximum locations per vehicle
True, # start cumul to zero
'Counter')
可能的输出:
%python vrp.py
Objective: 6780
Route for vehicle 0:
0 -> 7 -> 0
Distance of the route: 388m
Route for vehicle 1:
0 -> 14 -> 16 -> 15 -> 3 -> 4 -> 0
Distance of the route: 2716m
Route for vehicle 2:
0 -> 13 -> 12 -> 11 -> 1 -> 0
Distance of the route: 1804m
Route for vehicle 3:
0 -> 5 -> 8 -> 6 -> 2 -> 10 -> 9 -> 0
Distance of the route: 1872m
Total Distance of all routes: 6780m
如您所见,路由遵守 4, 5, 4, 6
位置限制。
注:对于C#的语法,几乎是一样的见
https://github.com/google/or-tools/blob/stable/ortools/constraint_solver/samples/VrpCapacity.cs
和 https://github.com/google/or-tools/blob/stable/ortools/constraint_solver/samples/VrpCapacity.csproj
我已经实现了用于路线优化的 Or-Tools。它工作正常。只有一件事我想达到每辆车的位置限制数量。例如,为每辆车定义最多两 (2) 个位置。
我尝试实施容量限制,但它不起作用。我还尝试实现 SetSpanUpperBoundForVehicle 函数,在这种情况下,解决方案对象为空。
这是我的代码
RoutingDimension timeDimension = routing.GetMutableDimension("Time");
timeDimension.SetSpanUpperBoundForVehicle(2, 0);
timeDimension.SetSpanUpperBoundForVehicle(2, 1);
timeDimension.SetSpanUpperBoundForVehicle(2, 2);
我如何限制这条路线的数量?请帮忙
只需创建一个计数器维度,在每个位置加 1,然后将每辆车的容量限制为允许的最大位置数。
例如重复使用 vrp.py 个示例并添加:
# Create counter
def counter_callback(from_index):
"""Returns 1 for any locations except depot."""
# Convert from routing variable Index to user NodeIndex.
from_node = manager.IndexToNode(from_index)
return 1 if (from_node != 0) else 0;
counter_callback_index = routing.RegisterUnaryTransitCallback(counter_callback)
routing.AddDimensionWithVehicleCapacity(
counter_callback_index,
0, # null slack
[4,5,4,6], # maximum locations per vehicle
True, # start cumul to zero
'Counter')
可能的输出:
%python vrp.py
Objective: 6780
Route for vehicle 0:
0 -> 7 -> 0
Distance of the route: 388m
Route for vehicle 1:
0 -> 14 -> 16 -> 15 -> 3 -> 4 -> 0
Distance of the route: 2716m
Route for vehicle 2:
0 -> 13 -> 12 -> 11 -> 1 -> 0
Distance of the route: 1804m
Route for vehicle 3:
0 -> 5 -> 8 -> 6 -> 2 -> 10 -> 9 -> 0
Distance of the route: 1872m
Total Distance of all routes: 6780m
如您所见,路由遵守 4, 5, 4, 6
位置限制。
注:对于C#的语法,几乎是一样的见 https://github.com/google/or-tools/blob/stable/ortools/constraint_solver/samples/VrpCapacity.cs 和 https://github.com/google/or-tools/blob/stable/ortools/constraint_solver/samples/VrpCapacity.csproj