Примеры использования
В данном разделе собраны примеры настроек для различных сценариев использования Календарного планирования.
Планирование по локациям и посещениям
Планировать маршруты можно несколькими способами:
-
Если все посещения локации одинаковые, достаточно на листе locations указать список локаций и для каждой локации задать параметры:
- временные окна;
- сервисное время;
- дни посещений;
- количество и частоту посещений;
- штраф за непосещение локации.
В этом случае лист visits в файле планирования не нужен.
-
Если у локаций есть разные типы посещений, которые нужно выполнять в определенной последовательности, их нужно настроить на листе visits. Сервисное время, штраф за непосещение и дни посещения указываются для типов посещений на листе visits, а временные окна, количество и частота посещений – для локации в целом на листе locations.
-
Можно сочетать 1 и 2 способы: указывать типы посещений только для некоторых локаций, а для остальных — только параметры локаций.
Пример 1
2 сотрудника посещают 20 локаций. Для них на листе locations заданы сервисное время service_duration_s
, дни для посещения allowed_days
, preferred_days
, mandatory_days
и denied_days
, штрафы за пропуск посещения penalty.visit_count.per_visit
и за пропуск всех посещений penalty.drop
.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 2
То же, что в примере 1, но для всех локаций заданы типы посещений на листе visits. Для каждого типа посещения указаны сервисное время service_duration_s
, дни для посещения allowed_days
, preferred_days
и denied_days
, штраф за пропуск посещения drop
.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 3
То же, что в примере 1, но для локаций 1 и 3 заданы типы посещений на листе visits. Для всех остальных локаций типы посещений не заданы, и их параметры указаны только на листе locations.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Приоритеты локаций и посещений
Вы можете задать приоритеты посещения локаций следующими способами:
- указать приоритеты для некоторых или всех локаций;
- назначить штрафы за непосещение локаций в зависимости от их приоритета;
- указать для локаций опциональные теги с разным весом.
Для каждого из этих способов можно дополнительно использовать параметр late_days_cost_increment
, который позволит запланировать посещения приоритетных локаций в наиболее ранние дни.
Назначение приоритетов
Вы можете указать приоритеты для посещения всех или некоторых локаций напрямую с помощью параметра priority
на листе locations
. Подробнее см. в разделе Приоритеты.
Пример
В планировании участвуют 2 сотрудника, которым нужно посетить 32 локации с разными приоритетами: 0, 1 или без приоритета.
В результате планирования сотрудники посещают все локации, для которых установлен приоритет 0 или без указания приоритета. Локации с приоритетом 1 остаются нераспределенными.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Приоритеты с помощью штрафов
Для установки приоритетов локаций и посещений можно использовать штрафы за непосещение локаций и за пропуск отдельных типов посещений. Чем выше штраф, тем выше вероятность, что локация или посещение будут запланированы.
Можно использовать следующие параметры:
-
для локаций — на листе locations:
penalty.drop
— фиксированный штраф, если не было запланировано ни одного посещения локации;penalty.visit_count.fixed
— фиксированный штраф, если пропущено хотя бы одно посещение локации;penalty.visit_count.per_visit
— штраф за каждое пропущенное посещение локации.
-
для отдельных типов посещений — на листе visits укажите значение параметра
drop
(locations.visits.N.drop
в запросе API). Оно заменит значениеpenalty.visit_count.per_visit
для посещений этого типа.
Подробнее о параметрах, которые используются при планировании посещений, см. в разделах Количество и частота посещений локации и Типы посещений.
Пример 1
В планировании участвуют 2 сотрудника, которым нужно посетить 32 локации с одинаковым приоритетом. При этом у каждой локации указано жесткое временное окно, поэтому опоздание или ранее посещение локаций не предусмотрено. Штраф за непосещение локаций penalty.drop
= 0.
В результате планирования сотрудники ни разу не посещают локацию 3, а также пропускают несколько посещений локаций 1 и 7.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 2
То же, что в примере 1, но у локации 3 высокий приоритет, поэтому для нее задан штраф penalty.drop
= 1 000 000.
В результате планирования сотрудники посещают локацию 3, а посещения локаций 25 и 29 остаются нераспределенными.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 3
То же, что в примере 1, но на листе visits заданы штрафы drop
за пропуски различных типов посещений локации 1 в порядке убывания их приоритета:
- 1 000 000 — инвентаризация;
- 500 000 — установка рекламы;
- 100 000 — раскладка товаров.
В результате запланированы все локации и посещения, кроме двух посещений для раскладки товаров в локации 1.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Приоритеты с помощью тегов
Вы можете задать приоритет посещения локации с помощью опциональных тегов. Для этого на листе locations в поле optional_tags.0.tag задайте название тега, а в поле optional_tags.0.value — его вес (больше нуля). Чем больше вес тега, тем с большей вероятностью посещение этих локаций будет запланировано.
Пример
Двум сотрудникам нужно посетить 49 локаций. 8 локаций помечены опциональным тегом VIP
с весом 3000.
В результате планирования все VIP-локации распределены между сотрудниками, а часть локаций без тега оказываются нераспределенными.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Посещение в наиболее ранние дни
Чтобы посетить приоритетные локации в более ранние дни, вы можете задать параметр late_days_cost_increment
на листе options. Описание работы параметра см. в разделе Посещения в наиболее ранние дни.
Пример 1
Сотруднику необходимо посетить 40 локаций, параметр late_days_cost_increment
не используется. В результате запланированы посещения локаций на 5 дней.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 2
То же, что в примере 1, но на листе options установлен параметр late_days_cost_increment
= 1000. В результате запланированы посещения локаций на 4 дня.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Посещение удаленно расположенных локаций
Одна или несколько локаций могут располагаться далеко от остальных. В этом случае стоимость посещения локации может оказаться выше, чем штраф за непосещение или пропуск одного из посещений. Локация окажется нераспределенной. Чтобы избежать этого, для удаленных локаций на листе locations можно назначать более высокие штрафы:
penalty.visit_count.per_visit
— за пропуск одного посещения локации;penalty.drop
— за пропуск всех посещений.
Стоимость посещения локации может складываться из стоимости за час работы сотрудника, за километр маршрута, за факт выхода сотрудника на работу (если на удаленную вакансию придется отправить дополнительного сотрудника) и других параметров, подробнее см. в разделе Стоимость работы и выплаты сотрудникам.
Пример 1
Два сотрудника посещают 18 локаций. Одна из локаций (Location 2) — удаленная. Штраф за непосещение локации drop
для всех локаций равен 1000, штраф за пропуск посещения penalty.visit_count.per_visit
— 17. Стоимость выхода сотрудника на работу cost.fixed
по умолчанию равна 3000 — это больше, чем суммарный штраф за непосещение локации. В результате удаленная локация оказалась нераспределенной.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 2
То же, что в примере 1, но для удаленной локации штраф за пропуск посещения penalty.visit_count.per_visit
увеличен до 3500 — больше стоимости выхода сотрудника на работу. В результате второй сотрудник выходит на работу в отдельные дни специально для посещения удаленной локации.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Планирование с учетом навыков сотрудников
Иногда для посещения локации требуются специальные навыки или оборудование. Чтобы запланировать маршруты с учетом этих требований, используйте теги локаций и сотрудников.
На листе locations в поле required_tags
перечислите через запятую теги, определяющие обязательные требования для посещения локации. Желательные требования указываются в полях optional_tags.N.tag
и optional_tags.N.value
, подробнее см. в разделе Теги локаций.
Если сотрудник соответствует требованиям, заданным для локаций, то на листе employees в поле tags перечислите соответствующие теги. Если сотрудник не должен посещать локации с определенными тегами, укажите их в поле excluded_tags. Подробнее см. в разделе Теги сотрудника.
Пример
Для посещения некоторых локаций требуется спецодежда или наличие сумки-холодильника у сотрудника. У таких локаций в поле required_tags
указаны теги uniform
и fridge
. Локации 7 и 12 желательно посещать сотрудникам с фармакологическим образованием, поэтому у них указан опциональный тег pharmacy
. Сотрудник 1 не имеет соответствующего образования, поэтому для него тег pharmacy
указан в поле excluded_tags.
В результате планирования локации со специальными требованиями распределены по сотрудникам с соответствующими тегами. Сотрудник 1 посещает локации, у которых нет опционального тега pharmacy
.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Кучные маршруты
Чтобы сотрудники затрачивали меньше времени на перемещение между локациями, планируйте маршруты, в которых локации расположены как можно ближе друг к другу. Это можно сделать двумя способами:
- с помощью параметров кучности
global_proximity_factor
иdaily_proximity_factor
; - с помощью ограничений на отрезки маршрута и использования коэффициентов для начальных и конечных отрезков.
Параметры кучности
Чтобы сотрудники посещали близко расположенные локации последовательно, используйте следующие параметры:
global_proximity_factor
— параметр кучности для всего периода планирования;daily_proximity_factor
— параметр кучности в течение дня.
Эти параметры можно задать глобально для всех сотрудников на листе options или для некоторых сотрудников по отдельности — на листе employees.
Параметры кучности могут принимать значение от 0 до 10, где 0 — отсутствие кучности, а 10 — максимальная кучность. Мы рекомендуем значения от 0 до 1 (по умолчанию 0).
Подробнее см. в разделе Кучность маршрутов.
Пример
Локации расположены преимущественно в центре, на севере и на юге города. Чтобы маршруты получились более кучными, заданы параметры global_proximity_factor
= 0.2 и daily_proximity_factor
= 0.5.
В результате маршруты сотрудников получились географически сгруппированными.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Ограничения на отрезки маршрута
Вы можете задать ограничения на расстояние между соседними локациями или время перемещения между ними на листе employees с помощью параметров max_edge_distance_m
и max_edge_duration_s
соответственно. Чтобы алгоритм учитывал начальные и конечные отрезки маршрута по особой стоимости, укажите для них положительные коэффициенты в полях first_edges_penalty_factor
и last_edges_penalty_factor
для пробега на первом и последнем отрезках маршрута соответственно.
Подробнее см. в разделах Ограничения на отрезки маршрута и Начальные и конечные отрезки маршрута.
Пример
Локации расположены преимущественно в центре, на севере и на юге города. Задано ограничение на максимальное расстояние между соседними локациями — 15 000 м. Также указаны повышающие коэффициенты first_edges_penalty_factor
и last_edges_penalty_factor
— 4.
В результате маршруты сотрудников получились географически сгруппированными.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Закрепление локации за сотрудником
Чтобы локацию всегда посещал определенный сотрудник, можно закрепить локацию за сотрудником одним из способов:
- с помощью тегов локаций и тегов сотрудников;
- с помощью разрешенных и запрещенных геозон.
Закрепление локации с помощью тегов
Для сотрудника нужно задать уникальный тег на листе employees в поле tags
. Для всех локаций, которые должны быть закреплены за данным сотрудником, этот тег нужно указать на листе locations в поле required_tags
.
Пример
Посещения 50 локаций могут быть распланированы на 5 сотрудников. У локаций 40 и 50 в поле required_tags
указан уникальный тег сотрудника employee3
, этот же тег указан у сотрудника 3 в поле tags
. В результате посещения локаций 40 и 50 запланированы этому сотруднику.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Закрепление локации с помощью геозон
Если за сотрудником нужно закрепить все локации, расположенные в определенном районе города, можно использовать разрешенные и запрещенные геозоны.
Чтобы посещать локации в геозоне мог только определенный сотрудник, на листе employees укажите название геозоны:
- для выбранного сотруднка – в поле
allowed_zones
; - для остальных сотрудников – в поле
forbidden_zones
.
Добавлять новые геозоны можно через интерфейс и API.
Пример
Посещения 50 локаций могут быть распланированы на 5 сотрудников. Геозона North включает локации, расположенные на севере Москвы. Эта геозона указана для сотрудника 2 в поле allowed_zones
, а для остальных сотрудников — в поле forbidden_zones
. В результате посещения всех локаций, расположенных внутри геозоны North, запланированы сотруднику 2.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Балансировка нагрузки
При планировании распределение локаций между сотрудниками не всегда происходит равномерно. Чтобы распределить нагрузку поровну между сотрудниками, используйте параметры балансировки:
-
Добавьте на лист locations поле
shipment_size.units
– оценка трудозатрат на одно посещение локации. Трудозатраты оцениваются в условных единицах – юнитах.Примечание
Если время обслуживания
service_duration_s
для разных локаций различается, то оценка трудозатратshipment_size.units
должна быть пропорциональнаservice_duration_s
. Например, если для локацииservice_duration_s
= 1800 иshipment_size.units
= 10, то дляservice_duration_s
= 3600 значениеshipment_size.units
должно составлять 20. -
Для каждой локации умножьте
shipment_size.units
наvisit_count
. Вы получите оценку трудозатрат на все посещения локации в периоде планирования. -
Просуммируйте значения для всех локаций. Сумму поделите на количество дней в периоде планирования (лист options, поле
planning_days
). Получится оценка трудозатрат на все посещения локаций в день. -
Общую дневную оценку трудозатрат разделите на количество сотрудников. Это будет средняя нагрузка на сотрудника в день.
-
Полученную среднюю нагрузку округлите в бо́льшую сторону с запасом, прибавив еще 5-10 юнитов. Например, если вы получили значение 19,35, округлите его до 20 и добавьте запас в 10 юнитов. Итого – 30 юнитов. Добавьте на лист employees поле
capacity.units
и для всех сотрудников укажите рассчитанное значение. -
На листе employees для каждого сотрудника укажите стоимость дня простоя –
cost.empty_run
, чтобы алгоритм при планировании задействовал всех сотрудников. Например,cost.empty_run
= 100 000.
При планировании нагрузка равномерно распределится между всеми сотрудниками.
Пример 1
Посещения 20 локаций должны быть распланированы на 3 сотрудников. Параметры балансировки не задаются. В результате посещения всех локаций распределяются на сотрудника 2. Сотрудники 1 и 3 остаются незадействованными.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 2
Тот же, что в примере 1, но задаются параметры балансировки.
Трудозатраты для одного посещения локации оценены в 10 юнитов, это значение указано на листе locations в поле shipment_size.units
. Для каждой локации планируется по 2 посещения, visit_count
= 2.
Общая оценка трудозатрат для всех 20 локаций составляет (10 * 2) * 20 = 400. Эта оценка делится на количество дней в периоде планирования: 400 : 7 = 57,14.
Дневная нагрузка распределяется на 3 сотрудников: 57,14 : 3 = 19,05. Значение округлено и увеличено на 10 – до 30 юнитов. Эта оценка указана для каждого сотрудника на листе employees в поле capacity.units
. Также для каждого сотрудника задана стоимость дня простоя cost.empty_run
= 10 000.
В результате посещения всех локаций распределены равномерно между тремя сотрудниками.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API