Работа со складом
При планировании маршрута в свойствах транспортного средства вы можете указать разные сценарии начала и завершения маршрута, работу с несколькими складами, добавить промежуточные остановки и дозагрузку, необходимость возврата на склад или другую локацию в конце рейса.
Сервисное время погрузки на складе
Время загрузки или разгрузки на складе может зависеть как от заказов, так и от свойств автомобиля (например, габариты или оборудование).
Чтобы указать количество дополнительного времени, необходимого для загрузки на складе, используйте параметр vehicle.depot_extra_service_duration_s
. Время указывается в секундах.
Примечание
Время, которое назначается в параметре vehicle.depot_extra_service_duration_s
, суммируется с временем обслуживания склада.
Пример
2 автомобиля с одинаковой грузоподъемностью выполняют доставку 13 крупногабаритных заказов. Сервисное время на складе depot.service_duration_s
составляет 5 минут (300 секунд). Для погрузки заказов в автомобиль на складе задано дополнительное время vehicle.depot_extra_service_duration_s
— 30 минут (1800 секунд). В результате планирования каждый автомобиль проведет на складе 35 минут перед началом движения по маршруту.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Старт загруженного автомобиля
В случае, когда автомобиль загружен заранее, и тратить время на погрузку в начале смены не нужно, используйте свойство автомобиля starts_loaded
= true
. Тогда при планировании для такого автомобиля будет проигнорировано сервисное время на складе перед первым рейсом.
Пример
Доставку выполняют два автомобиля: первый загружен до начала смены, второй начинает смену с загрузки. Сервисное время на складе depot.service_duration_s
составляет 10 минут (600 секунд).
В результате планирования первый автомобиль сразу отправляется на маршрут, а второй проведет на складе 10 минут перед началом движения.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Старт автомобиля не со склада
По умолчанию автомобили и курьеры стартуют со склада, но иногда нужно начинать маршрут из другой точки (например, из дома или с места парковки). Как правило, эта задача подходит для планирования маршрутов торговых представителей, сервисных инженеров и прочих специалистов, которые не развозят товары, а оказывают услуги.
Это требование можно реализовать с помощью свойства vehicle.start_at
. В этом случае курьер или автомобиль начнет маршрут из указанной точки с типом garage
, а не со склада.
Посещение склада перед началом рабочего дня
При начале рабочего дня не со склада курьерам может понадобиться посетить склад, чтобы получить там заказы. Для этого используйте свойство vehicle.visit_depot_at_start
. Если указано true
, то перед началом выполнения заказов курьер или автомобиль обязаны посетить склад (это поведение по умолчанию). В противном случае они могут сразу начать выполнять заказы. Подробнее см. в разделе Старт или окончание маршрута в произвольной точке.
Если курьеры стартуют из точки типа garage
, но часть заказов нужно забрать на складе, включите опцию Может посещать склад в начале маршрута (can_visit_depot_at_start
в API, по умолчанию false
). Опция работает только для тех курьеров, у кого указан параметр visit_depot_at_start
= false
. У заказов, которые нужно забрать на складе, укажите один из следующих параметров:
— depot_id
, чтобы привязать заказ к складу;
— depot_ready_time
— время готовности заказа на складе;
— depot_expiring_time
— крайнее время получения заказа на складе.
Также можно неявно разрешить заезд на склад в начале маршрута при выключенной опции can_visit_depot_at_start
, если явно указать склад в planned_route
, зафиксированной части маршрута или при допланировании.
Пример 1
Доставку выполняют три автомобиля. Первый начинает доставку со склада. Второй начинает и заканчивает маршрут без посещения склада. При этом точка старта для курьера — заказ 6, который имеет тип garage
. Третий начинает маршрут не со склада, а с заказа 4 (тип garage
), но обязан посетить склад до начала выполнения заказов.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 2
Доставку выполняют три автомобиля. Первый начинает доставку со склада. Второй и третий начинают и заканчивают маршрут без посещения склада. Заказы 1 и 7 имеют тип pickup
, и алгоритм выбирает их первыми точками маршрутов.
В результате запланированы три отдельных маршрута из-за наличия приоритетов у заказов.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 3
Доставку выполняют два автомобиля (visit_depot_at_start
= false
и can_visit_depot_at_start
= true
). Первый стартует с точки типа garage
и в начале пути заезжает на склад за заказом 1. Маршрут второго не предполагает заезд на склад, он сразу едет на доставку.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Работа с несколькими складами
При выполнении маршрута курьер может посещать несколько складов. Это пригодится, если товары хранятся на разных складах или требуется завершить маршрут на определенном складе.
Укажите склады одним из способов:
- На листе Vehicles в поле Склады, которые может посещать курьер (
vehicle.depot_id
в API) — склады, которые разрешено посещать курьеру во время маршрута. Приоритет у них выше, поэтому алгоритм может назначить их стартовыми, промежуточными или конечными. - В полях:
- Склады для загрузки (
vehicle.starting_depot_id
в API) — стартовые склады, с которых курьер начинает маршрут; - Промежуточные склады (
vehicle.middle_depot_id
в API) — промежуточные склады для дозагрузки во время маршрута; - Склады для завершения маршрута (
vehicle.ending_depot_id
в API) — конечные склады, в которых курьер завершает маршрут.
Примечание
Поле depot_id
имеет более высокий приоритет, чем starting_depot_id
, middle_depot_id
и ending_depot_id
. Если в поле depot_id
задан склад, остальные поля со складами не учитываются.
Чтобы курьер мог посетить любой из складов, указанных при планировании, используйте параметр vehicle.allow_all_depots
. Подробнее см. Работа со всеми складами.
Пример 1
В задаче планирования 9 заказов. На листе Vehicles в поле depot_id
указаны три склада: Depot 1, Depot 2 и Depot 3. В маршруте курьеру разрешено посещать несколько складов.
В результате планирования курьер:
- начинает маршрут со склада Depot 2, так как он находится рядом с первым заказом;
- завершает маршрут на складе Depot 3, потому что последний заказ расположен рядом с ним.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 2
Курьеру нужно доставить 9 заказов. В планировании участвуют два склада:
- Depot 2 — стартовый (
starting_depot_id
= 2) и конечный (ending_depot_id
= 2); - Depot 1 — промежуточный (
middle_depot_id
= 1).
В результате планирования курьер начинает маршрут на складе Depot 2 и доставляет 4 заказа. Затем он посещает склад Depot 1 для дозагрузки, доставляет оставшиеся заказы и завершает маршрут на складе Depot 2.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 3
Задача курьера — доставить 9 заказов. В планировании указаны три склада:
- Depot 1 — стартовый (
starting_depot_id
= 1); - Depot 2 — промежуточный (
middle_depot_id
= 2); - Depot 3 — конечный (
ending_depot_id
= 3).
Курьеру разрешено заехать на промежуточный склад для дозагрузки только в начале маршрута (vehicle.depots_only_at_run_beginning
= true
). В результате планирования курьер стартует со склада Depot 1, затем заезжает для дозагрузки на склад Depot 2 и приступает к доставке заказов. Завершается маршрут на складе Depot 3.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Старт с одного из нескольких складов
Чтобы курьер мог стартовать с одного из нескольких складов, перечислите их в поле Склады, которые может посещать курьер (vehicle.depot_id
в API) или Склады для загрузки (vehicle.starting_depot_id
в API). Если складов несколько, алгоритм выберет оптимальный склад для старта. Если поля depot_id
и starting_depot_id
для курьера не заполнены, то он стартует с первого склада из списка depots
.
Внимание
На листе Vehicles в полях Склады, которые может посещать курьер (depot_id
) и Склады для загрузки (starting_depot_id
) нельзя одновременно указывать и обычные склады, и кросс-доки. В одном маршруте курьер может посещать или только обычные склады, или только кросс-доки.
Если использовать функциональность доставки с одного из нескольких складов, курьер сможет забирать заказы с любого из складов, которые он может посещать.
Дополнительно для курьера можно задать параметры Возможность посещения разных складов в одном маршруте (vehicle.allow_different_depots_in_route
в API) и Максимальное количество промежуточных складов (vehicle.max_middle_depots
в API). Подробнее см. в разделе Выбор оптимального склада для старта.
Дозагрузка на промежуточном складе
Чтобы у курьера была возможность посещать во время движения по маршруту дополнительные склады для дозагрузки заказов, установите параметр Возможность посещения разных складов в одном маршруте (vehicle.allow_different_depots_in_route
в API) = true
. Склады для дозагрузки необходимо указать в поле Склады, которые может посещать курьер (vehicle.depot_id
в API) или Промежуточные склады (vehicle.middle_depot_id
в API). Если заказы есть на нескольких складах, то алгоритм выберет оптимальный склад для дополнительной загрузки.
Внимание
На листе Vehicles в полях Склады, которые может посещать курьер (depot_id
) или Промежуточные склады (middle_depot_id
) нельзя одновременно указывать и обычные склады, и кросс-доки. В одном маршруте курьер может посещать или только обычные склады, или только кросс-доки.
Если курьер может заезжать на промежуточные склады для дозагрузки только в начале маршрута (до посещения первого заказа), установите параметр vehicle.depots_only_at_run_beginning
= true
(по умолчанию false
).
Дополнительно для курьера можно задать параметр Максимальное количество промежуточных складов (vehicle.max_middle_depots
в API). Подробнее см. в разделе Заезд на дополнительный склад.
Возврат на склад в конце маршрута или рейса
По умолчанию курьер завершает маршрут на складе, с которого стартовал. Чтобы разрешить курьеру посещать несколько складов на маршруте, установите параметр Возможность посещения разных складов в одном маршруте (vehicle.allow_different_depots_in_route
в API) = true
. В этом случае курьер может завершать маршрут на складе, отличном от начального.
Склады, где курьер может завершить маршрут, укажите в поле Склады, которые может посещать курьер (vehicle.depot_id
в API) или Склады для завершения маршрута (vehicle.ending_depot_id
в API). Если складов несколько, алгоритм выберет оптимальный склад для возврата.
Внимание
На листе Vehicles в полях Склады, которые может посещать курьер (depot_id
) или Склады для завершения маршрута (ending_depot_id
) нельзя одновременно указывать и обычные склады, и кросс-доки. В одном маршруте курьер может посещать или только обычные склады, или только кросс-доки.
Чтобы курьер завершал маршрут на том же складе, откуда выехал, используйте параметр vehicle.finish_route_in_starting_depot
= true
(по умолчанию false
). Если при этом курьер начинает маршрут не со склада (vehicle.visit_depot_at_start
= false
), он должен будет вернуться на тот склад, откуда выехал на второй рейс маршрута.
Чтобы курьер завершал каждый рейс на том же складе, откуда этот рейс был начат, используйте параметр vehicle.finish_run_in_starting_depot
= true
(по умолчанию false
). Чтобы курьер между рейсами мог переехать с одного склада на другой, задайте параметр vehicle.can_change_depot_between_runs
= true
, см. Старт нового рейса с другого склада.
Примечание
Параметры vehicle.finish_route_in_starting_depot
= true
и vehicle.finish_run_in_starting_depot
= true
имеют смысл, только если vehicle.allow_different_depots_in_route
= true
.
Если курьер не должен возвращаться на склад после выполнения всех заказов, используйте опцию Возврат на склад в конце смены (vehicle.return_to_depot
в API) = false
.
Пример 1.1
Два курьера должны доставить два заказа: один заказ delivery
нужно забрать со Склада 1, второй заказ pickup
нужно доставить на Склад 2. Оба курьера могут сделать только по 1 рейсу, выехать с любого склада и завершить маршрут на любом складе. Обоим курьерам разрешено посещать разные склады в одном рейсе, но заезжать на промежуточные склады курьеры не могут.
В решении используется только один курьер: он выезжает со Склада 1, забрав заказ delivery
, доставляет его, забирает заказ pickup
и доставляет его на Склад 2, где и завершает маршрут.
Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 1.2
То же, что в примере 1.1, но курьеры должны завершить маршрут на том же складе, откуда выехали (vehicle.finish_route_in_starting_depot
= true
).
В решении используются оба курьера. Курьер 1 выезжает со Склада 1, забрав заказ delivery
, доставляет его и возвращается на Склад 1. Второй курьер выезжает со Склада 2, забирает заказ pickup
и возвращается с ним на Склад 2.
Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Работа со всеми складами
Если при планировании используется много складов, а курьеры могут посещать любые из них, используйте параметр vehicle.allow_all_depots
= true
.
В этом случае любой склад может быть добавлен в маршрут курьера без необходимости указывать его отдельно в параметрах автомобиля.
Пример 1
Для курьера запланировано 4 заказа, которые привязаны к разным складам. В параметрах курьера указаны:
- склад для посещения
vehicle.depot_id
= 50; - склад для завершения маршрута
vehicle.ending_depot_id
= 10; - промежуточный склад
vehicle.middle_depot_id
= 20; - склад для дозагрузки
vehicle.starting_depot_id
= 50.
Параметр vehicle.allow_all_depots
не задан и по умолчанию имеет значение false
. В результате планирования в маршрут попали только склады 10, 20 и 50, а также заказы 3 и 4.
Остальные заказы, привязанные к другим складам, не попали в маршрут, так как эти склады не указаны в параметрах курьера и считаются для него недоступными.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 2
То же, что в примере 1, но vehicle.allow_all_depots
= true
. В результате планирования все склады и заказы попали в маршрут.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Возврат на произвольную точку в конце маршрута
Если в вашем сценарии работы необходимо учитывать удаленность последнего заказа от места парковки курьера или, например, домашнего адреса, вы можете это учесть следующим образом:
-
Создайте точку с типом
garage
(полеlocation.type
). Эта точка будет использоваться только для окончания маршрутов. -
Для курьера, которому необходимо вернуться в конце работы «домой» или «на парковку», укажите идентификатор этой точки в поле
vehicle.finish_at
.
При решении задачи все автомобили или курьеры, у которых указано свойство finish_at
, вернутся на указанную точку. Если включена опция возврата на склад (vehicle.return_to_depot
= true
), то в маршруте сначала будет посещен склад, а затем проложен путь до места парковки.
Пример
В примере ниже используется два автомобиля с разной грузоподъемностью и четыре заказа с различным весом. Оба автомобиля участвуют в доставке из-за весовых ограничений. Автомобиль 2 не должен возвращаться на склад после доставки последнего заказа.
Примечание
Обратите внимание, что в ответе Маршрутизации автомобиль 2 завершает маршрут на последнем заказе.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Начало или окончание маршрута как можно ближе к складу
Для курьера можно запланировать маршрут так, чтобы он начинал или заканчивал движение на заказе, который находится ближе всего к складу, или наоборот, дальше всего от склада. Например, можно начинать маршрут с наиболее близких к складу заказов, если с утра могут появиться дополнительные заказы, за которыми нужно вернуться на склад. Также иногда удобно начинать маршрут с самого дальнего заказа, чтобы к вечеру оказаться недалеко от склада.
Если вы не применяете расширенные настройки стоимости, используйте следующие параметры:
-
first_edges_penalty_factor
— штраф за расстояние от склада до первого заказа, по умолчанию 0. Если значение больше 0, алгоритм минимизирует это расстояние, а если меньше 0 — максимально увеличивает. -
last_edges_penalty_factor
— штраф за расстояние от склада до последнего заказа, по умолчанию 0. Если значение больше 0, алгоритм минимизирует это расстояние, а если меньше 0 — максимально увеличивает.
Штрафы рассчитываются по аналогии с длительностью и длиной отрезков на маршруте, см. группу Движение между точками на маршруте в разделе Расширенные настройки стоимости.
При больших значениях штрафов маршруты могут получиться неоптимальными по пробегу. При маленьких значениях штрафов требование по выбору первого или последнего заказа на маршруте может нарушаться, если это значительно экономит пробег.
Если вы применяете расширенные настройки стоимости, используйте ключевые слова из группы Движение от склада или к складу.
Пример
В примере ниже 1 курьер и 10 заказов. Заданы 2 штрафа: first_edges_penalty_factor
= 2 и last_edges_penalty_factor
= -2. В результате планирования маршрут начинается с самого близкого к складу заказа и заканчивается самым дальним.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте