Допланирование маршрутов

Допланирование — это добавление локаций и посещений в спланированные ранее маршруты сотрудников. Задача допланирования возникает, когда часть локаций и посещений уже распределена по маршрутам, но появились изменения:

  • добавились новые локации для обслуживания;
  • изменились требования по посещению локаций;
  • изменился список сотрудников, обслуживающих локации.

Примечание

Данный сценарий реализуется только через запросы 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.

Запрос API (JSON)Ответ API

При допланировании добавляются еще 10 локаций. Первоначальные маршруты не фиксируются, поэтому посещения перераспределяются между двумя сотрудниками. Нераспределенных локаций и посещений нет.

Запрос API (JSON)Ответ API

Пример 2

То же, что в примере 1, но допланирование производится на второй день периода планирования. Поэтому маршруты, выполненные в первый день, фиксируются для обоих сотрудников. В результате 10 посещений (по одному для каждой из 10 добавленных локаций) остаются нераспределенными.

Запрос API (JSON)Ответ API

Написать в службу поддержки