Свойства транспортных средств

Доставка заказов в Яндекс Маршрутизации может выполняться как обычными автомобилями, так и курьерами, передвигающимися пешком или на общественном транспорте. Автомобиль и курьер имеют общий набор свойств.

Для определения автомобиля или куриьера используется поле запроса vehicles.

Идентификатор автомобиля или курьера

Обязательным атрибутом автомобиля или курьера является уникальный числовой или строковый идентификатор, который задается в поле id. Идентификатор должен быть уникальным в пределах одного запроса к сервису. При экспорте в Мониторинг этот идентификатор будет использоваться как логин курьера.

Дополнительно вы можете указать числовой или строковый идентификатор автомобиля или курьера из вашей учетной системы в поле ref, а также номер мобильного телефона курьера в поле phone для связи с ним из Мониторинга.

Номер GPS-трекера

С помощью параметра imei можно указать номер GPS-трекера транспортного средства. Он передается в Мониторинг при экспорте и используется для передачи данных о статусе заказов и текущем местоположении курьера.

Подробнее см. в разделе Настройка передачи данных c устройств.

Способ передвижения

При построении маршрутов по умолчанию предполагается, что курьер использует для доставки легковой автомобиль (грузоподъемность меньше 2,5 тонн). Доставку грузов пешком, на грузовом автомобиле или с помощью общественного транспорта можно отразить с помощью параметра vehicle.routing_mode. Если все курьеры выполняют доставку одним способом, можно использовать опцию маршрутизации options.routing_mode.

Примечание

Параметр vehicle.routing_mode имеет более высокий приоритет, чем options.routing_mode.

Возможные значения:

  • driving — способ по умолчанию, маршрутизация для автомобилей с грузоподъемностью меньше 2,5 тонн;

  • truck — маршрутизация для грузовых автомобилей, по умолчанию — с грузоподъемностью от 2,5 тонн. Дополнительные параметры можно указать в характеристиках транспортного средства. При планировании с использованием этого способа передвижения учитываются дорожные знаки, ограничивающие движение грузовых автомобилей, в том числе грузовой каркас для Москвы;

  • walking — маршрут с пешеходным профилем. В маршруте используются только те дороги, по которым может ходить пешеход;

  • transit — маршрут с использованием общественного транспорта и перемещением пешком от остановки до точки доставки. Реальное расписание общественного транспорта при этом не учитывается, но считается, что:

    • добраться таким способом возможно;

    • курьер приходит на остановку и сразу садится в транспорт.

Для курьеров, которые передвигаются на велосипедах или самокатах, указывайте способ передвижения пешком routing_mode = walking и используйте коэффициент корректировки скорости travel_time_multiplier. Для каждого курьера стоит вывести индивидуальный коэффициент корректировки. Например, с помощью отчета План-факт можно сравнить фактическое время в пути для курьера на велосипеде или самокате с плановым временем в пути, рассчитанным для передвижения пешком.

Пример 1

В примере ниже используется способ передвижения transit для всех курьеров. В результате курьеры выполняют доставку на общественном транспорте и заказы распределены оптимально для них.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Примечание

В построенных маршрутах пробег указан только для расстояний, которые курьер ходит пешком. Расстояния, покрытые в общественном транспорте, учитываются для оптимизации, но не указываются в метриках.

Пример 2

В примере ниже используется способ передвижения transit для одного курьера, и driving для другого курьера. Заказы распределены между курьерами так, чтобы автомобиль выполнял доставку в точки, более удаленные от остановок общественного транспорта или друг от друга.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Вместимость автомобиля или курьера

Маршрутизация поддерживает определение вместимости автомобиля для определения максимального веса или количества груза, которое автомобиль/курьер может перевезти за один маршрут.

Чтобы определить вместимость автомобиля или курьера, используйте поле capacity (достаточно указать один из вариантов):

  • capacity.units — количество мест (паллет, коробок, кег).

  • capacity.weight_kg — вес в килограммах или объемный вес.

  • capacity.volume — объем, который измеряется в кубометрах и задается как произведение измерений:

    • capacity.volume.width_m — ширина в метрах.

    • capacity.volume.depth_m — глубина в метрах.

    • capacity.volume.height_m — высота в метрах.

    Если измерения неизвестны, используйте capacity.volume_cbm.

  • capacity.volume_cbm — объем, заданный в кубометрах.

Если у автомобиля заданы и метрические размеры, и объем, то capacity.volume определяет габариты, а capacity.volume_cbm — вместимость.

Более подробно с определением веса вы можете ознакомиться в главе Вес и объем.

Примечание

Обратите внимание, если вес заказов задан в килограммах или как объемный вес, вместимость автомобиля должна быть задана в таких же единицах. Аналогично, если вес заказов задан в виде количества мест, определение вместимости автомобиля должно содержать максимальное количество мест в каждом автомобиле.

Дополнительно, возможно определение максимальной загрузки автомобиля в процентах от заданной грузоподъемности. Для этого используется поле запроса limits:

  • limits.volume_perc — процентное значение от заданного в capacity.volume.width_m * capacity.volume.depth_mcapacity.volume.height_m.

  • limits.weight_perc — процентное значение от заданного в capacity.weight_kg.

  • limits.unit_perc — процентное значение от заданного в capacity.units.

Чтобы указать возможность перегруза относительно заданного значения, укажите значение больше 100. Чтобы оставить запас грузоподъемности, например под возможные неточности в оценке габаритов заказа, укажите значение меньше 100. Например, значение 110 позволяет 10% перегруза, а значение 90 — максимальную загрузку в 90% от указанной грузоподъемности.

Вместимость автомобиля (с учетом limits) — жесткое ограничение, которое не будет нарушено. При этом при расчете загруженности автомобиля учитываются заказы на прием и доставку. Подробнее в разделе Прием и доставка.

Примечание

Через вместимость автомобиля можно косвенно управлять количеством заказов, которые должны в него попасть. Например, если указать объем каждого заказа в 1 юнит (независимо от реальных размеров заказа), а вместимость автомобиля – 10 юнитов, то при планировании в каждый автомобиль попадет не более 10 заказов.

Пример

Дано два автомобиля грузоподъемностью 1,5 тонны (Автомобиль 1) и 3 тонны (Автомобиль 2), а также три заказа для доставки весом 1 тонна, 1,2 тонны и 1,4 тонны.

При оптимизации маршрутов, заказ весом 1,2 тонны будет размещен в Автомобиль 1, и два заказа весом 1 и 1,4 тонны в Автомобиль 2.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пользовательские единицы вместимости

