- JSON-представление
- Отгрузка
- ПосетитеЗапрос
- ШиротаДлительность
- Путевая точка
- Расположение
- ВремяОкно
- Транспортное средство
- Режим путешествия
- Модификаторы маршрута
- Политика разгрузки
- Ограничение нагрузки
- Интервал
- Лоадкост
- Ограничение продолжительности
- Предел расстояния
- BreakRule
- Запрос на перерыв
- Частотное ограничение
- ПродолжительностьDistanceMatrix
- Ряд
- Атрибуты перехода
- Тип отгрузкиНесовместимость
- Режим несовместимости
- Тип отгрузкиТребование
- Режим Требования
- Правило приоритета
Модель перевозки содержит набор перевозок, которые необходимо выполнить набором транспортных средств, минимизируя при этом общую стоимость, которая представляет собой сумму:
- стоимость маршрутизации транспортных средств (сумма затрат за общее время, стоимость за время в пути и фиксированная стоимость для всех транспортных средств).
- штрафы за невыполненную отгрузку.
- стоимость глобальной продолжительности поставок
JSON-представление |
---|
{ "shipments": [ { object ( |
Поля | |
---|---|
shipments[] | Набор перевозок, которые необходимо выполнить в модели. |
vehicles[] | Набор транспортных средств, которые можно использовать для совершения посещений. |
globalStartTime | Глобальное время начала и окончания модели: никакое время вне этого диапазона не может считаться действительным. Временной интервал модели должен быть меньше года, т. е. значения При использовании полей Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
globalEndTime | Если значение не установлено, по умолчанию используется 00:00:00 UTC, 1 января 1971 года (т. е. секунды: 31536000, nanos: 0). Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
globalDurationCostPerHour | «Глобальная продолжительность» общего плана — это разница между самым ранним эффективным временем начала и самым поздним эффективным временем окончания для всех транспортных средств. Пользователи могут присвоить этому количеству стоимость часа, чтобы попытаться оптимизировать его, например, для скорейшего завершения задания. Эта стоимость должна быть в той же единице измерения, что и |
durationDistanceMatrices[] | Задает матрицы длительности и расстояния, используемые в модели. Если это поле пусто, вместо него будут использоваться Карты Google или геодезические расстояния, в зависимости от значения поля Примеры использования:
|
durationDistanceMatrixSrcTags[] | Теги, определяющие источники матриц длительности и расстояния; Теги соответствуют |
durationDistanceMatrixDstTags[] | Теги, определяющие назначения матриц длительности и расстояния; Теги соответствуют |
transitionAttributes[] | В модель добавлены атрибуты перехода. |
shipmentTypeIncompatibilities[] | Наборы несовместимых типов_доставки (см. « |
shipmentTypeRequirements[] | Наборы требований |
precedenceRules[] | Набор правил приоритета, которые должны соблюдаться в модели. |
maxActiveVehicles | Ограничивает максимальное количество активных транспортных средств. Транспортное средство считается активным, если по его маршруту совершается хотя бы одна перевозка. Это можно использовать для ограничения количества маршрутов в случае, когда водителей меньше, чем транспортных средств, и парк транспортных средств неоднороден. Затем оптимизация выберет лучший подмножество транспортных средств для использования. Должен быть строго положительным. |
Отгрузка
Отгрузка одного товара от одного его получения до одной из доставок. Чтобы отгрузка считалась выполненной, уникальное транспортное средство должно посетить один из пунктов выдачи (и соответственно уменьшить свои запасные мощности), а затем посетить один из пунктов доставки позже (и, следовательно, соответствующим образом повторно увеличить свои запасные мощности).
JSON-представление |
---|
{ "displayName": string, "pickups": [ { object ( |
Поля | |
---|---|
displayName | Определяемое пользователем отображаемое имя отправления. Он может иметь длину до 63 символов и может использовать символы UTF-8. |
pickups[] | Набор вариантов получения, связанных с отправкой. Если не указано иное, транспортному средству необходимо посетить только место, соответствующее доставке. |
deliveries[] | Набор альтернатив доставки, связанных с отправкой. Если не указано иное, транспортному средству необходимо посетить только место, соответствующее пикапу. |
loadDemands | Требования к загрузке груза (например, вес, объем, количество поддонов и т. д.). Ключами в карте должны быть идентификаторы, описывающие тип соответствующей нагрузки, в идеале также включающие единицы измерения. Например: «вес_кг», «объем_галлонов», «поддон_количество» и т. д. Если данный ключ не отображается на карте, соответствующая нагрузка считается нулевой. |
allowedVehicleIndices[] | Набор транспортных средств, которые могут выполнить данную перевозку. Если пусто, все транспортные средства могут это сделать. Транспортные средства задаются по их индексу в списке |
costsPerVehicle[] | Указывает затраты, возникающие при доставке груза каждым транспортным средством. Если указано, оно должно иметь ЛИБО:
Эти затраты должны быть в той же единице измерения, что и |
costsPerVehicleIndices[] | Индексы транспортных средств, к которым применяются |
pickupToDeliveryAbsoluteDetourLimit | Указывает максимальное абсолютное время обхода по сравнению с кратчайшим путем от получения до доставки. Если указано, оно должно быть неотрицательным, а отгрузка должна включать как минимум самовывоз и доставку. Например, пусть t будет кратчайшим временем, необходимым для перехода от выбранного варианта самовывоза непосредственно к выбранному варианту доставки. Затем установка
Если для одной и той же отправки указаны как относительные, так и абсолютные ограничения, для каждой возможной пары «вывоз/доставка» используется более строгий предел. С 2017/10 года объезды поддерживаются только в том случае, если продолжительность поездки не зависит от транспортных средств. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
pickupToDeliveryTimeLimit | Указывает максимальную продолжительность от начала получения до начала доставки груза. Если указано, оно должно быть неотрицательным, а отгрузка должна включать как минимум самовывоз и доставку. Это не зависит ни от того, какие альтернативы выбраны для получения и доставки, ни от скорости автомобиля. Это можно указать вместе с ограничениями на максимальный обход: решение будет учитывать обе спецификации. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
shipmentType | Непустая строка, определяющая «тип» этой отправки. Эту функцию можно использовать для определения несовместимостей или требований между Отличается от |
label | Указывает этикетку для этой отправки. Эта метка указывается в ответе в |
ignore | Если это правда, пропустите эту отправку, но не применяйте Игнорирование отгрузки приводит к ошибке проверки, если в модели есть какие-либо Игнорирование отправки, выполняемой в |
penaltyCost | Если отгрузка не завершена, данный штраф добавляется к общей стоимости маршрутов. Отгрузка считается завершенной, если выбран один из вариантов ее получения и доставки. Стоимость может быть выражена в тех же единицах измерения, которые используются для всех других полей модели, связанных со стоимостью, и должна быть положительной. ВАЖНО : Если этот штраф не указан, он считается бесконечным, т.е. отгрузка должна быть завершена. |
pickupToDeliveryRelativeDetourLimit | Указывает максимальное относительное время обхода по сравнению с кратчайшим путем от получения до доставки. Если указано, оно должно быть неотрицательным, а отгрузка должна включать как минимум самовывоз и доставку. Например, пусть t будет кратчайшим временем, необходимым для перехода от выбранного варианта самовывоза непосредственно к выбранному варианту доставки. Затем установка
Если для одной и той же отправки указаны как относительные, так и абсолютные ограничения, для каждой возможной пары «вывоз/доставка» используется более строгий предел. С 2017/10 года объезды поддерживаются только в том случае, если продолжительность поездки не зависит от транспортных средств. |
ПосетитеЗапрос
Запрос на посещение, которое может быть совершено на транспортном средстве: у него есть географическое местоположение (или два, см. ниже), время открытия и закрытия, представленное временными окнами, и время продолжительности обслуживания (время, проведенное транспортным средством после прибытия забрать или сдать товар).
JSON-представление |
---|
{ "arrivalLocation": { object ( |
Поля | |
---|---|
arrivalLocation | Географическое местоположение, куда прибывает транспортное средство при выполнении этого |
arrivalWaypoint | Маршрутная точка, куда прибывает транспортное средство при выполнении этого |
departureLocation | Географическое местоположение, куда отправляется транспортное средство после выполнения этого |
departureWaypoint | Маршрутная точка, из которой отправляется транспортное средство после выполнения этого |
tags[] | Указывает теги, прикрепленные к запросу на посещение. Пустые или повторяющиеся строки не допускаются. |
timeWindows[] | Временные окна, ограничивающие время прибытия на визит. Обратите внимание, что транспортное средство может выехать за пределы временного окна прибытия, т. е. время прибытия + продолжительность не обязательно должны находиться внутри временного окна. Это может привести к увеличению времени ожидания, если транспортное средство прибудет раньше Отсутствие Временные окна не должны пересекаться, т. е. ни одно временное окно не должно перекрываться или примыкать к другому, и они должны располагаться в возрастающем порядке. |
duration | Продолжительность посещения, т.е. время, проведенное транспортным средством между прибытием и отъездом (должно быть добавлено к возможному времени ожидания; см. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
cost | Стоимость обслуживания этого запроса на посещение по маршруту транспортного средства. Это можно использовать для оплаты различных расходов за каждый альтернативный вариант получения или доставки груза. Эта стоимость должна быть в той же единице измерения, что и |
loadDemands | Загрузить требования этого запроса на посещение. Это похоже на поле |
visitTypes[] | Указывает виды посещения. Это можно использовать для выделения дополнительного времени, необходимого транспортному средству для завершения этого визита (см. Тип может появиться только один раз. |
label | Указывает метку для этого |
ШиротаДлительность
Объект, представляющий пару широты и долготы. Это выражается в виде пары двойных чисел, обозначающих градусы широты и градусы долготы. Если не указано иное, этот объект должен соответствовать стандарту WGS84 . Значения должны находиться в пределах нормализованных диапазонов.
JSON-представление |
---|
{ "latitude": number, "longitude": number } |
Поля | |
---|---|
latitude | Широта в градусах. Оно должно находиться в диапазоне [-90,0, +90,0]. |
longitude | Долгота в градусах. Оно должно находиться в диапазоне [-180,0, +180,0]. |
Путевая точка
Инкапсулирует путевую точку. Путевые точки отмечают места прибытия и отправления VisitRequests, а также начальные и конечные местоположения транспортных средств.
JSON-представление |
---|
{ "sideOfRoad": boolean, // Union field |
Поля | |
---|---|
sideOfRoad | Необязательный. Указывает, что местоположение этой путевой точки предназначено для того, чтобы транспортное средство остановилось на определенной стороне дороги. Если вы установите это значение, маршрут будет проходить через местоположение, так что транспортное средство сможет остановиться на той стороне дороги, к которой местоположение смещено от центра дороги. Эта опция не работает для режима передвижения «ХОДЬБА». |
Поле объединения location_type . Различные способы представления местоположения. location_type может быть только одним из следующих: | |
location | Точка, указанная с использованием географических координат, включая необязательный заголовок. |
placeId | Идентификатор места POI, связанный с путевой точкой. |
Расположение
Инкапсулирует местоположение (географическую точку и необязательный заголовок).
JSON-представление |
---|
{
"latLng": {
object ( |
Поля | |
---|---|
latLng | Географические координаты путевой точки. |
heading | Курс компаса связан с направлением потока транспорта. Это значение используется для указания стороны дороги, которая будет использоваться для посадки и высадки. Значения курса могут быть от 0 до 360, где 0 указывает направление на север, 90 указывает направление на восток и т. д. |
ВремяОкно
Временные окна ограничивают время события, например время прибытия на посещение или время начала и окончания движения транспортного средства.
Жесткие границы временного окна, startTime
и endTime
, определяют самое раннее и самое позднее время события, например, startTime <= event_time <= endTime
. Нижняя граница окна мягкого времени, softStartTime
, выражает предпочтение тому, чтобы событие произошло в softStartTime
или после него, за счет затрат, пропорциональных тому, как долго до softStartTime произойдет событие. Верхняя граница мягкого временного окна softEndTime
выражает предпочтение тому, чтобы событие произошло в softEndTime
или раньше, за счет затрат, пропорциональных тому, как долго после softEndTime
происходит событие. startTime
, endTime
, softStartTime
и softEndTime
должны находиться в пределах глобальных ограничений по времени (см. ShipmentModel.global_start_time
и ShipmentModel.global_end_time
) и должны учитывать:
0 <= `startTime` <= `endTime` and
0 <= `startTime` <= `softStartTime` and
0 <= `softEndTime` <= `endTime`.
JSON-представление |
---|
{ "startTime": string, "endTime": string, "softStartTime": string, "softEndTime": string, "costPerHourBeforeSoftStartTime": number, "costPerHourAfterSoftEndTime": number } |
Поля | |
---|---|
startTime | Время начала трудного временного окна. Если не указано, будет установлено значение Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
endTime | Время окончания трудного временного окна. Если не указано, будет установлено значение Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
softStartTime | Время плавного запуска временного окна. Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
softEndTime | Мягкое время окончания временного окна. Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
costPerHourBeforeSoftStartTime | Стоимость часа, добавленная к другим затратам в модели, если событие происходит до softStartTime, рассчитывается как:
Эта стоимость должна быть положительной, и это поле можно установить только в том случае, если установлено softStartTime. |
costPerHourAfterSoftEndTime | Стоимость часа, добавленная к другим затратам в модели, если событие происходит после
Эта стоимость должна быть положительной, и это поле можно установить только в том случае, если установлено |
Транспортное средство
Моделирует автомобиль в задаче по доставке. При решении проблемы с отправкой будет построен маршрут для этого транспортного средства, начинающийся с startLocation
и заканчивающийся endLocation
. Маршрут — это последовательность посещений (см. ShipmentRoute
).
JSON-представление |
---|
{ "displayName": string, "travelMode": enum ( |
Поля | |
---|---|
displayName | Определяемое пользователем отображаемое имя транспортного средства. Он может иметь длину до 63 символов и может использовать символы UTF-8. |
travelMode | Режим движения, влияющий на дороги, по которым движется транспортное средство, и его скорость. См. также |
routeModifiers | Набор условий, которые необходимо выполнить, которые влияют на способ расчета маршрутов для данного транспортного средства. |
startLocation | Географическое местоположение, где транспортное средство отправляется до получения груза. Если не указано иное, автомобиль заводится при первом получении. Если модель доставки имеет матрицы длительности и расстояния, |
startWaypoint | Путевая точка, представляющая географическое место, где транспортное средство начинает движение перед получением груза. Если не указаны ни |
endLocation | Географическое местоположение, в котором заканчивается транспортное средство после завершения последнего |
endWaypoint | Путевая точка, представляющая географическое местоположение, в котором заканчивается транспортное средство после завершения последнего |
startTags[] | Указывает теги, прикрепленные к началу маршрута транспортного средства. Пустые или повторяющиеся строки не допускаются. |
endTags[] | Указывает теги, прикрепленные к концу маршрута транспортного средства. Пустые или повторяющиеся строки не допускаются. |
startTimeWindows[] | Временные окна, в течение которых транспортное средство может покинуть исходное место. Они должны находиться в пределах глобальных ограничений по времени (см. поля Временные окна, принадлежащие одному и тому же повторяющемуся полю, должны быть непересекающимися, т.е. ни одно временное окно не может перекрываться или примыкать к другому, и они должны располагаться в хронологическом порядке. |
endTimeWindows[] | Временные окна, в течение которых транспортное средство может прибыть в конечное место. Они должны находиться в пределах глобальных ограничений по времени (см. поля Временные окна, принадлежащие одному и тому же повторяющемуся полю, должны быть непересекающимися, т.е. ни одно временное окно не может перекрываться или соседствовать с другим, и они должны располагаться в хронологическом порядке. |
unloadingPolicy | Политика разгрузки применяется к транспортному средству. |
loadLimits | Вместимость транспортного средства (например, вес, объем, количество поддонов). Ключами в карте являются идентификаторы типа груза, соответствующие ключам поля |
costPerHour | Стоимость транспортного средства: все затраты суммируются и должны быть в той же единице измерения, что и Стоимость часа проезда автомобиля. Эта стоимость применяется к общему времени, затраченному на маршрут, и включает время в пути, время ожидания и время посещения. Использование |
costPerTraveledHour | Стоимость за час проезда транспортного средства по маршруту. Эта стоимость применяется только ко времени в пути, затраченному на маршрут (т. е. указанному в |
costPerKilometer | Стоимость за километр пути автомобиля. Эта стоимость применяется к расстоянию, указанному в |
fixedCost | Фиксированная стоимость применяется, если это транспортное средство используется для обработки груза. |
usedIfRouteIsEmpty | Это поле применимо только к транспортным средствам, по маршруту которых не обслуживаются грузы. Он указывает, следует ли в данном случае считать транспортное средство бывшим в употреблении или нет. Если это правда, транспортное средство движется от начального до конечного местоположения, даже если оно не обслуживает никаких грузов, а затраты времени и расстояния, возникающие в результате его начала --> конечного путешествия, принимаются во внимание. В противном случае он не перемещается от своего начального к конечному местоположению, и для этого транспортного средства не запланировано ни |
routeDurationLimit | Ограничение применяется к общей продолжительности маршрута транспортного средства. В данном |
travelDurationLimit | Ограничение применяется к продолжительности проезда по маршруту транспортного средства. В данном |
routeDistanceLimit | Ограничение применяется к общему расстоянию маршрута транспортного средства. В данном |
extraVisitDurationForVisitType | Определяет сопоставление строк visitTypes с длительностью. Продолжительность — это время в дополнение к Если запрос на посещение имеет несколько типов, продолжительность будет добавлена для каждого типа на карте. |
breakRule | Описывает график перерывов, который должен соблюдаться на этом автомобиле. Если он пуст, для этого автомобиля не будет запланировано никаких перерывов. |
label | Указывает метку для этого автомобиля. Эта метка указывается в ответе как |
ignore | Если значение true, Если отгрузка выполняется игнорируемым транспортным средством в Если отгрузка выполняется игнорируемым транспортным средством в |
travelDurationMultiple | Указывает мультипликативный коэффициент, который можно использовать для увеличения или уменьшения времени в пути этого транспортного средства. Например, установка значения 2.0 означает, что этот автомобиль медленнее и его время в пути вдвое больше, чем у стандартных транспортных средств. Этот коэффициент не влияет на продолжительность посещения. Это влияет на стоимость, если указаны ВНИМАНИЕ: Время в пути будет округлено до ближайшей секунды после применения этого коэффициента, но до выполнения каких-либо числовых операций, поэтому небольшое значение кратного может привести к потере точности. См. также |
Режим путешествия
Режимы движения, которые могут использоваться транспортными средствами.
Это должно быть подмножеством режимов передвижения API-интерфейса «Предпочитаемые маршруты платформы Google Карт», см. https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode .
Перечисления | |
---|---|
TRAVEL_MODE_UNSPECIFIED | Неопределенный режим движения, эквивалентный DRIVING . |
DRIVING | Режим движения, соответствующий направлениям движения (автомобиль, ...). |
WALKING | Режим движения, соответствующий пешеходным направлениям. |
Модификаторы маршрута
Инкапсулирует набор дополнительных условий, которые необходимо выполнить при расчете маршрутов транспортных средств. Это похоже на RouteModifiers
в предпочтительном API маршрутов платформы Google Maps; см.: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers .
JSON-представление |
---|
{ "avoidTolls": boolean, "avoidHighways": boolean, "avoidFerries": boolean, "avoidIndoor": boolean } |
Поля | |
---|---|
avoidTolls | Указывает, следует ли избегать платных дорог, где это возможно. Предпочтение будет отдано маршрутам, не содержащим платных дорог. Применяется только к моторизованным режимам движения. |
avoidHighways | Указывает, следует ли избегать шоссе, где это возможно. Предпочтение будет отдано маршрутам, не содержащим автомобильных дорог. Применяется только к моторизованным режимам движения. |
avoidFerries | Указывает, следует ли избегать паромов, где это возможно. Предпочтение будет отдано маршрутам, не предполагающим переезды на паромах. Применяется только к моторизованным режимам движения. |
avoidIndoor | Необязательный. Указывает, следует ли избегать навигации внутри помещения, где это возможно. Предпочтение будет отдано маршрутам, не содержащим внутренней навигации. Применяется только к режиму движения |
Политика разгрузки
Правила разгрузки транспортного средства. Применяется только к отправлениям, имеющим как самовывоз, так и доставку.
Другие перевозки могут осуществляться в любом месте маршрута независимо от unloadingPolicy
.
Перечисления | |
---|---|
UNLOADING_POLICY_UNSPECIFIED | Неопределенная политика разгрузки; поставки должны происходить сразу после их соответствующего получения. |
LAST_IN_FIRST_OUT | Доставка должна осуществляться в порядке, обратном получению. |
FIRST_IN_FIRST_OUT | Доставка должна осуществляться в том же порядке, что и самовывоз. |
Ограничение нагрузки
Определяет предельную нагрузку, применимую к транспортному средству, например: «Этот грузовик может перевозить не более 3500 кг». См. loadLimits
.
JSON-представление |
---|
{ "softMaxLoad": string, "costPerUnitAboveSoftMax": number, "startLoadInterval": { object ( |
Поля | |
---|---|
softMaxLoad | Мягкое ограничение нагрузки. См. |
costPerUnitAboveSoftMax | Если нагрузка когда-либо превышает |
startLoadInterval | Допустимый интервал загрузки автомобиля в начале маршрута. |
endLoadInterval | Допустимый интервал загрузки автомобиля в конце маршрута. |
maxLoad | Максимально допустимый объем нагрузки. |
costPerKilometer | Стоимость перемещения одной единицы груза на километр для данного автомобиля. Это можно использовать в качестве показателя расхода топлива: если нагрузка представляет собой вес (в Ньютонах), то нагрузка*километр имеет размерность энергии. |
costPerTraveledHour | Стоимость проезда с единицей груза в течение часа для данного транспортного средства. |
Интервал
Интервал допустимых объемов нагрузки.
JSON-представление |
---|
{ "min": string, "max": string } |
Поля | |
---|---|
min | Минимально допустимая нагрузка. Должно быть ≥ 0. Если указаны оба значения, |
max | Максимально допустимая нагрузка. Должно быть ≥ 0. Если не указано, максимальная нагрузка не ограничивается этим сообщением. Если они оба указаны, |
Лоадкост
Стоимость перемещения одной единицы груза во время Transition
. Для данной нагрузки стоимость представляет собой сумму двух частей:
- min(load,
loadThreshold
) *costPerUnitBelowThreshold
- max(0, load -
loadThreshold
) *costPerUnitAboveThreshold
При такой стоимости решения предпочитают сначала удовлетворять высокие требования или, что то же самое, удовлетворять высокие требования в последнюю очередь. Например, если автомобиль имеет
load_limit {
key: "weight"
value {
costPerKilometer {
loadThreshold: 15
costPerUnitBelowThreshold: 2.0
costPerUnitAboveThreshold: 10.0
}
}
}
и его маршрут — начало, пикап, пикап, доставка, доставка, конец с переходами:
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
тогда стоимость, понесенная этой LoadCost
, равна (стоимость_ниже * нагрузка_ниже * километры + стоимость_выше * нагрузка_выше * км)
- переход 0:0,0
- переход 1: 2,0*10*1,0 + 10,0*0*1,0 = 20,0
- переход 2: 2,0*15*1,0+10,0*(20 - 15)*1,0 = 80,0
- переход 3: 2,0*10*1,0 + 10,0*0*1,0 = 20,0
- переход 4: 0,0
Таким образом, LoadCost
по маршруту составляет 120,0.
Однако, если маршрут начинается,самовывоз,доставка,самовывоз,доставка,конец с переходами:
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
тогда стоимость, понесенная этим LoadCost
равна
- переход 0:0,0
- переход 1: 2,0*10*1,0 + 10,0*0*1,0 = 20,0
- переход 2: 0,0
- переход 3: 2,0*10*1,0 + 10,0*0*1,0 = 20,0
- переход 4: 0,0
Здесь LoadCost
по маршруту равен 40,0.
LoadCost
делает решения с тяжелыми переходами более дорогими.
JSON-представление |
---|
{ "loadThreshold": string, "costPerUnitBelowThreshold": number, "costPerUnitAboveThreshold": number } |
Поля | |
---|---|
loadThreshold | Величина нагрузки, выше которой стоимость перемещения единицы нагрузки изменяется с CostPerUnitBelowThreshold на CostPerUnitAboveThreshold. Должно быть >= 0. |
costPerUnitBelowThreshold | Стоимость перемещения единицы груза для каждой единицы между 0 и порогом. Должно быть конечное значение и >= 0. |
costPerUnitAboveThreshold | Стоимость перемещения единицы груза за каждую единицу сверх порогового значения. В особом случае порог = 0 — это фиксированная стоимость за единицу. Должно быть конечное значение и >= 0. |
Ограничение продолжительности
Лимит, определяющий максимальную продолжительность маршрута транспортного средства. Он может быть как твердым, так и мягким.
При определении поля мягкого ограничения и порог мягкого максимума, и связанная с ним стоимость должны быть определены вместе.
JSON-представление |
---|
{ "maxDuration": string, "softMaxDuration": string, "quadraticSoftMaxDuration": string, "costPerHourAfterSoftMax": number, "costPerSquareHourAfterQuadraticSoftMax": number } |
Поля | |
---|---|
maxDuration | Жесткий предел, ограничивающий длительность не более maxDuration. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
softMaxDuration | Мягкое ограничение не устанавливает максимальную продолжительность, но при его нарушении маршрут влечет за собой затраты. Эта стоимость суммируется с другими затратами, определенными в модели, в той же единице измерения. Если определено, Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
quadraticSoftMaxDuration | Мягкое ограничение не обеспечивает соблюдения максимального ограничения продолжительности, но при его нарушении маршрут влечет за собой затраты, квадратичные по продолжительности. Эта стоимость суммируется с другими затратами, определенными в модели, в той же единице измерения. Если определено, Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
costPerHourAfterSoftMax | Стоимость часа, понесенная в случае нарушения порога
Стоимость должна быть неотрицательной. |
costPerSquareHourAfterQuadraticSoftMax | Стоимость квадратного часа, возникающая в случае нарушения Дополнительная стоимость равна 0, если продолжительность ниже порогового значения, в противном случае стоимость зависит от продолжительности следующим образом:
Стоимость должна быть неотрицательной. |
Предел расстояния
Предел, определяющий максимальное расстояние, которое можно преодолеть. Он может быть как твердым, так и мягким.
Если определен мягкий предел, как softMaxMeters
, так и costPerKilometerAboveSoftMax
должны быть определены и быть неотрицательными.
JSON-представление |
---|
{ "maxMeters": string, "softMaxMeters": string, "costPerKilometerBelowSoftMax": number, "costPerKilometerAboveSoftMax": number } |
Поля | |
---|---|
maxMeters | Жесткий предел, ограничивающий расстояние не более maxMeters. Предел должен быть неотрицательным. |
softMaxMeters | Мягкое ограничение не обеспечивает соблюдение ограничения максимального расстояния, но его нарушение приводит к затратам, которые суммируются с другими затратами, определенными в модели, в той же единице измерения. Если определено, softMaxMeters должно быть меньше maxMeters и должно быть неотрицательным. |
costPerKilometerBelowSoftMax | Стоимость понесенного километража увеличивается до
Эта стоимость не поддерживается в |
costPerKilometerAboveSoftMax | Стоимость за километр, если расстояние превышает предел
Стоимость должна быть неотрицательной. |
BreakRule
Правила создания временных перерывов для транспортного средства (например, перерывы на обед). Перерыв — это непрерывный период времени, в течение которого транспортное средство простаивает на своем текущем месте и не может совершить ни одного визита. Обрыв может произойти:
- во время путешествия между двумя посещениями (включая время непосредственно перед или сразу после посещения, но не в середине посещения), и в этом случае продлевается соответствующее транзитное время между посещениями,
- или перед запуском автомобиля (автомобиль может не завестись в середине перерыва), в этом случае это не влияет на время запуска автомобиля.
- или после окончания транспортного средства (то же самое, со временем окончания транспортного средства).
JSON-представление |
---|
{ "breakRequests": [ { object ( |
Поля | |
---|---|
breakRequests[] | Последовательность перерывов. См. сообщение |
frequencyConstraints[] | Могут применяться несколько |
Запрос на перерыв
Последовательность перерывов (т.е. их количество и порядок), применимых к каждому транспортному средству, должна быть известна заранее. Повторяющиеся BreakRequest
определяют эту последовательность в том порядке, в котором они должны происходить. Их временные окна ( earliestStartTime
/ latestStartTime
) могут перекрываться, но они должны быть совместимы с порядком (это отмечено).
JSON-представление |
---|
{ "earliestStartTime": string, "latestStartTime": string, "minDuration": string } |
Поля | |
---|---|
earliestStartTime | Необходимый. Нижняя граница (включительно) на начало перерыва. Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
latestStartTime | Необходимый. Верхняя граница (включительно) на начало перерыва. Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
minDuration | Необходимый. Минимальная продолжительность перерыва. Должно быть позитивным. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
Частотное ограничение
Можно дополнительно ограничить частоту и продолжительность перерывов, указанных выше, установив минимальную частоту перерывов, например: «Перерыв должен быть не менее 1 часа каждые 12 часов». Если предположить, что это можно интерпретировать как «В пределах любого скользящего временного окна продолжительностью 12 часов должен быть хотя бы один перерыв продолжительностью не менее одного часа», этот пример будет преобразован в следующее FrequencyConstraint
:
{
minBreakDuration { seconds: 3600 } # 1 hour.
maxInterBreakDuration { seconds: 39600 } # 11 hours (12 - 1 = 11).
}
Время и продолжительность перерывов в решении будут учитывать все подобные ограничения в дополнение к временным окнам и минимальной длительности, уже указанным в BreakRequest
.
FrequencyConstraint
на практике может применяться к непоследовательным перерывам. Например, следующий график учитывает пример «1 час каждые 12 часов»:
04:00 vehicle start
.. performing travel and visits ..
09:00 1 hour break
10:00 end of the break
.. performing travel and visits ..
12:00 20-min lunch break
12:20 end of the break
.. performing travel and visits ..
21:00 1 hour break
22:00 end of the break
.. performing travel and visits ..
23:59 vehicle end
JSON-представление |
---|
{ "minBreakDuration": string, "maxInterBreakDuration": string } |
Поля | |
---|---|
minBreakDuration | Необходимый. Минимальная продолжительность перерыва для этого ограничения. Неотрицательный. См. описание Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
maxInterBreakDuration | Необходимый. Максимально допустимый интервал любого интервала времени в маршруте, который не включает хотя бы частично перерыв Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
ПродолжительностьDistanceMatrix
Определяет матрицу длительности и расстояний от мест посещения и начала транспортного средства до мест посещения и конечного местоположения транспортного средства.
JSON-представление |
---|
{
"rows": [
{
object ( |
Поля | |
---|---|
rows[] | Указывает строки матрицы длительности и расстояния. Он должен иметь столько же элементов, сколько |
vehicleStartTag | Тег, определяющий, к каким транспортным средствам применяется эта матрица продолжительности и расстояния. Если пусто, это относится ко всем транспортным средствам, и матрица может быть только одна. Каждое начало транспортного средства должно соответствовать ровно одной матрице, т. е. ровно одно из полей Все матрицы должны иметь разные значения |
Ряд
Указывает строку матрицы длительности и расстояния.
JSON-представление |
---|
{ "durations": [ string ], "meters": [ number ] } |
Поля | |
---|---|
durations[] | Значения длительности для данной строки. Он должен содержать столько элементов, сколько Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
meters[] | Значения расстояния для данной строки. Если никакие затраты или ограничения не относятся к расстояниям в модели, это поле можно оставить пустым; в противном случае он должен иметь столько же элементов, сколько и |
Атрибуты перехода
Указывает атрибуты переходов между двумя последовательными посещениями маршрута. Несколько TransitionAttributes
могут применяться к одному и тому же переходу: в этом случае все дополнительные затраты суммируются и применяется самое строгое ограничение или предел (следуя естественной семантике «И»).
JSON-представление |
---|
{
"srcTag": string,
"excludedSrcTag": string,
"dstTag": string,
"excludedDstTag": string,
"cost": number,
"costPerKilometer": number,
"distanceLimit": {
object ( |
Поля | |
---|---|
srcTag | Теги, определяющие набор переходов (src->dst), к которым применяются эти атрибуты. Исходное посещение или запуск транспортного средства соответствует, если его |
excludedSrcTag | См |
dstTag | Посещение пункта назначения или конец транспортного средства совпадают, если его |
excludedDstTag | См |
cost | Указывает стоимость выполнения этого перехода. Это те же единицы, что и все остальные затраты в модели, и они не должны быть отрицательными. Он применяется поверх всех других существующих затрат. |
costPerKilometer | Указывает стоимость за километр, применяемую к пройденному расстоянию при выполнении этого перехода. В сумме он равен любому значению |
distanceLimit | Определяет ограничение на расстояние, пройденное при выполнении этого перехода. Начиная с 2021/06 года поддерживаются только мягкие ограничения. |
delay | Указывает задержку, возникшую при выполнении этого перехода. Эта задержка всегда возникает после завершения посещения источника и перед началом посещения пункта назначения. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
Тип отгрузкиНесовместимость
Указывает несовместимости между отгрузками в зависимости от их типа отгрузки. Появление несовместимых отправлений на одном маршруте ограничено в зависимости от режима несовместимости.
JSON-представление |
---|
{
"types": [
string
],
"incompatibilityMode": enum ( |
Поля | |
---|---|
types[] | Список несовместимых типов. Два отправления, имеющие разные |
incompatibilityMode | Режим применен к несовместимости. |
Режим несовместимости
Режимы, определяющие, как ограничивается появление несовместимых отправлений на одном маршруте.
Перечисления | |
---|---|
INCOMPATIBILITY_MODE_UNSPECIFIED | Неуказанный режим несовместимости. Это значение никогда не следует использовать. |
NOT_PERFORMED_BY_SAME_VEHICLE | В этом режиме два груза несовместимого типа никогда не смогут использовать одно и то же транспортное средство. |
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY | Для двух отправлений несовместимого типа с режимом несовместимости
|
Тип отгрузкиТребование
Определяет требования между отгрузками на основе их типа отгрузки. Специфика требования определяется режимом требования.
JSON-представление |
---|
{
"requiredShipmentTypeAlternatives": [
string
],
"dependentShipmentTypes": [
string
],
"requirementMode": enum ( |
Поля | |
---|---|
requiredShipmentTypeAlternatives[] | Список альтернативных типов доставки, |
dependentShipmentTypes[] | Для всех отправлений, тип которых указан в ПРИМЕЧАНИЕ. Цепочки требований, в которых тип |
requirementMode | Режим, примененный к требованию. |
Режим Требования
Режимы, определяющие появление зависимых отправок на маршруте.
Перечисления | |
---|---|
REQUIREMENT_MODE_UNSPECIFIED | Неопределенный режим требований. Это значение никогда не следует использовать. |
PERFORMED_BY_SAME_VEHICLE | В этом режиме все «зависимые» отправления должны использовать одно и то же транспортное средство, как минимум одно из «обязательных» отправлений. |
IN_SAME_VEHICLE_AT_PICKUP_TIME | В режиме Таким образом, «зависимый» пункт самовывоза должен иметь либо:
|
IN_SAME_VEHICLE_AT_DELIVERY_TIME | То же, что и раньше, за исключением того, что «зависимые» поставки должны иметь «обязательный» груз на своем транспортном средстве во время их доставки . |
Правило приоритета
Правило приоритета между двумя событиями (каждое событие — это получение или доставка груза): «второе» событие должно начаться по крайней мере offsetDuration
после начала «первого».
Несколько приоритетов могут относиться к одним и тем же (или связанным) событиям, например, «получение B происходит после доставки A» и «получение C происходит после получения B».
Кроме того, приоритеты применяются только в том случае, если выполняются обе поставки, в противном случае они игнорируются.
JSON-представление |
---|
{ "firstIsDelivery": boolean, "secondIsDelivery": boolean, "offsetDuration": string, "firstIndex": integer, "secondIndex": integer } |
Поля | |
---|---|
firstIsDelivery | Указывает, является ли «первым» событием доставкой. |
secondIsDelivery | Указывает, является ли «второе» событие доставкой. |
offsetDuration | Смещение между «первым» и «вторым» событием. Оно может быть отрицательным. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
firstIndex | Индекс отгрузки «первого» события. Это поле необходимо указать. |
secondIndex | Индекс отгрузки «второго» события. Это поле необходимо указать. |