Допланирование маршрутов
Допланирование — это добавление локаций и посещений в ранее спланированные маршруты. Задача допланирования возникает, когда часть локаций и посещений уже распределена по маршрутам, но появились изменения:
- добавились новые локации для обслуживания;
- изменились требования по посещению локаций;
- изменился список сотрудников, обслуживающих локации.
Примечание
Данный сценарий реализуется только через запросы API.
В задачу допланирования передаются:
- список сотрудников, которые могут обслуживать локации;
- маршруты из предыдущей итерации планирования;
- общий список локаций и посещений (к локациям из ранее спланированного маршрута добавляются новые);
- настройки маршрутов.
Как реализовать сценарий
При допланировании в запрос нужно включить объекты:
-
employeesиoptionsкак при обычном планировании; -
initial_routesс данными о первоначально спланированных маршрутах, которые можно скопировать из объектаresult.routesв ответе API для задачи первоначального планирования.Чтобы получить ответ API, перейдите по ссылке и укажите идентификатор задачи планирования:
https://courier.yandex.ru/vrs/api/v1/result/<id_задачи_планирования>.Пример объекта
result.routesиз ответа APIСкачать пример можно по ссылке.
Для каждого маршрута из объекта
result.routesобязательно скопировать:day— номер дня в периоде планирования (нумерация начинается с 0);employee_id— идентификатор сотрудника;route— массив локаций в маршруте;run_number— номер маршрута (нумерация начинается с 1).
-
locationsс ранее запланированными и новыми локациями.
Фиксированные маршруты
При допланировании можно зафиксировать результаты первоначального планирования, тогда спланированные ранее маршруты останутся без изменений, а новые посещения будут спланированы отдельно.
Чтобы зафиксировать маршрут, укажите для него параметр fixed = true. Фиксированные маршруты должны должны располагаться в начале объекта initial_routes и идти подряд, между ними не могут находиться незафиксированные маршруты. Если между маршрутами есть пропущенные пустые дни, в которые сотрудник не посещает локации, эти дни тоже будут зафиксированы и останутся неиспользованными в итоговом решении.
Пример кода с фиксированными маршрутами
В этом примере зафиксированы маршруты для сотрудника в дни со 0-го по 5-ый. При этом 0, 1, 3 и 4-ый дни не используются — в эти дни сотруднику не будут запланированы посещения локаций. Посещения в дни 2 и 5 останутся без изменений. На 6-ой день сотруднику могут быть запланированы посещения. Посещения, запланированные на 7-ой день, могут быть изменены или переданы другому сотруднику, а также могут быть добавлены новые посещения.
"initial_routes": [
{
"route": [
...
],
"employee_id": "Employee 1",
"day": 2,
"fixed": true
},
{
"route": [
...
],
"employee_id": "Employee 1",
"day": 5,
"fixed": true
},
{
"route": [
...
],
"employee_id": "Employee 1",
"day": 7
},
...
]
Чтобы зафиксировать все спланированные ранее маршруты, укажите параметр fixed = true в объекте options.
Пример кода, где все маршруты зафиксированы
"locations": [
...
],
"employees": [
...
],
"options": [
...
"fixed": true
],
"initial_routes": [
...
]
Зафиксировать можно только весь маршрут целиком. Часть маршрута, то есть посещения отдельных локаций, зафиксировать нельзя.
Фиксированные посещения
Чтобы зафиксировать посещения в маршруте route в initial_routes, используйте параметры:
-
fixed_employee— посещение может выполнить только указанный сотрудник. При этом оно может быть перенесено на другой день или пропущено. Зафиксировать за сотрудником можно только все посещения локации. -
fixed_day— посещение может быть выполнено только в указанный день. При этом оно может быть передано другому сотруднику или пропущено. -
undroppable— посещение не может быть пропущено. При этом оно может быть передано другому сотруднику или перенесено на другой день.
Эти параметры можно комбинировать.
Рекомендованное и обязательное время посещения
При планировании маршрута в параметре route вы можете указать рекомендованное время:
- прибытия сотрудника на локацию
arrival_time_s; - завершения посещения локации
departure_time_s.
Если рекомендованное время указывается хотя бы для одной локации в маршруте, его нужно указать для всех локаций в этом маршруте в initial_routes.
Кроме рекомендованного времени для локаций можно указать обязательное время:
- прибытия сотрудника на локацию
actual_arrival_time_s; - начала обслуживания
actual_service_start_time_s; - завершения посещения локации
actual_departure_time_s.
При допланировании алгоритм будет стремиться соблюсти рекомендованное время. Обязательное время гарантированно будет соблюдено.
Обязательное время посещения можно указывать только для локаций в фиксированных маршрутах. Если обязательное время указано хотя бы у одной локации в маршруте, его нужно указать для всех локаций в этом маршруте. Маршруты, в которых указано обязательное время, должны располагаться первыми среди маршрутов сотрудника и идти подряд, между ними не могут находиться маршруты, в которых обязательное время не указано.
В рамках маршрута локации должны быть перечислены так, чтобы рекомендованное и обязательное время шли в неубывающем порядке.
Примечание
Если к моменту запуска задачи допланирования сотрудник уже начал выполнять маршрут и посетил некоторые локации, в качестве обязательного времени укажите фактическое время посещения локаций сотрудником.
Примеры
Пример 1
В первоначальном планировании два сотрудника обслуживают 20 локаций. Период планирования — 6 дней. Большая часть посещений распределена на первого сотрудника.
При допланировании добавляются еще 10 локаций. Первоначальные маршруты не фиксируются, поэтому посещения перераспределяются между двумя сотрудниками. Нераспределенных локаций и посещений нет.
Пример 2
То же, что в примере 1, но допланирование производится на второй день периода планирования. Поэтому маршруты, выполненные в первый день, фиксируются для обоих сотрудников. В результате 2 посещения остаются нераспределенными — по 1 из 4 посещений, запланированных для локаций 21 и 23.