Пользовательская единица ограничивает вместимость автомобиля по пользовательской единице измерения, указанной для заказов.

Можно задать несколько пользовательских единиц вместимости автомобиля, каждая из них должна иметь свой порядковый номер N (нумерация начинается с 0). Каждая единица описывается двумя параметрами:

  • capacity.custom.N.name — имя пользовательской единицы;

  • capacity.custom.N.size — вместимость автомобиля по пользовательской единице.

По умолчанию вместимость по параметру capacity.custom.N.size не ограничена.

Внимание

Название пользовательской единицы вместимости автомобиля должно совпадать с указанным для заказа.

Если пользовательские единицы измерения вместимости указаны для заказов или явно заданы у одних автомобилей, но не заданы у других, то для автомобилей, где они не заданы, вместимость по пользовательским единицам измерения считается неограниченной.

Пример заполнения листов файла Excel для пользовательского параметра price (стоимость заказа):

Стоимость заказа

shipment_size.custom.0.name

shipment_size.custom.0.size

price

100

Суммарная стоимость заказов

capacity.custom.0.name

capacity.custom.0.size

price

1000

Пример 1.1

4 автомобиля выполняют 16 заказов. Для автомобилей указаны вес, объем и грузоподъемность (количество грузовых мест). С помощью пользовательских единиц для заказов указана стоимость location.shipment_size.custom.0, а для автомобилей — ограничение по суммарной стоимости перевозимых заказов vehicle.capacity.custom.0.

Есть 2 автомобиля, которые везут по 1 заказу, хотя утилизация по весу, объему и количеству мест у них небольшая – это обусловлено тем, что стоимость этих заказов находится близко к установленному для автомобиля ограничению.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 1.2

То же, что в примере 1.1, но дополнительно указано максимальное количество заказов, которое может перевезти автомобиль. Ограничение задано с помощью параметров location.shipment_size.custom.1 и vehicle.capacity.custom.1. Каждый автомобиль теперь может везти не более 5 заказов.

Количество заказов в трех автомобилях изменилось. Теперь 1 заказ везет только 1 автомобиль, в который нельзя больше добавить заказы из-за ограничения по суммарной стоимости. По остальным достигнута максимальная утилизация по суммарной стоимости в каждом автомобиле, но удалось выдержать ограничение по количеству заказов.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

Два автомобиля выполняют 20 заказов. Заказы имеют разную длину, эта характеристика описывается двумя пользовательскими единицами:

  • единица Length5 (location.shipment_size.custom.0) равна 1 для заказов длиной 5 метров (это заказы с 10 по 15) и 0 для остальных заказов;
  • единица Length6 (location.shipment_size.custom.1) равна 1 для заказов длиной 6 метров (это заказы с 16 по 20) и 0 для остальных заказов. Заказы с 1 по 9 имеют длину менее 5 метров, для них обе пользовательские единицы Length5 и Length6 равны 0.

Автомобили имеют одинаковую грузоподъемность, но разную длину кузова:

  • у Vehicle6 длина кузова 6 метров, он может перевозить любые заказы. Для него vehicle.capacity.custom.0 и vehicle.capacity.custom.1 равны 10 (с учетом веса заказов и грузоподъемности автомобиля);
  • у Vehicle5 длина кузова 5 метров, он не может перевозить заказы длиной 6 метров. Для него vehicle.capacity.custom.0 = 10, а vehicle.capacity.custom.1 = 0.

В спланированном решении автомобиль Vehicle5 перевозит заказы длиной 5 метров и менее 5 метров, а Vehicle6 — заказы длиной 6 метров, 5 метров и менее 5 метров.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Минимальный вес заказа для автомобиля

Чтобы тяжелый грузовик не вез один легкий заказ в другой конец города, используйте параметр min_stop_weight. С помощью этого параметра вы можете указать минимальный суммарный вес, который автомобиль будет доставлять в одну точку. Актуально при планировании грузовых перевозок разнотоннажным транспортом.

Ограничение мягкое — алгоритм может его нарушить. Штрафы задаются в полях:

  • penalty.min_stop_weight.fixed — штраф за факт нарушения минимального суммарного веса всех заказов в одной точке (по умолчанию 1000);

  • penalty.min_stop_weight.kg — штраф за каждый недостающий килограмм в суммарном весе заказов, доставляемых в одну точку (по умолчанию 50).

Подробнее об использовании разнотоннажного транспорта см. в разделе Транспорт с разной грузоподъемностью.

Пример 1

Два автомобиля с грузоподъемностью 1500 и 10000 кг развозят заказы весом 100, 500, 900 и 9000 кг. Большому автомобилю достаются и легкие, и тяжелые заказы.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

Для автомобиля с грузоподъемностью 10000 кг указан параметр min_stop_weight со значением 1000. В результате большому автомобилю достается только заказ с весом 9000 кг.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Характеристики транспортного средства

Характеристики транспортного средства можно задать в поле vehicle.specs. В нем могут быть указаны следующие параметры:

  • width — ширина транспортного средства в метрах;

  • height — высота транспортного средства в метрах;

  • length — длина транспортного средства в метрах;

  • max_weight — максимальный вес транспортного средства в тоннах;

  • max_weight_kg — максимальный вес транспортного средства в килограммах (округляется до тонн в большую сторону при решении задачи планирования);

  • axle_weight — максимальная нагрузка на ось транспортного средства в тоннах.

Примечание

Если в задаче планирования одновременно заданы параметры vehicle.specs.max_weight и vehicle.specs.max_weight_kg, то в решении будет использован vehicle.specs.max_weight.

Для всех перечисленных характеристик минимальное значение равно 0.

Внимание

Эти параметры можно указывать только для грузовых автомобилей (routing_mode = truck).

Для расчета вместимости грузового автомобиля используются 88 классов, см. спецификацию. Алгоритм учитывает габариты и грузоподъемность каждого автомобиля и подбирает по спецификации ближайший класс, у которого все характеристики равны или превышают характеристики автомобиля. Если хотя бы одна из характеристик автомобиля превышает максимально определенные значения, ему присваивается класс truck_N88.

В решении могут использоваться не более 5 классов. Если при планировании их больше, алгоритм удаляет лишние классы.

Методика расчета классов
  1. Классы, которые были переданы при планировании, сортируются в обратном порядке — от самого строго к самому нестрогому.
  2. Рассчитывается шаг SS по формуле S=K5S = {\frac{K}{5}}, где KK – это количество указанных при планировании классов, а 5 — это допустимое количество классов в решении.
  3. Каждому старому классу назначается индекс ii.
  4. Новые классы вычисляются по следующему правилу: ii-й новый класс автомобиля является round(iS)round(i * S)-й старым классом автомобиля, где roundround округляет результат умножения до ближайшего целого числа, а ii определяет, через сколько шагов происходит добавление классов в решение.

Пример

В решении используется 10 классов: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, где 1 — самый строгий класс по характеристикам, а 10 — самый нестрогий.

  1. Считаем количество шагов: 105=2{\frac{10}{5}} = 2.

  2. Назначим каждому классу индекс ii:

    Индекс

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    Класс грузового автомобиля

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

  3. Добавляем в решение каждый ii-й класс. Нужно вычислить 5 классов, поэтому будем считать ii со значениями 0, 1, 2, 3, 4.

  4. Рассчитываем новые 5 классов:

    round(02)=0{round(0 * 2)} = 0. Это значит, что алгоритм добавит в решение класс под индексом 0. В нашем примере это 10.

    Далее round(12)=2{round(1 * 2)} = 2. В решении будет класс с индексом 2 — это 8. Остальные классы рассчитываются аналогично.

    В результате в решение попадут следующие классы:

    Индекс

    0

    1

    2

    3

    4

    Класс грузового автомобиля

    10

    8

    6

    4

    2

Если в задаче планирования указана только одна характеристика, а остальные параметры не заполнены, то при планировании эти поля примут значение 0. В таком случае алгоритм подберет минимально подходящий класс.

Посмотреть, какие классы использовались в решении, можно в массиве matrix_statistics ответа API.

Спецификация классов

Класс

Высота ТС, м

Ширина ТС, м

Длина ТС, м

Максимальный вес ТС, т

Нагрузка на ось, т

truck_N1

0

0

0

0

0

truck_N2

1.5

0

0

0

0

truck_N3

2

0

0

0

0

truck_N4

2

2

3.2

3.5

0

truck_N5

2

2

3.2

3.5

1.5

truck_N6

2

2

3.2

3.5

2.5

truck_N7

2.2

2.1

4

0

0

truck_N8

2.2

2.1

4

3.5

0

truck_N9

2.2

2.1

4

3.5

1.5

truck_N10

2.2

2.1

4

3.5

2.5

truck_N11

2.4

2.6

4

5

0

truck_N12

2.4

2.6

4

5

2.5

truck_N13

2.4

2.6

4

5

3.5

truck_N14

2.4

2.6

8

8

0

truck_N15

2.4

2.6

8

8

3.5

truck_N16

2.4

2.6

8

8

4.5

truck_N17

2.4

2.6

8

8

5

truck_N18

2.5

0

0

0

0

truck_N19

2.5

2.2

6.5

3.5

0

truck_N20

2.5

2.2

6.5

3.5

1.5

truck_N21

2.5

2.2

6.5

3.5

2.5

truck_N22

2.7

2.6

8

10

0

truck_N23

2.7

2.6

8

10

3.5

truck_N24

2.7

2.6

8

10

4.5

truck_N25

2.7

2.6

8

10

5

truck_N26

2.7

2.6

8

10

7.5

truck_N27

3

2.6

8

10

0

truck_N28

3

2.6

8

10

3.5

truck_N29

3

2.6

8

10

4.5

truck_N30

3

2.6

8

10

5

truck_N31

3

2.6

8

10

7.5

truck_N32

3

2.6

8

14.5

0

truck_N33

3

2.6

8

14.5

5

truck_N34

3

2.6

8

14.5

7.5

truck_N35

3

2.6

8

14.5

8

truck_N36

3

2.6

8

14.5

9.5

truck_N37

3

2.6

8

14.5

10

truck_N38

3

2.6

8

14.5

10.5

truck_N39

3.2

2.6

9

12

0

truck_N40

3.2

2.6

9

12

4.5

truck_N41

3.2

2.6

9

12

5

truck_N42

3.2

2.6

9

12

7.5

truck_N43

3.2

2.6

9

12

8

truck_N44

3.5

2.6

10

22

0

truck_N45

3.5

2.6

10

22

7.5

truck_N46

3.9

2.6

10

18

0

truck_N47

3.9

2.6

10

18

7.5

truck_N48

3.9

2.6

10

18

8

truck_N49

3.9

2.6

10

18

9.5

truck_N50

3.9

2.6

10

18

10

truck_N51

3.9

2.6

10

18

10.5

truck_N52

3.9

2.6

10

18

11

truck_N53

3.9

2.6

10

18

12

truck_N54

3.9

2.6

10

20

0

truck_N55

3.9

2.6

10

20

5

truck_N56

3.9

2.6

10

22

0

truck_N57

3.9

2.6

10

22

7.5

truck_N58

3.9

2.6

10

25

0

truck_N59

3.9

2.6

10

25

7.5

truck_N60

3.9

2.6

10

25

8

truck_N61

3.9

2.6

10

25

9.5

truck_N62

3.9

2.6

10

25

10

truck_N63

3.9

2.6

10

25

10.5

truck_N64

3.9

2.6

10

25

11

truck_N65

3.9

2.6

10

25

12

truck_N66

3.9

2.6

10

25

14.5

truck_N67

3.9

2.6

10

25

15

truck_N68

3.9

2.6

10

25

18

truck_N69

3.9

2.6

10

30

0

truck_N70

3.9

2.6

10

30

7.5

truck_N71

3.9

2.6

10

30

8

truck_N72

3.9

2.6

20

40

0

truck_N73

3.9

2.6

20

40

7.5

truck_N74

3.9

2.6

20

40

8

truck_N75

3.9

2.6

20

40

9.5

truck_N76

3.9

2.6

20

40

10

truck_N77

3.9

2.6

20

40

10.5

truck_N78

4

2.6

10

30

0

truck_N79

4

2.6

10

30

7.5

truck_N80

4

2.6

10

30

8

truck_N81

4

2.6

20

35

0

truck_N82

4

2.6

20

35

7.5

truck_N83

4

2.6

20

40

0

truck_N84

4

2.6

20

40

7.5

truck_N85

4

2.6

20

40

8

truck_N86

4

2.6

20

40

9.5

truck_N87

4

2.6

20

40

10

truck_N88

4

2.6

20

40

10.5

Учет характеристик транспортных средств включается опцией options.enable_vehicle_classes. По умолчанию enable_vehicle_classes = true — в этом случае алгоритм классифицирует транспортные средства на основе их характеристик. Учет характеристик можно отключить, установив enable_vehicle_classes = false.

