#python #or-tools #vehicle-routing
#python #или-инструменты #маршрутизация транспортного средства
Вопрос:
Я успешно воссоздаю проблему маршрутизации транспортных средств доставки и доставки, но я хочу добавить дополнительное ограничение, которое я нигде не могу найти, как его реализовать: я хочу, чтобы мои транспортные средства всегда возвращались на склад после доставки. Как я могу применить это ограничение? Кажется, что если я добавлю дизъюнкцию, то решатель может в конечном итоге не доставить в определенное место доставки.
Комментарии:
1. Просто измените матрицу расстояний таким образом, чтобы единственный выход из доставки был в хранилище. Или добавьте измерение с емкостью 1, увеличенное на единицу при доставке.
2. @LaurentPerron Спасибо за быстрый ответ. Не могли бы вы привести пример в обоих случаях, чтобы точно понять, что вы имеете в виду, и принять решение в отдельном ответе?
3. @LaurentPerron Я думаю, что ответ — это то, что вы имели в виду?
Ответ №1:
Отвечая на мой собственный вопрос:
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')
Ответ №2:
Вы можете определить склады транспортных средств (начало и / или конец) непосредственно при инициализации:
# Create the routing index manager.
self.manager = pywrapcp.RoutingIndexManager(len(locations), len(vehicles), start_depots, end_depots)
self.routing = pywrapcp.RoutingModel(self.manager)
start_depots и end_depots — это оба списка, размер транспортных средств. Одни и те же хранилища могут быть в обоих списках