【发布时间】:2020-12-24 21:33:35
【问题描述】:
使用 OR-tools 我正在尝试对每次交付的多次取货问题进行建模,其中只有当所有取货都在交付到达之前被检查并且无法让求解器找到部分解决方案时才能完成交付。 在下面的玩具示例中,求解器返回一个空的解决方案,同时它可以在给定的 MAX_ROUTE_TIME 限制内完成前 2 个拾取和交付。我是否正确设置了每次交货的多件取件?
我尝试了以下方法但没有成功:
- 添加一个约束,即应将同一交货的取货分配给同一车辆。
- 将配送节点拆分为 2 个,将取货和配送设置为每对取货-配送,并设置相同的车辆约束和相同的累计值。
- 将取货罚款设为 0,而送货罚款同样高。
import numpy as np
from ortools.constraint_solver import routing_enums_pb2, pywrapcp
manager = pywrapcp.RoutingIndexManager(7, 1, 0)
routing = pywrapcp.RoutingModel(manager)
dim_name = 'Time'
durations = np.array(
[[ 0, 1, 1, 1, 100, 100, 100],
[ 1, 0, 1, 1, 100, 100, 100],
[ 1, 1, 0, 1, 100, 100, 100],
[ 1, 1, 1, 0, 100, 100, 100],
[100, 100, 100, 100, 0, 100, 100],
[100, 100, 100, 100, 100, 0, 100],
[100, 100, 100, 100, 100, 100, 0]])
def duration_callback(from_index, to_index):
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
return durations[from_node][to_node]
transit_callback_index = routing.RegisterTransitCallback(duration_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)
MAX_ROUTE_TIME = 400
routing.AddDimension(transit_callback_index, 0, MAX_ROUTE_TIME, True, dim_name)
time_dimension = routing.GetDimensionOrDie(dim_name)
pickups_deliveries = [
(1, 3),
(2, 3),
(4, 6),
(5, 6)
]
for pickup, delivery in pickups_deliveries:
pickup_index = manager.NodeToIndex(pickup)
delivery_index = manager.NodeToIndex(delivery)
routing.AddPickupAndDelivery(pickup_index, delivery_index)
routing.solver().Add(routing.VehicleVar(pickup_index) == routing.VehicleVar(delivery_index))
routing.solver().Add(time_dimension.CumulVar(pickup_index) <= time_dimension.CumulVar(delivery_index))
for node in range(1, 7):
routing.AddDisjunction([manager.NodeToIndex(node)], 10000000)
search_parameters = pywrapcp.DefaultRoutingSearchParameters()
search_parameters.first_solution_strategy = routing_enums_pb2.FirstSolutionStrategy.AUTOMATIC
search_parameters.local_search_metaheuristic = routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH
search_parameters.lns_time_limit.seconds = 2
search_parameters.time_limit.seconds = 5
solution = routing.SolveWithParameters(search_parameters)
vehicle_id = 0
index = routing.Start(vehicle_id)
node = manager.IndexToNode(index)
while not routing.IsEnd(index):
previous_node = node
previous_index = index
index = solution.Value(routing.NextVar(index))
node = manager.IndexToNode(index)
print(previous_node, node ,durations[previous_node, node])
【问题讨论】:
标签: python or-tools vehicle-routing