На выбор класса автомобиля влияет значение параметра Нагрузка на ось, т (axle_weight). Его можно указать:

Для некоторых дорог установлена максимально допустимая нагрузка на ось. Если нагрузка, заданная для автомобиля, превысит нагрузку, разрешенную для дороги, маршрут спланируется в объезд с учетом этого условия.

Ограничение axle_weight является жестким и не может нарушаться даже с применением штрафа.

Для построения оптимального маршрута с axle_weight нужно учитывать, что:

  • Значение axle_weight не является расчетным.

    Допустимая нагрузка на ось грузовика рассчитывается по специальной формуле вне сервиса Яндекс Маршрутизация.

    Примечание

    У транспортного средства может быть несколько осей, на каждую из которых приходится разная нагрузка. Чтобы избежать нарушений при весогабаритном контроле, выберите и укажите в поле axle_weight максимальное значение.

  • Фактический вес груза не влияет на заданную нагрузку на ось.

    Например, для участка дороги 1 установлено максимальное ограничение нагрузки в 10 тонн. Для автомобиля на листе Vehicles в поле axle_weight указано значение 12 тонн, но фактически он едет пустым. В результате маршрут спланируется в объезд дороги 1, так как алгоритм примет в расчет значение axle_weight, а не фактически отсутствующий вес груза.

Пример 1.1

Два автомобиля, грузовик и легковой автомобиль, развозят 10 заказов. 2 адреса расположены рядом с Черкизовской переправой, у которой ограничение по высоте для проезжающего транспорта — 2,5 метра. Самый короткий путь между этими адресами проходит через нее.

Алгоритм построит 2 маршрута, так как грузовик слишком высокий для переправы. Заказы, расположенные рядом с ней, повезет легковой автомобиль без ограничивающих характеристик. Поскольку у грузовика задана высота specs.height = 3, согласно спецификации ему присвоен класс truck_N27.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 1.2

В планировании участвуют те же заказы и автомобили, что в примере 1.1, но характеристики грузовика vehicle.specs не заданы, поэтому класс грузовику не присвоен.

Алгоритм не находит ограничений на проезд и планирует путь грузовика через переправу.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2.1

Курьер должен развезти 2 заказа, которые находятся за МКАД. Точки заказов диаметрально противоположны. У автомобиля не указан максимальный вес specs.max_weight, поэтому алгоритм без ограничений рассчитывает движение по МКАД. Из-за отсутствия характеристик vehicle.specs класс грузовику не присвоен.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2.2

То же, что и в примере 2.1, но в этот раз у автомобиля указан specs.max_weight = 12. Согласно спецификации, грузовику присвоен класс truck_N32. Алгоритм спланировал пробег в 3,5 раза больше, потому что автомобиль не может двигаться по МКАД.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2.3

То же, что и в примере 2.2, но вместо max_weight использован параметр max_weight_kg, и значение указано в кг. Грузовику присвоен тот же класс truck_N32. Алгоритм также спланировал маршрут в объезд, потому что автомобиль не может двигаться по МКАД.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 3.1

Курьер должен развезти 7 заказов. На перекрестке Калужского шоссе и Солнечной улицы установлен знак, запрещающий поворот налево, на Солнечную улицу, грузовикам с нагрузкой на ось более 6 тонн.

На листе Vehicles нагрузка на ось axle_weight не задана.

В результате алгоритм планирует маршрут, разрешающий поворот. Курьер сможет двигаться по Солнечной улице, чтобы доставить заказы 6 и 7.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 3.2

То же, что и в примере 3.1, но на листе Vehicles задана нагрузка на ось axle_weight = 10.

В результате алгоритм планирует маршрут, запрещающий поворот на Солнечную улицу. Чтобы доставить заказы 6 и 7, курьер движется объездным путем.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 4

В планировании участвуют 10 грузовиков со следующими классами: 45, 40, 37, 33, 25, 17, 11, 9, 5, 4. В решении можно использовать не более 5 классов. Согласно методике расчета, в решение попадут классы: 45, 37, 25, 11, 5.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Теги автомобиля

При определении автомобиля или курьера в запросе к Маршрутизации можно назначить ему правила совместимости (или теги) с заказами.

Правила совместимости могут потребоваться при наличии у автомобиля специального оборудования, которое необходимо для выполнения того или иного заказа — например, изотермического фургона для перевозки продуктов питания.

Правила совместимости автомобилей и заказов (теги автомобиля) задаются в следующих полях:

  • Поле vehicle.tags — свойства автомобиля, которые частично могут совпадать со свойствами, требуемыми заказом.

  • Поле vehicle.excluded_tags — свойства автомобиля, которые не должны совпадать со свойствами, требуемыми заказом.

Для определения тегов заказов используется поле запроса location.required_tags.

Внимание

Теги заказов определяют требуемые заказом характеристики автомобиля, а теги автомобилей определяют фактические правила совместимости того или иного автомобиля с различными заказами.

Определение тегов автомобиля возможно как в виде строк, так и в виде регулярных выражений. В строках теги могут перечисляться через запятую. В этом случае автомобиль сможет доставить заказ, если хотя бы один из перечисленных тегов автомобиля совпадает с тегом заказа или если у заказа нет тегов. Регулярные выражения — это способ описать более сложную логику и правила совместимости между автомобилями и заказами.

В Яндекс Маршрутизации используется синтаксис регулярных выражений POSIX Extended. Для тестирования регулярных выражений можно воспользоваться сервисом Regex101.

Рассмотрим, как можно применять теги на реальных примерах.

Пример 1

Рассмотрим сценарий, в котором транспортная компания доставляет продукты питания и напитки мелким оптом. Некоторые из продуктов питания необходимо доставлять строго в изотермических грузовиках. При этом все напитки и часть товаров из группы продуктов питания могут быть доставлены без холодильников. В дополнение часть клиентов может принять груз, только если автомобили оборудованы гидробортом.

Для определения таких ограничений заказов укажем в поле location.required_tags следующие теги:

  • TAIL_LIFT — для заказов, которые могут быть разгружены, только если автомобиль оборудован гидробортом.

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

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

Для определения возможностей автомобилей используем следующие теги в поле vehicle.tags:

  • TAIL_LIFT — для автомобилей, оснащенных гидробортом.

  • ISOTHERMAL_TRUCK — для автомобилей, оснащенных изотермическим фургоном.

  • NORMAL_TRUCK — для обычных автомобилей без изотермического фургона.

Примечание

Автомобиль при этом может иметь как один, так и несколько тегов, или не иметь их вообще, в зависимости от его реальной конфигурации. Это же правило касается и тегов заказов.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

