Параметры и режим работы сотрудников
- Основные параметры
- Отпуск
- Теги сотрудника
- Несовместимость локаций в маршруте
- Геозоны
- Стоимость работы и выплаты сотрудникам
- Ограничения на отрезки маршрута
- Передвижение пешком и на общественном транспорте
- Кучность маршрутов
- Начало и завершение маршрута
- Начальные и конечные отрезки маршрута
- Режимы работы сотрудников
Обслуживание локаций в Календарном планировании выполняется мобильными сотрудниками, которые могут передвигаться на автомобилях, пешком или на общественном транспорте.
При планировании с помощью Excel характеристики и ограничения сотрудника и транспортного средства указываются на листе employees
, а параметры режима работы — на листе working_days
. При планировании в API все параметры указываются в объекте employees
.
Основные параметры
- Идентификатор
- Обязательным атрибутом сотрудника является уникальный числовой или строковый идентификатор, который задается в поле
id
. Идентификатор должен быть уникальным в пределах одного запроса к сервису. - Дополнительный идентификатор
- Дополнительный числовой или строковый идентификатор сотрудника вы можете указать в поле
ref
. - Номер телефона
- Номер мобильного телефона для связи с сотрудником передается в поле
phone
. - Номер GPS-трекера
- Если у сотрудника есть GPS-трекер, его номер указывается в поле
imei
. - Количество маршрутов
- Сотруднику может быть запланировано несколько маршрутов в день. Максимальное количество маршрутов в день ограничивается параметром
max_runs
. По умолчанию параметр равен 1. - Способ передвижения
- Способ передвижения сотрудника задается параметром
routing_mode
:
-
driving
— способ по умолчанию, на автомобиле с грузоподъемностью меньше 2,5 тонн. -
walking
— пешком. В маршруте используются только те дороги, по которым может ходить пешеход. -
transit
— на общественном транспорте и пешком от остановки до локации. Подробнее см. Передвижение пешком и на общественном транспорте.
- Коэффициент
- В зависимости от квалификации сотрудника он может обслуживать локации быстрее или медленнее. Чтобы учитывать этот фактор, используйте коэффициент
service_duration_multiplier
. По умолчанию он равен 1. Для более квалифицированных сотрудников назначайте его меньше 1, для менее квалифицированных — больше 1. На этот коэффициент будет умножаться сервисное время локации при планировании посещений.
Отпуск
Чтобы указать отпуск сотрудника, используйте поле vacations
. В поле указываются порядковые номера дней отпуска в периоде планирования (дни нумеруются с 0).
Разовые отсутствия (например, отгул) задаются с помощью индивидуального графика работы для конкретного сотрудника (поле working_days
на листе working_days
).
Если для сотрудника указан отпуск, то посещения, которые должны быть выполнены в этот период согласно настройкам локаций, распределяются между другими сотрудниками. Если же для сотрудника указано отсутствие (нерабочий день), то посещения, которые должны быть выполнены в этот день, распределяются на другие дни этого сотрудника.
Пример
В планировании участвуют три сотрудника, которые работают 5 дней в неделю. Планирование начинается с понедельника. Отпуск первого сотрудника приходится на вторую неделю планирования, то есть выпадает на 7-11 дни. Второй сотрудник взял отгул на понедельник второй недели, в поле working_days
перечислены его рабочие дни (0, 1, 2, 3, 4, 8, 9, 10, 11).
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Теги сотрудника
Для сотрудника можно можно назначить ограничения по посещению определенных локаций с помощью правил совместимости. Для этого используются теги, которые назначаются сотрудникам и локациям.
Ограничения могут потребоваться, если для обслуживания локации сотруднику необходимы специальные навыки, а если сотрудник передвигается на автомобиле — наличие у автомобиля специального оборудования или ограничения по габаритам автомобиля.
Теги сотрудника задаются в следующих полях:
-
tags
— свойства сотрудника, которые частично могут совпадать со свойствами, указанными для локации. -
excluded_tags
— свойства сотрудника, которые не должны совпадать со свойствами, указанными для локации.
Определение тегов возможно как в виде строк, так и в виде регулярных выражений. В строках теги могут перечисляться через запятую. В этом случае сотрудник сможет посещать локацию, если хотя бы один из перечисленных тегов сотрудника совпадает с тегом локации или если у локации нет тегов.
Регулярные выражения — это способ описать более сложную логику и правила совместимости между сотрудниками и локациями. Используется синтаксис регулярных выражений POSIX Extended. Для тестирования регулярных выражений можно воспользоваться сервисом Regex101.
Теги обозначают постоянные ограничения, действующие для сотрудников и локаций. Например, теги могут использоваться для указания специальных навыков у сотрудников, подробнее см. в разделе Планирование с учетом навыков сотрудников.
Если нужно ограничить возможность посещения локаций в пределах одного маршрута, используйте несовместимость локаций.
Если локацию нужно закрепить за сотрудником, то можно задать тег сотрудника (поле tags
) и указать его в обязательном теге локации. Подробнее см. в разделе Закрепление локации с помощью тегов.
Несовместимость локаций в маршруте
Отдельные локации могут иметь особые условия для посещения. Условия для разных локаций могут оказаться взаимоисключающими, такие локации нельзя посещать в одном маршруте. Например, для посещения медицинской лаборатории и строительного склада сотруднику может потребоваться разная спецодежда. Характеристики локаций, по которым определяется их несовместимость, указываются на листе locations
в поле load_types
, см. Несовместимость локаций.
Несовместимые характеристики локаций перечисляются через запятую в поле incompatible_load_types.N
, где N — порядковый номер набора несовместимых характеристик, начиная с 0. Например, incompatible_load_types.0
= food,clean
, incompatible_load_types.1
= cold,clean
. Каждый набор несовместимых характеристик указывается в отдельном столбце.
Несовместимость локаций может указываться:
-
для всех маршрутов — на листе
options
; -
для отдельных сотрудников — на листе
employees
.
Примечание
Несовместимость локаций для конкретного сотрудника, указанная в параметре incompatible_load_types
на листе employees
, имеет более высокий приоритет и для данного сотрудника полностью переопределяет значения параметра incompatible_load_types
на листе options
.
Несовместимость локаций incompatible_load_types
действует только в пределах одного маршрута. Если необходимо задать постоянные ограничения, например, связанные с наличием у сотрудника определенных навыков обслуживания локаций, используйте теги.
Пример 1
Планируются посещения 8 локаций. У каждой локации в поле load_types
указаны характеристики:
Локация |
load_types |
Пояснения |
Location-1-with-food-and-freezer |
|
Замороженные продукты, необходима теплая одежда |
Location-2-with-food |
|
Продукты |
Location-3-clean-lab |
|
Лаборатория, необходим белый халат |
Location-4-with-food-and-freezer |
|
Замороженные продукты, необходима теплая одежда |
Location-5-with-food |
|
Продукты |
Location-6-with-flowers |
|
Цветы, удобрения |
Location-7-with-flowers |
|
Цветы, удобрения |
Location-8-clean-lab |
|
Лаборатория, необходим белый халат |
Несовместимость локаций не указана. Для каждого из двух сотрудников запланировано по 11 маршрутов, в маршруте посещаются локации с разными характеристиками.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 2
То же, что в примере 1, но для на листе options
указаны два набора несовместимых локаций: cold,clean
и food,clean
. Для локаций flowers
несовместимость не задана.
Для первого сотрудника запланировано 16 маршрутов, для второго 14. Несовместимые локации распределены по разным маршрутам.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Геозоны
Для сотрудников могут быть заданы ограничения по зонам обслуживания.
Зоны, в которых сотруднику разрешено посещать локации, перечисляются в параметре employees.allowed_zones
:
-
Сотрудник может посещать локации в любой зоне, указанной в параметре
allowed_zones
. Таким способом можно закреплять локации за определенным сотрудником, подробнее см. в разделе Закрепление локации с помощью геозон. -
Если разрешенные зоны не заданы, то сотрудник может посещать локации без ограничений.
-
На локацию не будут запланированы посещения, если для всех сотрудников указаны разрешенные зоны, а локация не попадает ни в одну из них.
Зоны, запрещенные для посещения сотрудником, перечисляются в параметре employees.forbidden_zones
.
Примечание
Если локация расположена в области пересечения разрешенной и запрещенной зон, то сотрудник не сможет ее посетить — параметр forbidden_zones
имеет более высокий приоритет, чем allowed_zones
.
Опциональные геозоны — это нежесткое ограничение. С их помощью можно задать предпочтительные для посещения зоны (приоритетные и неприоритетные). Если локация расположена в опциональной геозоне, за ее посещение сотруднику начисляется бонус или штраф. Для каждого сотрудника можно назначить одну или несколько таких геозон.
Опциональные геозоны задаются с помощью массива optional_zones
:
optional_zones.N.zone
— название геозоны;optional_zones.N.value
— если значение параметра больше 0, то сотрудник получает бонус за посещение указанной геозоны (значение этого параметра вычитается из стоимости маршрута), а если меньше 0 — штраф (значение прибавляется к стоимости маршрута).
Чтобы в один маршрут сотрудника не попадали локации, которые относятся к разным зонам обслуживания, можно определить несовместимость геозон.
Список таких зон можно задать не только для всего решения в объекте options.incompatible_zones
, но и для конкретного сотрудника в параметре incompatible_zones
. Несовместимые зоны, определенные для сотрудника, имеют приоритет над зонами, определенными глобально. Чтобы на сотрудника не распространялось глобальное ограничение options.incompatible_zones
, задайте для него в поле employees.incompatible_zones
пустой список.
Пример 1
В планировании участвуют 5 сотрудников. 4 сотрудника работают только в пределах МКАД, и за каждым из них закреплена своя разрешенная зона (параметр allowed_zones
). Пятый сотрудник работает только за пределами МКАД, поэтому для него все геозоны внутри МКАД перечислены в параметре forbidden_zones
.
В решении участвуют все 5 сотрудников, каждый посещает локации в разрешенных зонах.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 2
То же, что в примере 1, но ограничения мягкие — геозоны заданы как приоритетные (параметр optional_zones
). За посещение этой геозоны назначен бонус 1000 единиц.
В результате планирования сотрудники чаще посещают локации в приоритетной зоне, но при необходимости могут выйти за ее пределы. Поэтому в решении участвуют только 3 сотрудника из 5.
То же, что в примере 1, но ограничения мягкие — геозоны заданы как приоритетные (параметр optional_zones
). За посещение этой геозоны назначен бонус 1000 единиц.
В результате планирования сотрудники чаще посещают локации в приоритетной зоне, но при необходимости могут выйти за ее пределы. Поэтому в решении участвуют только 3 сотрудника из 5.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Стоимость работы и выплаты сотрудникам
Для определения стоимости работы сотрудника используется поле cost
.
Для каждого сотрудника можно задать одну или несколько компонентов стоимости работы:
-
cost.fixed
— фиксированная стоимость выхода на работу. По умолчанию 3000 единиц. -
cost.hour
— стоимость за час работы. По умолчанию 100 единиц. -
cost.km
— стоимость за километр маршрута. По умолчанию 8 единиц. -
cost.location
— стоимость посещения одной локации. По умолчанию 0. -
cost.run
— стоимость выполнения одного маршрута. По умолчанию 0. -
cost.waiting_hour
— стоимость за час ожидания между посещениями. По умолчанию 0. -
cost.empty
— стоимость простоя сотрудника. Начисляется, если для сотрудника не запланирован ни один маршрут. По умолчанию 0. -
cost.empty_run
— стоимость дня простоя сотрудника. Начисляется, если для сотрудника не запланирован ни один маршрут на день. По умолчанию 0.
Если задано несколько компонентов, стоимость рассчитывается как сумма этих компонентов.
Если на этапе планирования нужно рассчитать, какую оплату получит сотрудник за выполнение маршрута, используется поле payout
. Оно не влияет на оптимизацию маршрута и рассчитывается уже после того, как задача планирования решена.
Арифметические выражения в расчетах стоимости и выплат
Стоимость работы сотрудника можно задать в виде арифметического выражения. При планировании можно рассчитать стоимость одним выражением на листе employees
в поле cost
или использовать выражения в полях:
cost.run
— стоимость маршрута сотрудника;cost.route
— стоимость всех маршрутов сотрудника в решении.
Внимание
Если на листе employees
в поле cost
заданы формулы, то алгоритм рассчитывает стоимость сотрудника только по этим формулам. При этом стандартные компоненты стоимости участвуют в расчете, только если указаны в формулах в явном виде.
Для расчета выплат сотруднику можно указать выражение в поле payout
или использовать выражения в полях:
payout.run
— выплаты сотруднику за выполнение маршрута;payout.route
— выплаты сотруднику за выполнение всех его маршрутов в решении.
В выражении можно использовать ключевые слова и математические обозначения, которые приведены в таблицах ниже.
Ключевые слова для параметров маршрута
Группа |
Ключевое слово и пояснение |
Маршруты |
|
Локации |
|
Длительность |
|
Расстояние |
|
Остановки |
|
Движение от начальной или к конечной точке маршрута (локации с типом |
Параметры используются для реализации тех же сценариев, что и штрафы за начало или окончание маршрута как можно ближе к начальной или конечной точке маршрута. |
Движение между локациями |
|
Маршруты с пешеходной частью |
|
Метрики маршрута рассчитываются по следующим формулам:
- общая длительность маршрута
transit_duration_h
=walking_transit_duration_h
+driving_transit_duration_h
; - общая протяженность маршрута
distance_km
=walking_distance_km
+driving_distance_km
.
На вычисление переменных, которые используются в маршрутах с пешеходными частями, влияет способ передвижения:
walking
— весь маршрут обслуживается пешком, расстояниеdriving_distance_km
и длительностьdriving_transit_duration_h
равны 0;transit
:driving_distance_km
= 0 — считается, что все локации сотрудник посетил пешком (для подсчета расстояния, пройденного на общественном транспорте, недостаточно данных);driving_transit_duration_h
— вычисляется на основании других данных, полученных при решении задачи (может быть ненулевым).
Математические обозначения и функции
Математические обозначения |
Пояснение |
Числа |
Целые (положительные, отрицательные), рациональные. Для десятичных дробей в качестве разделителя используйте точку. |
Арифметические действия |
+, -, *, / |
Скобки |
(…) |
Математические функции |
|
Логические функции |
|
Операции сравнения |
<, >, = |
Логические операции |
|
Метрики решения
Если для сотрудника заданы формулы для расчета стоимости маршрута (на листе employees
в поле cost
), в метриках решения вы увидите следующие поля:
run_custom_cost
— стоимость маршрута по формуле дляcost.run
.route_custom_cost
— стоимость всех маршрутов сотрудника в решении по формуле дляcost.route
. Выводится только в первом маршруте сотрудника.total_custom_cost
— полная стоимость маршрута. Выводится только в первом маршруте, в остальных маршрутах выводится 0.
Если для сотрудника заданы формулы для расчета выплат (на листе employees
в поле payout
), в метриках решения вы увидите следующие поля:
run_payout
— выплата за маршрут по формуле дляpayout.run
.route_payout
— выплата за все маршруты сотрудника в решении по формуле дляpayout.route
. Выводится только в первом маршруте.total_payout
— общая выплата сотрудникам за все маршруты в решении. Выводится только в первом маршруте, в остальных маршрутах выводится 0.
Если выплаты рассчитываются хотя бы для одного сотрудника (задано поле payout
), в результатах планирования также присутствует метрика total_payout
— общий объем выплат сотрудникам.
Ограничения на отрезки маршрута
Отрезок маршрута — перемещение между двумя последовательными локациями. Ограничение для отрезка можно задавать, чтобы сделать маршруты более локальными (например, если планирование покрывает сразу несколько городов, и нужно избежать переездов между ними).
Чтобы задать ограничение, на листе employees укажите следующие параметры:
max_edge_distance_m
— задает максимальную длину отрезка, в метрах;max_edge_duration_s
— задает максимальную длительность перемещения по отрезку, в секундах.
При планировании маршрутов с использованием общественного транспорта следует помнить, что длина отрезка включает только длину пешего пути, поэтому в таких случаях параметром max_edge_distance_m
лучше не пользоваться. Подробнее о стоимости маршрутов с использованием общественного транспорта см. в разделе Передвижение пешком и на общественном транспорте.
Пример использования ограничений см. в разделе Ограничения на отрезки маршрута.
Передвижение пешком и на общественном транспорте
Примечание
Способ передвижения routing_mode
= transit
не поддерживается при планировании с опцией matrix_router
= global
.
Если для сотрудника задан способ передвижения routing_mode
= transit
, то по умолчанию большую часть пути сотрудник передвигается на общественном транспорте, а пешком проходит только от остановки до локации. Чтобы сотрудник передвигался между близкими локациями пешком, там где это удобно и выгодно, укажите значение поля can_add_walking_edges
= true
(по умолчанию false
).
Можно задать стоимость использования общественного транспорта на листе employees
с помощью одного или нескольких параметров:
public_transport_cost.km
— стоимость за километр маршрута на общественном транспорте;public_transport_cost.hour
— стоимость за час проезда на общественном транспорте;public_transport_cost.edge
— стоимость за каждый отрезок маршрута, где используется общественный транспорт;public_transport_cost.run
— стоимость за каждый маршрут, где используется общественный транспорт.
При расчете стоимости маршрута public_transport_cost
прибавляется к стоимости работы сотрудника cost
, см. раздел Стоимость работы и выплаты сотрудникам.
В результате планирования у каждой локации, в которую сотрудник пришел пешком, указывается поле arrive_by_walking
= true
. В метриках решения вы увидите следующие поля:
total_public_transport_distance_cost
— общая стоимость за расстояние, пройденное на общественном транспорте.total_public_transport_distance_m
— общее расстояние, пройденное на общественном транспорте, в метрах.total_public_transport_duration_cost
— общая стоимость за время проезда на общественном транспорте.total_public_transport_duration_s
— общее время проезда на общественном транспорте, в секундах.total_public_transport_edges_cost
— общая стоимость переездов между локациями на общественном транспорте.
total_public_transport_runs_cost
— общая стоимость работы сотрудника на маршрутах, где используется общественный транспорт.
Также можно задать ограничение по максимальной длительности отрезка на общественном транспорте в секундах с помощью параметра max_public_transport_edge_duration_s
.
Пример
Сотруднику нужно посетить 14 локаций: с 1 по 7 локации находятся недалеко друг от друга на севере города, а локации 8-14 — на юге. Чтобы сотрудник использовал общественный транспорт только там, где это выгодно, задано значение поля can_add_walking_edges
= true
, а также задана дополнительная стоимость использования общественного транспорта.
В результате сотрудник едет на общественном транспорте в локацию 10 и обходит все близкие к ней локации на юге. Затем едет на общественном транспорте в локацию 6 и обходит все оставшиеся локации на севере.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Кучность маршрутов
Чтобы маршруты получались более кучными, то есть чтобы последовательные локации находились недалеко друг от друга, используйте параметр global_proximity_factor
. Он учитывает расстояние до последней локации в маршруте. В результате получаются географически сгруппированные маршруты.
Параметр global_proximity_factor
вычисляется на весь маршрут, на все дни в течение периода планирования. Чтобы задать кучность маршрута в течение дня, используйте аналогичный параметр daily_proximity_factor
.
Параметры кучности global_proximity_factor
и daily_proximity_factor
можно задавать:
- на листе options — они задают кучность маршрутов для всех сотрудников одинаково;
- на листе employees — они задают кучность маршрутов для конкретного сотрудника и позволяют учесть особенности его маршрутов.
Параметры кучности могут принимать значение от 0 до 10, где 0 — отсутствие кучности, а 10 — максимальная кучность. Мы рекомендуем значения от 0 до 1 (по умолчанию 0).
Примечание
Параметры кучности, заданные на листе employees для конкретного сотрудника, имеют более высокий приоритет и полностью переопределяют параметры кучности, заданные на листе options для всех сотрудников.
Пример настроек см. в разделе Кучные маршруты.
Начало и завершение маршрута
Маршрут можно начинать и заканчивать как в специальных локациях с типом base
(это может быть склад, офис или дом, где живет сотрудник), так и в первой обычной локации для обслуживания. В этом случае идентификаторы локаций base
нужно указать в полях start_at
и finish_at
.
Начальные и конечные отрезки маршрута
При планировании маршрута начальные и конечные отрезки (из дома или офиса) можно учитывать по отдельной стоимости. Для этого на листе employees используются следующие параметры:
first_edges_penalty_factor
— для пробега на первом отрезке каждого маршрута;last_edges_penalty_factor
— для пробега на последнем отрезке каждого маршрута;distance_between_days_starts_factor
— для пробега между начальными локациями маршрутов в соседние дни;distance_between_days_ends_factor
— для пробега между конечными локациями маршрутов в соседние дни;duration_between_days_starts_factor
— для длительности между начальными локациями маршрутов в соседние дни;duration_between_days_ends_factor
— для длительности между конечными локациями маршрутов в соседние дни.
Длительность удобно использовать вместо пробега, если сотрудники передвигаются на общественном транспорте.
Эти параметры задают коэффициенты, на которые умножается стоимость соответствующих отрезков маршрута. По умолчанию параметры равны 0 — это значит, что для расчетов коэффициенты не используются. Если задан коэффициент 1, то соответствующие отрезки будут входить в стоимость так, как если бы они были частью маршрута. Положительные коэффициенты увеличивают стоимость отрезков, и при планировании алгоритм стремится уменьшить их. Отрицательные коэффициенты уменьшают стоимость отрезков.
Пример использования коэффициентов см. в разделе Ограничения на отрезки маршрута.
Режимы работы сотрудников
При планировании в Excel параметры, задающие режим работы сотрудников, указываются на листе working_days
. Каждая строка на листе working_days
описывает условия работы для одного типа рабочих дней сотрудника (обычных, укороченных предпраздничных и т.п.). В поле employee.id
указывается идентификатор сотрудника (значения могут повторяться, так как для одного сотрудника можно указать несколько различных режимов работы для разных рабочих дней), в поле id
— уникальный идентификатор режима работы.
При планировании в API параметры указываются в объекте employees.working_days
в виде массива. Каждый элемент массива описывает режим работы для одного рабочего дня сотрудника.
Рабочие и нерабочие дни сотрудника
Рабочие и нерабочие дни, общие для всех сотрудников, указываются в Excel на листе options
в параметрах working_days
и non_working_days
, см. раздел Рабочие и нерабочие дни.
Если для конкретного сотрудника режим работы отличается, его рабочие дни можно указать на листе employees
в поле working_days
(в запросе API в блоке employees.working_days.day
).
Параметры, заданные для конкретных сотрудников, имеют более высокий приоритет по сравнению с глобальными параметрами на листе options
:
- Если параметр
working_days
указан хотя бы для одного режима работы сотрудника, то глобальный параметрworking_days
для этого сотрудника игнорируется. - Если день отмечен как нерабочий в глобальном параметре
non_working_days
, но этот день указан как рабочий для конкретного сотрудника в параметреworking_days
, то для этого сотрудника день будет считаться рабочим.
Для обозначения дней поддерживаются форматы:
- полные английские названия дней с большой буквы "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday";
- 2- и 3-буквенные сокращения "Mo", "Mon", "Tu", "Tue", "We", "Wed", "Th", "Thu", "Fr", "Fri", "Sa", "Sat", "Su", "Sun";
- даты в формате YYYY-MM-DD;
- номера дней от начала планирования, начиная с 0.
Если для сотрудника указано отсутствие (нерабочий день), то посещения, которые должны быть выполнены в этот день согласно настройкам локаций, распределяются на другие дни этого сотрудника.
Если же для сотрудника указан отпуск (параметр vacations
на листе employees
), то посещения, которые должны быть выполнены в этот период, распределяются между другими сотрудниками. Дни отпуска, указанные в параметре vacations
, вычитаются из рабочих дней в working_days
.
Примечание
Если указать отпуск, но не задать режим работы в working_days
, то рабочими будут считаться все дни, указанные в working_days_in_week
(см. раздел Рабочие и нерабочие дни) за вычетом отпуска.
Для каждого рабочего дня можно указать дополнительную стоимость cost
, которая будет добавляться к обычной стоимости выхода сотрудника. Таким образом можно сделать отдельные дни менее предпочтительными для посещений.
Пример
Для двух сотрудников на листе options указаны рабочие дни с понедельника по пятницу и нерабочие дни — 1 и 9 мая. Предпочтительные дни посещения локаций 4, 14, 28 и 39 — среда и четверг — приходятся на нерабочие дни. Поэтому для сотрудника Employee 2 на листе working_days
дополнительно указан особый режим работы 1 и 9 мая с повышенной стоимостью cost
. Штраф за пропуск посещения локаций в предпочтительный день penalty.preferred_days.fixed
выше, чем стоимость выхода на работу в нерабочий день. В результате все маршруты 1 и 9 мая запланированы на сотрудника Employee 2.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Начало и окончание рабочего дня
Для определения рабочего времени сотрудника можно использовать параметры:
start_time
— время начала рабочего дня. Параметр принимает одно временное окно, например8:30-9:30
.max_finish_time
— время окончания рабочего дня. Если допускается завершение рабочего дня с опозданием, то максимально допустимое время окончания рабочего дня укажите в параметреhard_max_finish_time
.max_duration_s
— максимальная продолжительность рабочего дня в секундах. Если допускается превышение, то предельно допустимую продолжительность укажите в параметреhard_max_duration_s
.
Примечание
Ограничение продолжительности рабочего дня следует использовать осторожно, поскольку для его выполнения алгоритм может искусственно растягивать слишком короткие рабочие дни за счет построения менее оптимальных маршрутов.
При нарушении мягких ограничений рабочего дня начисляются штрафы:
-
за нарушение ограничений по времени рабочего дня:
penalty.out_of_time.fixed
— штраф за факт нарушения ограничений рабочего дня.penalty.out_of_time.minute
— штраф за минуту нарушения начала, окончания или продолжительности рабочего дня.
-
за позднее начало или завершение рабочего дня:
penalty.late.fixed
— штраф за факт позднего начала рабочего дня (после окна, определенного вstart_time
) или завершения (продолжительность рабочего дня большеmax_duration_s
или время завершения позднееmax_finish_time
).penalty.late.minute
— штраф за минуту работы позже окончания рабочего дня или за минуту начала после окнаstart_time
.
Пример 1
Сотрудники работают в разные рабочие дни:
- рабочий день первого сотрудника начинается в интервале с 9:00 до 10:00, а заканчивается не позднее 15:00;
- рабочий день второго сотрудника — с 14 до 15 часов, а заканчивается не позднее 21:00.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 2
По умолчанию сотрудник начинает работу в интервале с 9:00 до 10:00 и заканчивает в 18:00. В праздничный день 29.12.2023 сотрудник работает в сокращенном режиме и заканчивает до 15:00.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Пример 3
По умолчанию сотрудник работает не больше 8 часов (28 800 секунд) в день. При необходимости он может работать 10 часов, поэтому задано жесткое ограничение на максимальную продолжительность рабочего дня hard_max_duration_s
= 36 000. В предпраздничный день 30 апреля сотрудник работает 6 часов, но при необходимости может работать на час больше.
В результате планирования 09.04.2024 сотрудник работает 9 часов 29 минут.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API
Максимальное расстояние за день и остановки
Для ограничения максимального расстояния, которое преодолевает сотрудник за рабочий день, используется параметр max_mileage_km
. Если запланированное расстояние больше max_mileage_km
, начисляются штрафы:
penalty.max_mileage.fixed
— за факт нарушения нарушения ограничения;penalty.max_mileage.km
— за каждый километр нарушения.
Также можно ограничить минимальное и максимальное количество остановок в маршруте. Для этого используются параметры minimal_stops
и maximal_stops
соответственно. При нарушении ограничения по минимальному количеству остановок применяются штрафы penalty.stop_lack.fixed
(за факт остановок меньше минимального количества) и penalty.stop_lack.per_stop
(за каждую остановку меньше минимального количества). Соответственно, при нарушении ограничения по максимальному количеству остановок начисляются штрафы penalty.stop_excess.fixed
(за факт остановок больше максимального количества) и penalty.stop_excess.per_stop
(за каждую остановку больше максимального количества).
Стоимость выхода в рабочий день
За выход в конкретный рабочий день можно назначить дополнительную стоимость employee.working_days.cost
, которая будет добавлена к стоимости работы сотрудника employee.cost
.