ShipmentModel

Модель доставки содержит набор поставок, которые должны быть выполнены набором транспортных средств, при этом минимизируется общая стоимость, которая представляет собой сумму:

  • стоимость маршрутизации транспортных средств (сумма стоимости за общее время, стоимости за время в пути и фиксированной стоимости для всех транспортных средств).
  • штрафы за невыполненную отгрузку.
  • стоимость доставки за весь период;
JSON-представление
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "objectives": [
    {
      object (Objective)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
Поля
shipments[]

object (Shipment)

Набор отправлений, которые должны быть выполнены в модели.

vehicles[]

object (Vehicle)

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

objectives[]

object (Objective)

Набор целей для этой модели, которые будут преобразованы в расходы. Если значение не пустое, входная модель должна быть бесплатной. Чтобы получить измененный запрос, используйте solvingMode = TRANSFORM_AND_RETURN_REQUEST. Обратите внимание, что в этом случае запрос не будет решен. Ознакомьтесь с соответствующей документацией.

Экспериментальная функция. Подробнее: https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

globalStartTime

string (Timestamp format)

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

Временной диапазон модели должен быть меньше года, то есть разница между globalEndTime и globalStartTime должна быть не более 31 536 000 секунд.

При использовании полей cost_per_*hour вы можете уменьшить этот интервал, чтобы повысить эффективность (например, если вы моделируете один день, то можете установить глобальные ограничения по времени для этого дня). Если значение не задано, по умолчанию используется 00:00:00 UTC, 1 января 1970 г. (т. е. seconds: 0, nanos: 0).

Используется формат RFC 3339. Результат всегда будет Z-нормализованным, и в нем будут использоваться цифры дробных частей 0, 3, 6 или 9. Допустимы и другие типы нормализации. Примеры: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" или "2014-10-02T15:01:23+05:30".

globalEndTime

string (Timestamp format)

Если значение не задано, по умолчанию используется 00:00:00 UTC, 1 января 1971 г. (т. е. seconds: 31536000, nanos: 0).

Используется формат RFC 3339. Результат всегда будет Z-нормализованным, и в нем будут использоваться цифры дробных частей 0, 3, 6 или 9. Допустимы и другие типы нормализации. Примеры: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" или "2014-10-02T15:01:23+05:30".

globalDurationCostPerHour

number

"Общая продолжительность" плана – это разница между самым ранним временем начала и самым поздним временем окончания для всех транспортных средств. Пользователи могут назначить стоимость за час для этого количества, чтобы попытаться оптимизировать, например, для скорейшего завершения работы. Единицы измерения должны совпадать с теми, которые используются в файле Shipment.penalty_cost.

durationDistanceMatrices[]

object (DurationDistanceMatrix)

Указывает матрицы длительности и расстояния, используемые в модели. Если это поле пустое, то вместо него будут использоваться расстояния, рассчитанные с помощью Google Карт или геодезических методов, в зависимости от значения поля useGeodesicDistances. Если оно не пустое, то useGeodesicDistances не может быть true, а durationDistanceMatrixSrcTags и durationDistanceMatrixDstTags не могут быть пустыми.

Примеры использования

  • Есть два местоположения: locA и locB.
  • 1 транспортное средство, которое начинает и заканчивает маршрут в точке locA.
  • 1 запрос на посещение для самовывоза в locB.
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Есть три местоположения: locA, locB и locC.
  • 1 транспортное средство, начинающее свой маршрут в locA и заканчивающее его в locB, используя матрицу "fast".
  • 1 транспортное средство, начинающее свой маршрут в locB и заканчивающее его в locB, используя матрицу "медленно".
  • 1 транспортное средство, начинающее свой маршрут в locB и заканчивающее его в locB, используя матрицу "fast".
  • 1 запрос на посещение для самовывоза в locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

Теги, определяющие источники матриц длительности и расстояния. durationDistanceMatrices(i).rows(j) определяет длительность и расстояние от посещений с тегом durationDistanceMatrixSrcTags(j) до других посещений в матрице i.

Теги соответствуют VisitRequest.tags или Vehicle.start_tags. Указанный VisitRequest или Vehicle должен точно соответствовать одному тегу в этом поле. Обратите внимание, что теги источника, назначения и матрицы в Vehicle могут быть одинаковыми. Аналогично, теги источника и назначения в VisitRequest могут быть одинаковыми. Все теги должны быть разными и не могут быть пустыми строками. Если это поле не пустое, то поле durationDistanceMatrices также не должно быть пустым.

durationDistanceMatrixDstTags[]

string

Теги, определяющие пункты назначения матриц продолжительности и расстояния; durationDistanceMatrices(i).rows(j).durations(k) (соответственно, durationDistanceMatrices(i).rows(j).meters(k)) определяет продолжительность (или расстояние) поездки от посещений с тегом durationDistanceMatrixSrcTags(j) до посещений с тегом durationDistanceMatrixDstTags(k) в матрице i.

Теги соответствуют VisitRequest.tags или Vehicle.start_tags. Указанный VisitRequest или Vehicle должен точно соответствовать одному тегу в этом поле. Обратите внимание, что теги источника, назначения и матрицы в Vehicle могут быть одинаковыми. Аналогично, теги источника и назначения в VisitRequest могут быть одинаковыми. Все теги должны быть разными и не могут быть пустыми строками. Если это поле не пустое, то поле durationDistanceMatrices также не должно быть пустым.

transitionAttributes[]

object (TransitionAttributes)

В модель добавлены атрибуты перехода.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Наборы несовместимых shipment_types (см. ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Наборы требований shipmentType (см. ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

Набор правил приоритета, которые должны применяться в модели.

ВАЖНО! Использование правил приоритета ограничивает размер задачи, которую можно оптимизировать. Запросы, в которых используются правила приоритета, включающие много отправлений, могут быть отклонены.

maxActiveVehicles

integer

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

Доставка

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

JSON-представление
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
Поля
displayName

string

Отображаемое название отправления, заданное пользователем. Длина названия не должна превышать 63 символа. Можно использовать символы UTF-8.

pickups[]

object (VisitRequest)

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

deliveries[]

object (VisitRequest)

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

loadDemands

map (key: string, value: object (Load))

Требования к загрузке груза (например, вес, объем, количество поддонов и т. д.). Ключи в карте должны быть идентификаторами, описывающими тип соответствующей нагрузки, в идеале также включая единицы измерения. Например: "weight_kg", "volume_gallons", "pallet_count" и т. д. Если заданный ключ не появляется на карте, соответствующая нагрузка считается нулевой.

allowedVehicleIndices[]

integer

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

costsPerVehicle[]

number

Указывает стоимость, которая возникает, когда эта поставка доставляется каждым транспортным средством. Если он указан, то должен содержать ОДНО ИЗ СЛЕДУЮЩИХ ЗНАЧЕНИЙ:

  • столько же элементов, сколько и costsPerVehicleIndices. costsPerVehicle[i] соответствует транспортному средству costsPerVehicleIndices[i] модели.
  • столько же элементов, сколько транспортных средств в модели. i-й элемент соответствует транспортному средству #i модели.

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

costsPerVehicleIndices[]

integer

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

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

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

Например, пусть t – это кратчайшее время, необходимое для перехода от выбранной альтернативы получения непосредственно к выбранной альтернативе доставки. Тогда параметр pickupToDeliveryAbsoluteDetourLimit будет принудительно применять следующие настройки:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

Если для одной и той же отправки указаны и относительные, и абсолютные ограничения, для каждой возможной пары "забор/доставка" используется более строгое ограничение. По состоянию на октябрь 2017 г. объезды поддерживаются, только если продолжительность поездки не зависит от транспортных средств.

pickupToDeliveryTimeLimit

string (Duration format)

Указывает максимальную продолжительность от начала самовывоза до начала доставки отправления. Если указано, оно должно быть неотрицательным, а отправка должна содержать как минимум самовывоз и доставку. Это не зависит от того, какие альтернативы выбраны для получения и доставки, а также от скорости транспортного средства. Это ограничение можно использовать вместе с ограничением на максимальное отклонение от маршрута. В решении будут учтены оба ограничения.

shipmentType

string

Непустая строка, указывающая тип отправления. С помощью этой функции можно задавать несовместимости или требования между shipment_types (см. shipmentTypeIncompatibilities и shipmentTypeRequirements в ShipmentModel).

Отличается от visitTypes, которое указывается для одного посещения: у всех пунктов самовывоза/доставки, относящихся к одной и той же отправке, одинаковое значение shipmentType.

label

string

Указывает ярлык для этой отправки. Этот ярлык указывается в ответе в поле shipmentLabel соответствующего объекта ShipmentRoute.Visit.

ignore

boolean

Если true, пропустить эту доставку, но не применять penaltyCost.

Если в модели есть shipmentTypeRequirements, игнорирование отправки приведет к ошибке проверки.

Игнорирование доставки, выполняемой в injectedFirstSolutionRoutes или injectedSolutionConstraint, разрешено. Решатель удаляет связанные посещения для получения/доставки из выполняемого маршрута. precedenceRules, которые ссылаются на игнорируемые отправления, также будут игнорироваться.

penaltyCost

number

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

ВАЖНО! Если штраф не указан, он считается бесконечным, то есть доставка должна быть выполнена.

pickupToDeliveryRelativeDetourLimit

number

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

Например, пусть t – это кратчайшее время, необходимое для перехода от выбранной альтернативы получения непосредственно к выбранной альтернативе доставки. Тогда параметр pickupToDeliveryRelativeDetourLimit будет принудительно применять следующие настройки:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

Если для одной и той же отправки указаны и относительные, и абсолютные ограничения, для каждой возможной пары "забор/доставка" используется более строгое ограничение. По состоянию на октябрь 2017 г. объезды поддерживаются, только если продолжительность поездки не зависит от транспортных средств.

VisitRequest

Запрос на посещение, которое может быть выполнено транспортным средством. У него есть одно или два местоположения (см. ниже), время открытия и закрытия, представленное временными окнами, и продолжительность обслуживания (время, которое транспортное средство проводит на месте после прибытия для погрузки или разгрузки товаров).

JSON-представление
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string,
  "avoidUTurns": boolean
}
Поля
arrivalLocation

object (LatLng)

Географическое местоположение, куда прибывает транспортное средство при выполнении этого действия (VisitRequest). Если в модели доставки есть матрицы расстояний по времени, то arrivalLocation указывать не нужно.

arrivalWaypoint

object (Waypoint)

Путевая точка, в которую прибывает транспортное средство при выполнении этого VisitRequest. Если в модели доставки есть матрицы расстояний по времени, то arrivalWaypoint указывать не нужно.

departureLocation

object (LatLng)

Географическое местоположение, из которого транспортное средство отправляется после завершения этого VisitRequest. Если оно совпадает со значением свойства arrivalLocation, его можно не указывать. Если в модели доставки есть матрицы расстояний, departureLocation указывать не нужно.

departureWaypoint

object (Waypoint)

Путевая точка, от которой транспортное средство отправляется после завершения этого VisitRequest. Если оно совпадает со значением свойства arrivalWaypoint, его можно не указывать. Если в модели доставки есть матрицы расстояний по времени, то departureWaypoint указывать не нужно.

tags[]

string

Указывает теги, прикрепленные к запросу на посещение. Пустые или повторяющиеся строки не допускаются.

timeWindows[]

object (TimeWindow)

Временные окна, ограничивающие время прибытия в пункт посещения. Обратите внимание, что транспортное средство может уехать за пределами окна времени прибытия, то есть время прибытия + продолжительность не обязательно должны находиться в пределах окна времени. Если транспортное средство прибудет раньше TimeWindow.start_time, может возникнуть время ожидания.

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

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

Поля costPerHourAfterSoftEndTime и softEndTime можно задать, только если указан один временной интервал.

duration

string (Duration format)

Продолжительность посещения, то есть время, проведенное транспортным средством между прибытием и отправлением (добавляется к возможному времени ожидания; см. timeWindows).

cost

number

Стоимость обслуживания этого запроса на посещение на маршруте транспортного средства. Это позволяет задавать разные цены для разных вариантов самовывоза или доставки. Единица измерения должна совпадать с единицей измерения Shipment.penalty_cost. Значение не может быть отрицательным.

loadDemands

map (key: string, value: object (Load))

Загрузить требования этого запроса на посещение. Это поле аналогично полю Shipment.load_demands, но применяется только к этому объекту VisitRequest, а не ко всему объекту Shipment. Требования, перечисленные здесь, добавляются к требованиям, перечисленным в Shipment.load_demands.

visitTypes[]

string

Указывает типы посещения. Это значение может использоваться для выделения дополнительного времени, необходимого транспортному средству для завершения посещения (см. Vehicle.extra_visit_duration_for_visit_type).

Каждый тип может быть указан только один раз.

label

string

Указывает ярлык для этого VisitRequest. Этот ярлык возвращается в ответе как visitLabel в соответствующем ShipmentRoute.Visit.

avoidUTurns

boolean

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

Экспериментальная функция. Подробнее: https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

LatLng

Объект, содержащий географические координаты в виде значений широты и долготы. Это выражается в виде пары значений с плавающей запятой (double), представляющих градусы широты и градусы долготы. Если не указано иное, координаты задаются в системе WGS84. Также они должны попадать в нормализованные диапазоны значений.

JSON-представление
{
  "latitude": number,
  "longitude": number
}
Поля
latitude

number

Градусная мера широты. Должна попадать в диапазон [-90.0, +90.0].

longitude

number

Градусная мера долготы. Должна попадать в диапазон [-180,0, +180,0].

Путевая точка

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

JSON-представление
{
  "sideOfRoad": boolean,
  "vehicleStopover": boolean,

  // The following is a list of mutually exclusive fields. At most one of the
  // fields will be set in a response:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of mutually exclusive fields.
}
Поля
sideOfRoad

boolean

Необязательное поле. Указывает, что местоположение этой путевой точки должно иметь предпочтение для остановки транспортного средства на определенной стороне дороги. Если вы зададите это значение, маршрут будет проходить через местоположение, чтобы транспортное средство могло остановиться на той стороне дороги, к которой смещено местоположение относительно центра дороги. Этот вариант не работает для режима путешествия "ПЕШКОМ".

vehicleStopover

boolean

Указывает, что путевая точка предназначена для остановки транспортных средств с целью посадки или высадки пассажиров. Этот параметр работает только для режима путешествия DRIVING и когда для параметра locationType задано значение location.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

Различные способы представления местоположения. Ниже приведен список взаимоисключающих полей. В ответе будет задано не более одного из следующих полей:
location

object (Location)

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

placeId

string

Идентификатор места POI, связанный с путевой точкой.

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

Конец взаимоисключающих полей.

Местоположение

Инкапсулирует местоположение (географическую точку и необязательный заголовок).

JSON-представление
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
Поля
latLng

object (LatLng)

Географические координаты путевой точки.

heading

integer

Направление движения транспорта по компасу. Это значение используется, чтобы указать сторону дороги, на которой нужно забрать или высадить пассажира. Значения направления могут быть от 0 до 360, где 0 – это север, 90 – восток и т. д.

TimeWindow

Временные окна ограничивают время события, например время прибытия в пункт посещения или время начала и окончания работы транспортного средства.

Строгие границы временного окна, 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

string (Timestamp format)

Время начала жесткого временного окна. Если значение не указано, будет задано ShipmentModel.global_start_time.

Используется формат RFC 3339. Результат всегда будет Z-нормализованным, и в нем будут использоваться цифры дробных частей 0, 3, 6 или 9. Допустимы и другие типы нормализации. Примеры: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" или "2014-10-02T15:01:23+05:30".

endTime

string (Timestamp format)

Время окончания жесткого временного окна. Если значение не указано, будет установлено ShipmentModel.global_end_time.

Используется формат RFC 3339. Результат всегда будет Z-нормализованным, и в нем будут использоваться цифры дробных частей 0, 3, 6 или 9. Допустимы и другие типы нормализации. Примеры: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" или "2014-10-02T15:01:23+05:30".

softStartTime

string (Timestamp format)

Время начала временного окна.

Используется формат RFC 3339. Результат всегда будет Z-нормализованным, и в нем будут использоваться цифры дробных частей 0, 3, 6 или 9. Допустимы и другие типы нормализации. Примеры: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" или "2014-10-02T15:01:23+05:30".

softEndTime

string (Timestamp format)

Мягкое время окончания временного окна.

Используется формат RFC 3339. Результат всегда будет Z-нормализованным, и в нем будут использоваться цифры дробных частей 0, 3, 6 или 9. Допустимы и другие типы нормализации. Примеры: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" или "2014-10-02T15:01:23+05:30".

costPerHourBeforeSoftStartTime

number

Стоимость за час, которая добавляется к другим расходам в модели, если событие происходит до softStartTime. Рассчитывается следующим образом:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

Значение должно быть положительным. Поле можно заполнить, только если задано значение softStartTime.

costPerHourAfterSoftEndTime

number

Цена за час, которая добавляется к другим расходам в модели, если событие происходит после softEndTime. Рассчитывается следующим образом:

   max(0, t.seconds - softEndTime.seconds)
                    * costPerHourAfterSoftEndTime / 3600,
t being the time of the event.

Значение должно быть положительным. Поле можно заполнить, только если задано значение softEndTime.

Транспортное средство

Моделирует транспортное средство в задаче доставки. При решении задачи доставки для этого транспортного средства будет построен маршрут, начинающийся в точке startLocation и заканчивающийся в точке endLocation. Маршрут – это последовательность посещений (см. ShipmentRoute).

JSON-представление
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Поля
displayName

string

Отображаемое название транспортного средства, заданное пользователем. Длина названия не должна превышать 63 символа. Можно использовать символы UTF-8.

travelMode

enum (TravelMode)

Способ передвижения, от которого зависит, по каким дорогам может ехать транспортное средство и с какой скоростью. См. также travelDurationMultiple.

routeModifiers

object (RouteModifiers)

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

startLocation

object (LatLng)

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

startWaypoint

object (Waypoint)

Путевая точка, представляющая географическое местоположение, в котором транспортное средство начинает движение до того, как заберет груз. Если не указаны ни startWaypoint, ни startLocation, транспортное средство начинает движение с первого места посадки. Если в модели доставки есть матрицы длительности и расстояния, то startWaypoint указывать не нужно.

endLocation

object (LatLng)

Географическое местоположение, в котором транспортное средство заканчивает последний рейс VisitRequest. Если значение не указано, ShipmentRoute транспортного средства завершается сразу после выполнения последнего VisitRequest. Если в модели доставки есть матрицы длительности и расстояния, то endLocation указывать не нужно.

endWaypoint

object (Waypoint)

Путевая точка, представляющая географическое местоположение, в котором транспортное средство останавливается после завершения последней задачи VisitRequest. Если не указано ни endWaypoint, ни endLocation, ShipmentRoute транспортного средства завершается сразу после выполнения последнего VisitRequest. Если в модели доставки есть матрицы длительности и расстояния, то endWaypoint указывать не нужно.

startTags[]

string

Указывает теги, прикрепленные к началу маршрута транспортного средства.

Пустые или повторяющиеся строки не допускаются.

endTags[]

string

Указывает теги, прикрепленные к концу маршрута транспортного средства.

Пустые или повторяющиеся строки не допускаются.

startTimeWindows[]

object (TimeWindow)

Временные окна, в течение которых транспортное средство может покинуть место старта. Они должны находиться в пределах глобальных временных ограничений (см. поля ShipmentModel.global_*). Если значение не указано, то действуют только глобальные ограничения по времени.

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

Поля costPerHourAfterSoftEndTime и softEndTime можно задать, только если указан один временной интервал.

endTimeWindows[]

object (TimeWindow)

Временные интервалы, в течение которых транспортное средство может прибыть в конечный пункт назначения. Они должны находиться в пределах глобальных временных ограничений (см. поля ShipmentModel.global_*). Если значение не указано, то действуют только глобальные ограничения по времени.

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

Поля costPerHourAfterSoftEndTime и softEndTime можно задать, только если указан один временной интервал.

unloadingPolicy

enum (UnloadingPolicy)

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

loadLimits

map (key: string, value: object (LoadLimit))

Вместимость транспортного средства (например, вес, объем, количество поддонов). Ключи в карте – это идентификаторы типа нагрузки, соответствующие ключам поля Shipment.load_demands. Если в этой карте нет определенного ключа, соответствующая емкость считается неограниченной.

costPerHour

number

Расходы на транспортное средство: все расходы суммируются и должны быть указаны в той же единице измерения, что и Shipment.penalty_cost.

Стоимость часа маршрута транспортного средства. Эта стоимость применяется к общему времени, затраченному на маршрут, и включает время в пути, время ожидания и время посещения. Если вы используете costPerHour вместо costPerTraveledHour, это может привести к дополнительной задержке.

costPerTraveledHour

number

Стоимость часа в пути на маршруте транспортного средства. Эта стоимость применяется только к времени в пути по маршруту (то есть к значению, указанному в поле ShipmentRoute.transitions), и не включает время ожидания и время посещения.

costPerKilometer

number

Стоимость километра маршрута транспортного средства. Эта стоимость применяется к расстоянию, указанному в ShipmentRoute.transitions, и не применяется к расстоянию, которое неявно пройдено от arrivalLocation до departureLocation одного VisitRequest.

fixedCost

number

Фиксированная стоимость, которая применяется, если это транспортное средство используется для доставки отправления.

usedIfRouteIsEmpty

boolean

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

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

В противном случае транспортное средство не будет следовать по маршруту, а для breakRule и задержек (из TransitionAttributes) не будет составлено расписание. В этом случае ShipmentRoute транспортного средства не содержит никакой информации, кроме индекса и ярлыка транспортного средства.

routeDurationLimit

object (DurationLimit)

Ограничение, применяемое к общей продолжительности маршрута транспортного средства. В заданном OptimizeToursResponse продолжительность маршрута транспортного средства – это разница между его vehicleEndTime и vehicleStartTime.

travelDurationLimit

object (DurationLimit)

Ограничение, применяемое к продолжительности поездки по маршруту транспортного средства. В определенном OptimizeToursResponse продолжительность поездки по маршруту – это сумма всех его transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Ограничение, применяемое к общей протяженности маршрута транспортного средства. В заданном объекте OptimizeToursResponse расстояние маршрута – это сумма всех его объектов transitions.travel_distance_meters.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

Указывает сопоставление строк visitTypes с продолжительностью. Продолжительность – это время, которое добавляется к VisitRequest.duration при посещениях с указанным visitTypes. Если указано значение costPerHour, то за дополнительное время посещения взимается плата. Ключи (например, visitTypes) не могут быть пустыми строками.

Если у запроса на посещение несколько типов, на карте будет добавлена продолжительность для каждого типа.

breakRule

object (BreakRule)

Описывает расписание перерывов, которое должно соблюдаться для этого транспортного средства. Если поле пустое, перерывы для этого транспортного средства не планируются.

label

string

Указывает ярлык для этого транспортного средства. Этот ярлык возвращается в ответе как vehicleLabel соответствующего ShipmentRoute.

ignore

boolean

Если задано значение true, то для usedIfRouteIsEmpty должно быть задано значение false, и это транспортное средство не будет использоваться.

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

Если перевозка выполняется игнорируемым транспортным средством в injectedSolutionConstraint и любая связанная с ним посадка/доставка ограничена пребыванием в транспортном средстве (т.е. не ослаблена до уровня RELAX_ALL_AFTER_THRESHOLD), она пропускается в ответе. Если у отправления есть непустое поле allowedVehicleIndices и все разрешенные транспортные средства игнорируются, оно пропускается в ответе.

travelDurationMultiple

number

Указывает мультипликативный коэффициент, который можно использовать для увеличения или уменьшения времени в пути этого транспортного средства. Например, если задать значение 2,0, то время в пути для этого транспортного средства будет в два раза больше, чем для стандартного. Этот коэффициент не влияет на продолжительность посещений. Если указаны costPerHour или costPerTraveledHour, это влияет на стоимость. Значение должно находиться в диапазоне [0,001; 1000,0]. Если значение не задано, транспортное средство считается стандартным, а множитель – равным 1,0.

ВНИМАНИЕ! Время в пути будет округлено до ближайшей секунды после применения этого множителя, но до выполнения любых числовых операций, поэтому небольшой множитель может привести к потере точности.

См. также раздел extraVisitDurationForVisitType ниже.

TravelMode

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

Они должны быть подмножеством способов передвижения Routes API платформы Google Карт. Подробнее: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode.

Примечание. Маршруты для WALKING находятся на этапе бета-тестирования. Иногда на них могут отсутствовать тротуары или пешеходные дорожки. Вы должны показывать это предупреждение пользователю для всех пешеходных маршрутов, которые вы показываете в своем приложении.

Перечисления
TRAVEL_MODE_UNSPECIFIED Способ передвижения не указан, эквивалентно DRIVING.
DRIVING Режим передвижения, соответствующий маршруту (автомобиль и т. д.).
WALKING Способ передвижения, соответствующий пешеходному маршруту.
TWO_WHEELER Двухколесное моторизованное транспортное средство. например мотоцикл. Обратите внимание, что этот режим отличается от режима BICYCLING, который охватывает транспортные средства, приводимые в движение человеком.

RouteModifiers

Инкапсулирует набор необязательных условий, которые должны выполняться при расчете маршрутов транспортных средств. Это похоже на RouteModifiers в Routes Preferred API платформы Google Карт. Подробнее: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

JSON-представление
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
Поля
avoidTolls

boolean

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

avoidHighways

boolean

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

avoidFerries

boolean

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

avoidIndoor

boolean

Необязательное поле. Указывает, следует ли по возможности избегать навигации внутри помещений. Предпочтение будет отдаваться маршрутам без навигации внутри помещений. Применяется только к способу передвижения WALKING.

UnloadingPolicy

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

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

Перечисления
UNLOADING_POLICY_UNSPECIFIED Правила разгрузки не указаны. Доставка должна выполняться после соответствующего забора.
LAST_IN_FIRST_OUT Доставка должна выполняться в порядке, обратном порядку получения.
FIRST_IN_FIRST_OUT Доставка должна выполняться в том же порядке, что и самовывоз.

LoadLimit

Определяет ограничение по весу груза, которое применяется к транспортному средству, например "этот грузовик может перевозить не более 3500 кг". Посмотрите loadLimits.

JSON-представление
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
Поля
softMaxLoad

string (int64 format)

Регулируемое ограничение нагрузки. Посмотрите costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Если нагрузка на маршруте этого транспортного средства превысит softMaxLoad, будет применен следующий штраф (только один раз для каждого транспортного средства): (нагрузка – softMaxLoad) * costPerUnitAboveSoftMax. Все расходы суммируются и должны быть указаны в той же единице измерения, что и Shipment.penalty_cost. Мягкие ограничения можно задавать только для типов, которые применяются либо только к заборам, либо только к доставкам во всей модели.

startLoadInterval

object (Interval)

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

endLoadInterval

object (Interval)

Допустимый интервал загрузки транспортного средства в конце маршрута.

maxLoad

string (int64 format)

Максимально допустимая нагрузка.

costPerKilometer

object (LoadCost)

Стоимость перемещения одной единицы груза на один километр для этого транспортного средства. Это значение можно использовать как показатель расхода топлива: если нагрузка – это вес (в ньютонах), то нагрузка*километр имеет размерность энергии.

Экспериментальная функция. Подробную информацию можно найти на странице https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

costPerTraveledHour

object (LoadCost)

Стоимость перевозки единицы груза в течение одного часа на этом транспортном средстве.

Экспериментальная функция. Подробную информацию можно найти на странице https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Интервал

Интервал допустимых объемов загрузки.

JSON-представление
{
  "min": string,
  "max": string
}
Поля
min

string (int64 format)

Минимально допустимая нагрузка. Значение должно быть больше или равно 0. Если указаны оба, то min должно быть меньше или равно max.

max

string (int64 format)

Максимально допустимая нагрузка. Значение должно быть больше или равно 0. Если значение не указано, максимальная нагрузка не ограничивается этим сообщением. Если указаны оба, то min должно быть меньше или равно max.

LoadCost

Стоимость перемещения одной единицы груза в течение 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, равна (cost_below * load_below * kilometers + cost_above * load_above * kms)

  • переход 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 делает решения с переходами с высокой нагрузкой более дорогими.

Экспериментальная функция. Подробную информацию можно найти на странице https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

JSON-представление
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
Поля
loadThreshold

string (int64 format)

Объем груза, при превышении которого стоимость перемещения единицы груза меняется с costPerUnitBelowThreshold на costPerUnitAboveThreshold. Значение должно быть больше или равно 0.

costPerUnitBelowThreshold

number

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

costPerUnitAboveThreshold

number

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

DurationLimit

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

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

JSON-представление
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
Поля
maxDuration

string (Duration format)

Строгое ограничение, согласно которому продолжительность не может превышать maxDuration.

softMaxDuration

string (Duration format)

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

Если задано свойство softMaxDuration, его значение должно быть неотрицательным. Если также задано свойство maxDuration, то значение softMaxDuration должно быть меньше, чем maxDuration.

quadraticSoftMaxDuration

string (Duration format)

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

Если задано значение quadraticSoftMaxDuration, должны выполняться следующие условия:

  • Значение должно быть неотрицательным.
  • Необходимо указать maxDuration.
  • Значение quadraticSoftMaxDuration должно быть меньше maxDuration.
  • Разница должна быть не больше одного дня: maxDuration - quadraticSoftMaxDuration <= 86400 seconds.
costPerHourAfterSoftMax

number

Стоимость за час, если пороговое значение softMaxDuration превышено. Если продолжительность меньше порогового значения, дополнительная плата не взимается. В противном случае она рассчитывается следующим образом:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Стоимость не может быть отрицательной.

costPerSquareHourAfterQuadraticSoftMax

number

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

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

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Стоимость не может быть отрицательной.

DistanceLimit

Ограничение, определяющее максимальное расстояние, которое можно преодолеть. Она может быть жесткой или мягкой.

Если задано мягкое ограничение, то должны быть определены и softMaxMeters, и costPerKilometerAboveSoftMax, причем оба значения должны быть неотрицательными.

JSON-представление
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
Поля
maxMeters

string (int64 format)

Строгое ограничение, согласно которому расстояние не должно превышать maxMeters. Лимит должен быть неотрицательным.

softMaxMeters

string (int64 format)

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

Если это значение задано, оно должно быть неотрицательным и меньше, чем maxMeters.

costPerKilometerBelowSoftMax

number

Цена за километр, увеличивающаяся до softMaxMeters, рассчитывается по формуле:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Эта цена не поддерживается в routeDistanceLimit.

costPerKilometerAboveSoftMax

number

Цена за километр, если расстояние превышает softMaxMeters. Если расстояние не превышает лимит, дополнительная стоимость равна 0. В противном случае она рассчитывается по следующей формуле:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Стоимость не может быть отрицательной.

BreakRule

Правила создания перерывов для транспортного средства (например, обеденных). Перерыв – это непрерывный период времени, в течение которого транспортное средство остается бездействующим в своем текущем положении и не может выполнять никаких посещений. Разрыв может произойти:

  • во время перемещения между двумя посещениями (включая время непосредственно до или после посещения, но не в середине посещения), и в этом случае он продлевает соответствующее время транспортировки между посещениями;
  • или до начала движения транспортного средства (транспортное средство не может начать движение в середине перерыва), и в этом случае это не влияет на время начала движения транспортного средства.
  • или после окончания поездки (аналогично, с указанием времени окончания поездки).
JSON-представление
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Поля
breakRequests[]

object (BreakRequest)

Последовательность рекламных пауз. Посмотрите сообщение BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Может применяться несколько FrequencyConstraint. Они должны быть выполнены для всех BreakRequest этого BreakRule. Подробнее FrequencyConstraint…

BreakRequest

Последовательность перерывов (их количество и порядок), которые применяются к каждому транспортному средству, должна быть известна заранее. Повторяющиеся элементы BreakRequest определяют эту последовательность в том порядке, в котором они должны происходить. Их временные окна (earliestStartTime/latestStartTime) могут перекрываться, но они должны быть совместимы с заказом (это проверяется).

JSON-представление
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
Поля
earliestStartTime

string (Timestamp format)

Обязательно. Нижняя граница (включительно) начала перерыва.

Используется формат RFC 3339. Результат всегда будет Z-нормализованным, и в нем будут использоваться цифры дробных частей 0, 3, 6 или 9. Допустимы и другие типы нормализации. Примеры: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" или "2014-10-02T15:01:23+05:30".

latestStartTime

string (Timestamp format)

Обязательно. Верхняя граница (включительно) начала перерыва.

Используется формат RFC 3339. Результат всегда будет Z-нормализованным, и в нем будут использоваться цифры дробных частей 0, 3, 6 или 9. Допустимы и другие типы нормализации. Примеры: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" или "2014-10-02T15:01:23+05:30".

minDuration

string (Duration format)

Обязательно. Минимальная длительность рекламной паузы. Значение должно быть положительным.

FrequencyConstraint

Вы можете дополнительно ограничить частоту и продолжительность перерывов, указанных выше, установив минимальную частоту перерывов, например "Каждые 12 часов должен быть перерыв не менее 1 часа". Если это можно интерпретировать как "В течение любого скользящего временного окна продолжительностью 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

string (Duration format)

Обязательно. Минимальная длительность рекламной паузы для этого ограничения. Неотрицательное число. Посмотреть описание комнаты "FrequencyConstraint".

maxInterBreakDuration

string (Duration format)

Обязательно. Максимально допустимая продолжительность любого интервала времени на маршруте, который не включает хотя бы частично перерыв длительностью duration >= minBreakDuration. Значение должно быть положительным.

Цель

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

Экспериментальная функция. Подробнее: https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

JSON-представление
{
  "type": enum (Type),
  "weight": number
}
Поля
type

enum (Type)

Тип цели.

weight

number

Насколько эта цель должна учитываться по сравнению с другими. Это может быть любое неотрицательное число. Сумма весов не обязательно должна быть равна 1. По умолчанию используется значение 1.0.

Тип

Тип цели, который будет сопоставлен с набором расходов.

Перечисления
DEFAULT Чтобы обеспечить приемлемое решение, будет использоваться набор затрат по умолчанию. Примечание.Эту цель можно использовать отдельно, но она также всегда будет добавляться с весом 1, 0 в качестве базовой к целям, указанным пользователем, если она ещё не присутствует.
MIN_DISTANCE "MIN". Минимизировать общее пройденное расстояние.
MIN_WORKING_TIME Минимизируйте общее рабочее время, суммированное по всем транспортным средствам.
MIN_TRAVEL_TIME То же, что и выше, но с акцентом только на время в пути.
MIN_NUM_VEHICLES Минимизировать количество используемых транспортных средств.

DurationDistanceMatrix

Указывает матрицу продолжительности и расстояния от начальных местоположений посещений и транспортных средств до конечных местоположений посещений и транспортных средств.

JSON-представление
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
Поля
rows[]

object (Row)

Определяет строки матрицы продолжительности и расстояния. Количество элементов должно совпадать с количеством элементов в поле ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

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

Каждое начало маршрута должно соответствовать ровно одной матрице, то есть ровно одно поле startTags должно соответствовать полю vehicleStartTag матрицы (и только этой матрицы).

У всех матриц должны быть разные значения vehicleStartTag.

Строка

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

JSON-представление
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
Поля
durations[]

string (Duration format)

Значения продолжительности для заданной строки. Количество элементов должно совпадать с количеством элементов в поле ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

number

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

TransitionAttributes

Задает атрибуты переходов между двумя последовательными посещениями на маршруте. К одному переходу может применяться несколько TransitionAttributes. В этом случае все дополнительные расходы суммируются и применяется самое строгое ограничение или лимит (в соответствии с естественной семантикой "И").

JSON-представление
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
Поля
srcTag

string

Теги, определяющие набор переходов (src->dst), к которым применяются эти атрибуты.

Исходное посещение или начало маршрута транспортного средства совпадает, если его VisitRequest.tags или Vehicle.start_tags содержит srcTag или не содержит excludedSrcTag (в зависимости от того, какое из этих двух полей не пустое).

excludedSrcTag

string

Посмотрите srcTag. Только одно из полей srcTag и excludedSrcTag должно быть заполнено.

dstTag

string

Посещение пункта назначения или окончание маршрута транспортного средства совпадает, если его VisitRequest.tags или Vehicle.end_tags содержит dstTag или не содержит excludedDstTag (в зависимости от того, какое из этих двух полей не пустое).

excludedDstTag

string

Посмотрите dstTag. Только одно из полей dstTag и excludedDstTag должно быть заполнено.

cost

number

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

costPerKilometer

number

Указывает стоимость за километр, применяемую к расстоянию, пройденному при выполнении этого перехода. Она добавляется к любой Vehicle.cost_per_kilometer, указанной для транспортных средств.

distanceLimit

object (DistanceLimit)

Указывает ограничение на расстояние, пройденное при выполнении этого перехода.

По состоянию на июнь 2021 г. поддерживаются только мягкие ограничения.

delay

string (Duration format)

Указывает задержку, возникающую при выполнении этого перехода.

Эта задержка всегда происходит после завершения посещения источника и до начала посещения места назначения.

ShipmentTypeIncompatibility

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

JSON-представление
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
Поля
types[]

string

Список несовместимых типов. Две поставки с разными значениями shipment_types считаются несовместимыми.

incompatibilityMode

enum (IncompatibilityMode)

Режим, примененный к несовместимости.

IncompatibilityMode

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

Перечисления
INCOMPATIBILITY_MODE_UNSPECIFIED Неуказанный режим несовместимости. Это значение не должно использоваться.
NOT_PERFORMED_BY_SAME_VEHICLE В этом режиме две доставки несовместимых типов не могут выполняться одним транспортным средством.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

В этом режиме две доставки несовместимых типов не могут находиться в одном транспортном средстве одновременно.

  • Они могут использовать одно транспортное средство, только если первый заказ будет доставлен до того, как будет забран второй.
  • Если обе перевозки включают только самовывоз (без доставки) или только доставку (без самовывоза), они не могут выполняться одним транспортным средством.

ShipmentTypeRequirement

Указывает требования между отправлениями на основе их shipmentType. Особенности требования определяются режимом требования.

JSON-представление
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
Поля
requiredShipmentTypeAlternatives[]

string

Список альтернативных типов доставки, необходимых для dependentShipmentTypes.

dependentShipmentTypes[]

string

Для всех отправлений с типом в поле dependentShipmentTypes требуется, чтобы на том же маршруте было посещено хотя бы одно отправление типа requiredShipmentTypeAlternatives.

ПРИМЕЧАНИЕ. Цепочки требований, в которых shipmentType зависит от самого себя, не допускаются.

requirementMode

enum (RequirementMode)

Режим, примененный к требованию.

RequirementMode

Режимы, определяющие внешний вид зависимых отправлений на маршруте.

Перечисления
REQUIREMENT_MODE_UNSPECIFIED Режим требования не указан. Это значение не должно использоваться.
PERFORMED_BY_SAME_VEHICLE В этом режиме все "зависимые" отправления должны использовать то же транспортное средство, что и хотя бы одно из их "обязательных" отправлений.
IN_SAME_VEHICLE_AT_PICKUP_TIME

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

Поэтому у зависимого самовывоза должно быть одно из двух:

  • обязательная доставка, которая выполняется после доставки на маршруте;
  • "Обязательное" отправление забирается на маршруте до него, и если у "обязательного" отправления есть доставка, эта доставка должна быть выполнена после получения "зависимого" отправления.
IN_SAME_VEHICLE_AT_DELIVERY_TIME То же, что и в предыдущем случае, но зависимые отправления должны находиться в транспортном средстве вместе с обязательными в момент доставки.

PrecedenceRule

Правило приоритета между двумя событиями (каждое событие – это получение или доставка отправления): "второе" событие должно начаться не ранее чем через offsetDuration после начала "первого".

Несколько приоритетов могут относиться к одним и тем же (или связанным) событиям, например "забор B происходит после доставки A" и "забор C происходит после забора B".

Кроме того, приоритеты применяются, только если выполняются обе перевозки. В противном случае они игнорируются.

JSON-представление
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
Поля
firstIsDelivery

boolean

Указывает, является ли "первое" событие доставкой.

secondIsDelivery

boolean

Указывает, является ли "второе" событие доставкой.

offsetDuration

string (Duration format)

Смещение между первым и вторым событием. Значение может быть отрицательным.

firstIndex

integer

Индекс отправления для первого события. Это поле должно быть заполнено.

secondIndex

integer

Индекс отправления для второго события. Это поле должно быть заполнено.