Рассмотрим сценарий, в котором в некоторых заказах есть ограничение по высоте кузова для автомобиля из-за разной высоты зон разгрузки.

Например, есть заказы, у которых ограничение по высоте кузова составляет 2 метра, 2,3 метра и 2,5 метра. В таком случае у них должны быть соответствующие теги: Max_200, Max_230, Max_250.

На машинах теги необходимо проставлять более сложным образом, поскольку машина высотой до 2 метров может доставить любые заказы, а машина высотой 2,8 метра – далеко не все заказы. То есть если использовать только tags, то при высоте машины:

  • до 2 метров — в поле vehicle.tags будут все значения Max_200, Max_230, Max_250;

  • от 2 до 2,3 метра — в поле vehicle.tagsбудут значения Max_230, Max_250;

  • от 2,3 до 2,5 — в поле vehicle.tags будет значение Max_250;

  • более 2,5 метров — поле vehicle.tags будет пустым.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 3

Рассмотрим сценарий, в котором в некоторых заказах есть ограничение по заезду автомобилей определенной грузоподъемности (при этом действует условие ИЛИ, когда подходит любая из соответствующих машин).

Например, есть машины с разной грузоподъемностью: 1, 3, 9 и 15 тонн. Зафиксируем эти характеристики с помощью тегов vehicle.tags. Поскольку при описании заказов эти теги придется комбинировать, зададим их с помощью регулярных выражений: .*1TON.*, .*3TON.*, .*9TON.* и .*15TON.* (.* — означает «любая подстрока»).

Для некоторых заказов ограничение по грузоподъемности автомобиля составляет от 1 до 15 тонн, от 3 до 9 тонн и от 1 до 3 тонн. Это ограничение задается для заказа строкой с регулярным выражением, которое включает теги всех подходящих машин. То есть в поле location.required_tags будут следующие регулярные выражения при требуемой грузоподъемности:

  • от 1 до 15 тонн — ##1TON##3TON##9TON##15TON##;
  • от 3 до 9 тонн — ##3TON##9TON##;
  • от 1 до 3 тонн — ##1TON##3TON##.

Примечание

В примере 2 теги заказа задаются простым перечислением, так как у автомобиля должны быть все перечисленные теги (условие И). В примере 3 необходимо, чтобы у автомобиля был хотя бы один из тегов заказа (условие ИЛИ), это можно реализовать с помощью регулярных выражений или через создание отдельных тегов для каждого возможного сочетания из условий ИЛИ.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Опциональные теги

Иногда при планировании нужно учитывать, какие автомобили желательно использовать (или не использовать) для определенных заказов. Например, доставку VIP-заказов лучше поручать специально обученным курьерам.

Для таких необязательных требований предназначены опциональные теги, которые перечисляются в поле location.optional_tags. Допускается нарушение заданных предпочтений, если их нельзя удовлетворить (например, из-за ограничений по весу или времени доставки). Этим опциональные теги отличаются от требуемых характеристик ТС.

Примечание

Если автомобили желательно (но не обязательно) использовать на определенной территории, задайте для них опциональные геозоны.

Приоритет предпочтений регулируется с помощью веса тега location.optional_tags.value. Его значение может быть как положительным, так и отрицательным. При планировании опциональный тег сравнивается с тегами машины, на которой выполняется заказ. Если тег из location.optional_tags совпал с тегом ТС в списке:

  • vehicle.tags, то value вычитается из стоимости маршрута;

  • vehicle.excluded_tags, то value прибавляется к стоимости маршрута.

Значение, которое опциональные теги добавляют к стоимости маршрута, возвращается в поле result.routes.metrics.total_optional_tags_cost (может быть отрицательным).

Пример

Нужно доставить 10 заказов, некоторым из них заданы следующие опциональные теги:

  • vip — 6 заказов, вес тега на разных точках варьируется от 100 до 350;
  • morning — 3 заказа, вес тега на всех точках одинаковый, 500.

У одного из автомобилей теги vip и morning определены в поле vehicle.excluded_tags. Таким образом указано, что этому курьеру лучше не поручать заказы с тегом vip, а также заказы с тегом morning из-за позднего времени начала маршрута.

В итоге требования в большинстве случаев нарушены не были: пять из шести vip-заказов доставляет курьер без ограничения по тегу vip, по тегу morning нарушений нет.

Но один vip-заказ был запланирован на автомобиль с тегом vip в excluded_tags — из-за ограничения по вместимости. В поле total_optional_tags_cost этого маршрута возвращается значение 100: использование «нежелательного» автомобиля увеличило стоимость на 100 единиц. Предпочтение было нарушено для заказа c наименьшим весом location.optional_tags.value.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Несовместимость заказов в автомобиле

Заказы могут иметь несовместимые типы, они задаются с помощью параметров:

  • options.incompatible_load_types — задает несовместимость заказов для всех автомобилей одинаково. Подробнее см. в разделе Несовместимость заказов.

  • vehicle.incompatible_load_types — задает несовместимость заказов для конкретного автомобиля, то есть позволяет учесть особенности автомобиля.

  • vehicle.onboard_incompatible_load_types — при значении false (по умолчанию) несовместимость заказов действует в течение всего рейса; при значении true — только пока заказы находятся в автомобиле.

Примечание

Параметр vehicle.incompatible_load_types имеет более высокий приоритет и для данного автомобиля полностью переопределяет параметры options.incompatible_load_types.

Например, для перевозки молока и мороженого требуются разные температурные режимы. Если у автомобиля один отсек, он будет перевозить либо молоко, либо мороженое. Если же у автомобиля два отсека с разными температурными режимами, он может перевозить молоко и мороженое одновременно, в разных отсеках. В этом случае достаточно указать несовместимость заказов vehicle.incompatible_load_types для автомобилей с одним отсеком. Для автомобилей с двумя отсеками этот параметр не нужен, и для заказов в целом несовместимые типы options.incompatible_load_types также указывать не нужно.

Если несовместимость заказов вызвана не характеристиками автомобиля, а иными причинами, используйте параметр vehicle.onboard_incompatible_load_types = true. Например, если нельзя одновременно перевозить заказы конкурентов, тогда курьер будет забирать и развозить заказы каждой фирмы по отдельности без заезда на склад. Это позволит уменьшить пробег и время маршрута.

Пример 1

Доставка состоит из 4 адресов со следующими типами заказов:

  • заказ 1 (id = 1) — flowers;

  • заказ 2 (id = 2) — flowers;

  • заказ 3 (id = 3) — flowers, sweets;

  • заказ 4 (id = 4) — flowers, ice-cream.

