Допланирование маршрутов
Допланирование — это добавление локаций и посещений в спланированные ранее маршруты сотрудников. Задача допланирования возникает, когда часть локаций и посещений уже распределена по маршрутам, но появились изменения:
- добавились новые локации для обслуживания;
- изменились требования по посещению локаций;
- изменился список сотрудников, обслуживающих локации.
Примечание
Данный сценарий реализуется только через запросы API.
В задачу допланирования передаются:
- общий список локаций и посещений (старые и новые);
- список сотрудников, которые могут обслуживать локации;
- маршруты, полученные на предыдущей итерации планирования;
- настройки, определяющие возможности изменения построенных ранее маршрутов.
Как реализовать сценарий
При допланировании в запрос нужно включить объекты locations
, employees
и options
как при обычном планировании, а также объект initial_routes
с данными о первоначально спланированных маршрутах. Эти данные можно скопировать из объекта result.routes
в ответе API для первой задачи планирования. Для каждого маршрута нужно передать объекты:
day
— номер дня в периоде планирования (нумерация начинается с 0);route
— массив локаций в маршруте;run_number
— номер маршрута (нумерация начинается с 1);employee_id
— идентификатор сотрудника.
Можно скопировать объект result.routes
целиком — при допланировании лишние блоки, например метрики result.routes.metrics
, будут проигнорированы.
Фиксированные маршруты
При допланировании можно зафиксировать результаты первоначального планирования, тогда спланированные ранее маршруты останутся без изменений, а новые посещения будут спланированы отдельно.
Чтобы зафиксировать маршрут, укажите для него параметр 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 локаций. Период планирования — 5 дней. Большая часть посещений распределена на сотрудника Employee1.
При допланировании добавляются еще 10 локаций. Первоначальные маршруты не фиксируются, поэтому посещения перераспределяются между двумя сотрудниками. Нераспределенных локаций и посещений нет.
Пример 2
То же, что в примере 1, но допланирование производится на второй день периода планирования. Поэтому маршруты, выполненные в первый день, фиксируются для обоих сотрудников. В результате 10 посещений (по одному для каждой из 10 добавленных локаций) остаются нераспределенными.