При этом flowers и sweets несовместимы для доставки в одном автомобиле. Дополнительно, в автомобиле 2 запрещается одновременная доставка flowers и ice-cream, но разрешена доставка flowers и sweets. Тогда решение будет содержать доставку заказов 2 и 4 в первом автомобиле и заказов 1 и 3 во втором автомобиле.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2.1

Нужно забрать и доставить 3 заказа разных компаний. Заказы 1 и 2, 2 и 3 нельзя доставлять вместе, так как они принадлежат компаниям-конкурентам.

В результате планирования курьер забирает и развозит заказы 1 и 3, затем возвращается на склад, чтобы в новом рейсе загрузить и доставить заказ 2.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2.2

То же, что и в примере 2.1, но vehicle.onboard_incompatible_load_types = true.

В результате планирования курьер забирает и доставляет заказ 2, а затем без заезда на склад забирает и развозит заказы 1 и 3. Пробег и время маршрута уменьшились.

Запрос API (JSON)Ответ APIОткрыть на карте

Загруженные заказы

Если заказ уже находится в автомобиле, курьер может сразу ехать на доставку. Для выполнения такого сценария укажите параметры в поле planned_route:

Параметр

Описание

Значение

location.loaded_orders*

Список id заказов с типом delivery, которые уже загружены в автомобиль на складе или в точке с типом garage. За остальными заказами нужно дополнительно заезжать на склад. Независимо от значения loaded_orders в точку можно привозить любые заказы с типом pickup.

id

location.delivery_in_current_run*

Все загруженные в автомобиль заказы должны быть обслужены в этом же рейсе прежде, чем автомобиль заедет на склад.

true / false

planned_runs_first

Автомобиль заедет на все склады в planned_route перед тем, как совершать незапланированные рейсы.

Используйте, если:

  • запланированные заказы на складах уже подготовлены к погрузке с вечера, и их будет удобнее забрать раньше;

  • применяете параметр delivery_in_current_run, чтобы сначала развезти заказы из planned_route.

true / false

* Указывается для складов и заказов типа garage.

Пример

Несколько заказов загружено в автомобиль курьера с вечера, за ними не нужно заезжать на склад. Поэтому в месте, откуда будет выезжать курьер, указана точка типа garage.

Параметр loaded_orders показывает, что загружены заказы 1 и 2 . Курьер может сразу отвезти их в место назначения.

В условиях также заданы параметры:

  • planned_runs_first = true;

  • delivery_in_current_run = true для склада и гаража.

Курьер стартует из гаража и сразу доставляет заказы 1 и 2. Затем он отправляется на склад, где забирает заказы № 3 и № 4, которые должен доставить сразу после загрузки. После этих двух доставок курьер возвращается на склад за заказами 5 и 6 и следует по маршруту дальше.

Запрос API (JSON)Ответ APIОткрыть на карте

Корректировка времени движения автомобиля

Для расчета скорости автомобиля при построении маршрута используются данные Яндекс Карт о пробках и указанный в запросе коэффициент скорости. Однако часто получается так, что грузовики движутся по пробками медленнее, а некоторые водители водят более агрессивно и приезжают раньше расчетных значений.

Чтобы компенсировать такие отклонения, в Маршрутизации есть опция travel_time_multiplier, в которой можно указать дробное значение. При значении 1 расчет будет произведен для автомобиля с ожидаемой средней скоростью. При меньших значениях (например, 0,8), расчет будет для более быстрых автомобилей, при больших (например, 1,2) — для более медленных.

Примечание

Параметр travel_time_multiplier влияет только на скорость движения автомобиля. Время обслуживания на точке доставки остается прежним.

Пример 1

В примере ниже запрос на маршрутизацию отправлен без корректировки времени движения. В результате автомобиль выполняет доставку за 4 часа 20 минут, из которых 3 часа 40 минут уходит на перемещение между точками.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

То же, что и в примере 1, но добавлен параметр travel_time_multiplier, равный 0,5. В построенном маршруте курьер выполняет доставку за 2 часа 25 минут, из которых 1 час 45 минут уходит на перемещение между точками. При этом время, затраченное на парковку и передачу товара, не изменяется.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 3

То же, что и в примере 1, но добавлен параметр travel_time_multiplier, равный 2. В построенном маршруте курьер выполняет доставку за 7 часов 58 минут, из которых 7 часов 18 минут уходит на перемещение между точками. На перемещение уходит примерно в 2 раза больше времени, чем в маршруте примера 1, потому что часть построенного маршрута выпадает на час пик, и автомобиль не может использовать максимальную скорость. Время, затраченное на парковку и передачу товара, не изменяется.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Корректировка времени обслуживания

При подсчете суммарного времени на заказ, помимо общего сервисного времени на складе, также учитывается время, которое курьер тратит на передачу заказа. В это время включены парковка, подъем на лифте, передача доставки и оформление бумаг. Это время учитывается у заказов в параметрах service_duration_s и shared_service_duration_s. Однако некоторые курьеры проводят меньше времени на складе в начале маршрута и передают товар быстрее, чем другие. Например:

  • При одновременном планировании для автомобилей и курьеров на общественном транспорте курьеры, которые передвигаются общественным транспортом, не тратят время на парковку. В результате им нужно меньше времени на обслуживание.

  • У курьеров может быть разный уровень квалификации. Опытные курьеры обычно тратят меньше времени на складе и на передачу заказа.

Чтобы компенсировать разницу между временем работы, для курьеров в Маршрутизации предусмотрены параметры service_duration_multiplier и shared_service_duration_multiplier. Они влияют на длительность времени, которое конкретный курьер проведет на складе и потратит на обслуживание заказа. При значении 1 время обсуживания будет совпадать с указанным в поле service_duration или shared_service_duration, а сервисное время на складе будет равно параметру склада service_duration_s, при значениях меньше 1 сервисное время на складе и время обслуживания будут уменьшены, а при значениях больше 1 — увеличены.

Примечание

Параметры service_duration_multiplier и shared_service_duration_multiplier влияют только на время обслуживания и сервисное время на складе. Время перемещения между точками остается прежним.

Пример 1

В примере ниже запрос на маршрутизацию отправлен без корректировки времени обслуживания.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

В примере ниже на маршрутизацию отправлен тот же запрос, что и в примере 1, но со значением параметра service_duration_multiplier в 0,5. Обслуживание заказов и сервисное время на складе в расчете занимают вполовину меньше времени по сравнению с примером 1.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 3

В примере ниже на маршрутизацию отправлен тот же запрос, что и в примере 1, но со значением параметра service_duration_multiplier в 2. Обслуживание заказов и сервисное время на складе занимают вдвое больше времени по сравнению с примером 1.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Доставка как можно раньше

Для построения оптимального маршрута алгоритм минимизирует ожидание между точками маршрута. Но бывают случаи, когда полезно сдвигать доставку на более раннее время. Например:

  • нужно минимизировать риск опоздания;
  • курьеру комфортнее ехать в светлое время суток.

Чтобы заказы были доставлены как можно раньше, используйте penalty.arrival_after_start, который состоит из двух параметров:

  • average_h — задает размер штрафа за среднее время приезда после начала временного окна. При использовании опции рекомендуется всегда указывать это значение.
  • as_soon_as_possible — определяет, нужно ли начинать маршрут максимально рано. Параметр принимает значение true или false (по умолчанию). Указывается в дополнение к average_h.

Примечание

Алгоритм может сдвигать время старта и приезда автомобиля, только если для склада включено гибкое время старта.

Если не использовать штраф penalty.arrival_after_start, то маршрут будет строиться с минимальным ожиданием между точками и максимально поздним временем старта со склада.

При использовании штрафа алгоритм будет строить маршруты так, чтобы начинать их раньше, если это не ухудшает качество.

Если маршрут следует начать максимально рано (даже если из-за этого появится дополнительное ожидание), укажите penalty.arrival_after_start.as_soon_as_possible = true.

Пример 1

Маршрут состоит из 4 заказов, которые имеют разные временные окна. Самое раннее начало временного окна у заказа 5 — в 08:00. Курьер стартует со склада в 11:02 и прибывает на первый заказ в 11:40. Заказ 5 доставляется в 12:59.

Запрос API (JSON)Ответ APIОткрыть на карте

Пример 2

Используются те же данные, что и в примере 1, но назначен штраф за среднее время приезда после начала временного окна при помощи параметра penalty.arrival_after_start.average_h. При этом курьер стартует со склада в 06:59, ждет 8 минут и доставляет самый ранний заказ (заказ 5) в 08:00.

Запрос API (JSON)Ответ APIОткрыть на карте

Пример 3

Используются те же данные, что и в примере 2, но дополнительно задан параметр penalty.arrival_after_start.as_soon_as_possible = true. При этом курьер стартует со склада в 06:00, ждет 1 час 7 минут и доставляет самый ранний заказ (заказ 5) в 08:00.

Запрос API (JSON)Ответ APIОткрыть на карте

Сцепки

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

Для описания прицепа используйте объект trailer.

Поле

Описание

trailer.сapacity

Вместимость прицепа, описывается полями:

  • weight_kg — вместимость в килограммах;
  • units — вместимость в единицах.

Добавляется к вместимости грузовика.

trailer.capacity.custom

Количество пользовательских единиц измерения, которое можно перевозить в прицепе.

Вместимости в пользовательских единицах задаются в формате "name": size, где:

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

Если название единицы присутствует в отправлениях или других автомобилях, но не в этом, то вместимость полагается неограниченной.

trailer.capacity.limits

Предел загрузки прицепа, описывается полями:

  • units_perc — в пользовательских единицах измерения, выражается в процентах от вместимости прицепа;
  • volume_perc — в процентах от объема прицепа;
  • weight_perc — в процентах от максимально допустимого общего веса груза, перевозимого в прицепе.

trailer.capacity.volume

Метрические размеры прицепа, описываются полями:

  • depth_m* — глубина;
  • height_m* — высота;
  • width_m* — ширина.

Значения выражаются в метрах.

* — Обязательный параметр

trailer.capacity.volume_cbm

Объем прицепа в кубометрах.

Если у прицепа заданы и метрические размеры, и объем, то trailer.capacity.volume определяет габариты, а trailer.capacity.volume_cbm — вместимость.

trailer.max_capacity_difference

Максимальная разница в загрузке прицепа и грузовика описывается полями:

  • units — на сколько единиц товаров может быть в прицепе больше, чем в грузовике;
  • volume_cbm — на сколько кубических метров загрузка прицепа может быть больше, чем загрузка грузовика;
  • weight_kg — на сколько килограмм загрузка прицепа может быть больше, чем загрузка грузовика.

Если какое-то из полей пропущено, значит, по нему нет ограничений.

На разницу в загрузке прицепа и грузовика есть физические ограничения. Если грузовик пустой, а прицеп тяжелый, то автомобиль становится неуправляемым, сцепка не сможет ехать.

trailer.max_capacity_difference.custom

Максимально допустимая разница в загруженном количестве пользовательских единиц измерения у прицепа и грузовика.

Допустимая разница в пользовательских единицах задается в формате "name": size, где:

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

Если название единицы присутствует в отправлениях или других автомобилях, но не в этом, то ограничения нет.

trailer.cost

Стоимость прицепа, описывается полями:

  • fixed — фиксированная стоимость за использование прицепа;
  • hour — стоимость за час использования прицепа;
  • km — стоимость за километр (добавляется только за участки пути, где грузовик едет с прицепом);
  • location — стоимость использования прицепа в расчете на один пункт назначения;
  • run — стоимость за один рейс со склада до  пункта назначения;
  • tonne_km — стоимость перевозки одной тонны на один километр.

Добавляется к стоимости грузовика, если прицеп будет использован.

trailer.decoupling_time_s

Время отсоединения прицепа в секундах.

Только для заказов с типом anchor и parking (см. раздел Использование прицепа).

trailer.coupling_time_s

Время присоединения прицепа в секундах.

Только для заказов с типом anchor и parking (см. раздел Использование прицепа).

trailer.rolling_cost

Штраф за каждую перекатку* грузов из прицепа в грузовик.

* Перекатка — перемещение заказов из прицепа в грузовик (чтобы доставить их в неподъездные локации (см. раздел Использование прицепа)).

trailer.rolling_time

Время перекатки груза из прицепа в грузовик, задается в секундах. Может быть описано полями:

  • fixed_time_s — фиксированное время;
  • s_per_kg — время разгрузки на килограмм груза;
  • s_per_m3 — время разгрузки на кубометр груза;
  • s_per_unit — время разгрузки на единицу груза.

Если указано несколько типов времени, используется тот, который затрачивает больше всего времени. Если ни один тип не указан, используется только фиксированное время.

Ко времени перекатки добавляется coupling_time_s и decoupling_time_s, так как для перекатки нужно сначала присоединить прицеп, а потом отсоединить его.

Пример описания прицепа в запросе:

{
    "trailer": {
        "capacity": {
            "weight_kg": 10000,
            "units": 200
        },
        "max_capacity_difference": {
            "units": 10,
            "weight_kg": 0
        },
        "cost": {
            "fixed": 1000,
            "km": 10
        },
        "decoupling_time_s": 300,
        "coupling_time_s": 300,
        "rolling_time": {
            "fixed_time_s": 3000
        }
    }
}

Подробнее об использовании грузовика с прицепом см. в разделе Использование прицепа.

Определение геозон

При планировании маршрута для автомобилей могут быть заданы ограничения по зонам доставки.

Зоны, в которые транспортное средство может доставлять заказы, задаются на листе Vehicles в поле Разрешенные геозоны (vehicles.allowed_zones в API):

  • автомобиль может выполнять заказы в любой зоне, указанной в этом поле;

  • если зоны доступности не заданы, то курьер может выполнять заказы без ограничений;

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

Зоны, запрещенные для доставки, задаются в поле Запрещенные геозоны (vehicle.forbidden_zones в API). Курьер не может доставлять заказы ни в одну из зон, указанных в этом поле.

Примечание

Если заказ расположен в области пересечения разрешенной и запрещенной зон, то он не может быть доставлен — значения в поле Запрещенные геозоны (forbidden_zones) имеют более высокий приоритет, чем в поле Разрешенные геозоны (allowed_zones).

Если зоны запрещены для посещения всем курьерам, используйте глобальную опцию options.avoid_zones. В зонах из vehicle.forbidden_zones курьер не может выполнять заказы, но может проезжать через них. В зоны из options.avoid_zones курьеры не могут даже заезжать. Подробнее см. Исключенные зоны.

Для проезда по Москве грузовикам нужны специальные пропуска:

  • для проезда внутрь МКАД;

  • для проезда внутрь ТТК.

Эту особенность необходимо учитывать при составлении задачи планирования, чтобы грузовики без пропусков не получали маршруты в зоны, куда им нельзя проехать.

Чтобы задать ограничение по доставке, используйте следующие публичные геозоны:

  • public_inside_ttk — территория внутри ТТК;
  • public_inside_mkad — территория от МКАД до ТТК (не включает территорию внутри ТТК);

Укажите идентификатор публичной геозоны как значение поля Разрешенные геозоны или Запрещенные геозоны.

При распределении заказов учитывается несовместимость геозон — как заданная глобальной опцией, так и определенная для отдельных курьеров. Также при планировании можно отменить все ограничения, связанные с геозонами.

Пример

В примере 4 заказа и 2 автомобиля, в интерфейсе заданы 4 геозоны. Принадлежность заказов к геозонам определяется автоматически по координатам:

  • Заказ 1 — одновременно в зонах zone1 и zone2;

  • Заказ 2 — в зоне zone1;

  • Заказ 3 — одновременно в зонах zone2 и zone3;

  • Заказ 4 — в зоне zone4.

Определена доступность геозон для автомобилей:

Логин курьера

Разрешенные геозоны (allowed_zones)

Запрещенные геозоны (forbidden_zones)

Автомобиль 1

zone1, zone2

zone3

Автомобиль 2

Зоны не определены

zone2

В итоге Автомобиль 1 развозит Заказы 1 и 2, Автомобиль 2 — Заказ 4. А Заказ 3 остался нераспределенным, потому что его адрес находится в зонах, запрещенных для обоих автомобилей.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Опциональные геозоны

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

Опциональные геозоны — это нежесткое ограничение. С их помощью можно задать предпочтительные для посещения зоны (приоритетные и неприоритетные).

Опциональные геозоны задаются с помощью массива vehicle.optional_zones:

  • optional_zones.N.zone — название геозоны;
  • optional_zones.N.value — если значение параметра больше 0, то автомобиль получает бонус за посещение указанной геозоны (значение этого параметра вычитается из стоимости маршрута), а если меньше 0 — штраф (значение прибавляется к стоимости маршрута).

Приоритет геозон

Посмотреть видео

Пример 1

Нужно доставить 10 заказов двумя автомобилями. Для одного автомобиля задана опциональная геозона South, а для другого North. За посещение этих геозон назначен бонус 1000 единиц. В результате один автомобиль развозит заказы на юге, а второй — на севере. Заказ 5 стал исключением — он относится к зоне South, но был доставлен автомобилем Courier north.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

4 курьера должны доставить 27 заказов. Для курьеров город поделен на 4 опциональных геозоны: Northwest, Northeast, Southwest и Southeast. Для каждого курьера задана одна приоритетная зона, за посещение которой он получает бонус, две неприоритетных зоны и зона, за посещение которой будет начислен штраф. В результате планирования курьеры доставляют заказы в своих приоритетных зонах. Исключениями стали заказы 18, 20 и 23 из-за ограничения по вместимости автомобилей.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Несовместимые геозоны

Чтобы в один рейс курьера не попадали заказы, которые относятся к разным зонам доставки, можно определить несовместимость геозон.

Список таких зон можно задать не только для всего решения, но и для конкретного курьера — параметром vehicles.incompatible_zones. Несовместимые зоны, определенные для курьера, имеют приоритет над зонами, определенными глобально. Чтобы на курьера не распространялось глобальное ограничение options.incompatible_zones, задайте для него в поле vehicles.incompatible_zones пустой список.

Пример

Каждый из трех курьеров должен доставить по 4 заказа в разные районы города: северо-западный, юго-западный, северо-восточный и юго-восточный. Эти районы заданы при планировании геозонами: Northwest, Southwest, Northeast, Southeast.

Глобально определена несовместимость геозон: южные зоны (Southwest и Southeast) несовместимы с северными (Northwest и Northeast). Для двух курьеров также задан параметр vehicles.incompatible_zones: у первого курьера он содержит пустой список, а для второго определено, что западные зоны (Northwest и Southwest) несовместимы с восточными (Northeast и Southeast).

В результате планирования:

  • на первого курьера Courier 1 глобальное ограничение несовместимости не распространяется и у него в один рейс попадают все 4 заказа из разных районов;
  • для второго курьера Courier 2 работают ограничения по несовместимости зон, заданные для него в параметре vehicles.incompatible_zones: в один рейс попадают заказы в восточные зоны, а в другой — в западные;
  • на третьего курьера Courier 3 действуют глобальные ограничения: по разным рейсам разнесены заказы в южные зоны и в северные.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

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

Значение по умолчанию.