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 должны находиться в пределах 31536000 секунд друг от друга.

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

Использует RFC 3339, согласно которому сгенерированный вывод всегда будет нормализован по оси Z и содержать 0, 3, 6 или 9 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: "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 г. (т. е. секунды: 31536000, наносекунды: 0).

Использует RFC 3339, согласно которому сгенерированный вывод всегда будет нормализован по оси Z и содержать 0, 3, 6 или 9 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: "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 Maps или геодезические расстояния, в зависимости от значения поля useGeodesicDistances . Если поле не пусто, значение useGeodesicDistances не может быть истинным, а ни durationDistanceMatrixSrcTags , ни durationDistanceMatrixDstTags не могут быть пустыми.

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

  • Существует два местоположения: locA и locB.
  • 1 транспортное средство начинает свой маршрут в locA и заканчивает его в 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, используя матрицу «slow».
  • 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/10 года объезды поддерживаются только в тех случаях, когда продолжительность поездки не зависит от транспортных средств.

Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « s ». Пример: "3.5s" .

pickupToDeliveryTimeLimit

string ( Duration format)

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

Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « s ». Пример: "3.5s" .

shipmentType

string

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

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

label

string

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

ignore

boolean

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

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

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

penaltyCost

number

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

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

pickupToDeliveryRelativeDetourLimit

number

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

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

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

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

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 ).

Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « s ». Пример: "3.5s" .

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 .

Широта и долгота

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

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

number

Широта в градусах. Должна быть в диапазоне [-90,0, +90,0].

longitude

number

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

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

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

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

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
Поля
sideOfRoad

boolean

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

vehicleStopover

boolean

Указывает, что путевая точка предназначена для остановки транспортных средств с целью посадки или высадки пассажиров. Эта опция работает только для режима движения «ВОЖДЕНИЕ» и если для параметра «locationType» задано значение «location».

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

Объединенное поле location_type . Различные способы представления местоположения. location_type может быть только одним из следующих:
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 или позже, влекя за собой затраты, пропорциональные времени, затраченному на то, чтобы событие произошло в момент времени 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 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: "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 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: "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 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: "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 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: "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

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

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

Примечание: WALKING маршруты находятся в стадии бета-тестирования и иногда могут отсутствовать чёткие тротуары или пешеходные дорожки. Это предупреждение необходимо отображать для всех пешеходных маршрутов, отображаемых в приложении.

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

RouteModifiers

Инкапсулирует набор дополнительных условий, которые необходимо учитывать при расчёте маршрутов транспортных средств. Аналогично RouteModifiers в 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 .

Перечисления
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
  • макс(0, нагрузка - 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 * miles + 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

Cost of moving a unit of load, for each unit above threshold. In the special case threshold = 0, this is a fixed cost per unit. Must be a finite value, and >= 0.

DurationLimit

A limit defining a maximum duration of the route of a vehicle. It can be either hard or soft.

When a soft limit field is defined, both the soft max threshold and its associated cost must be defined together.

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

string ( Duration format)

A hard limit constraining the duration to be at most maxDuration.

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

softMaxDuration

string ( Duration format)

A soft limit not enforcing a maximum duration limit, but when violated makes the route incur a cost. This cost adds up to other costs defined in the model, with the same unit.

If defined, softMaxDuration must be nonnegative. If maxDuration is also defined, softMaxDuration must be less than maxDuration.

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

quadraticSoftMaxDuration

string ( Duration format)

A soft limit not enforcing a maximum duration limit, but when violated makes the route incur a cost, quadratic in the duration. This cost adds up to other costs defined in the model, with the same unit.

If defined, quadraticSoftMaxDuration must be nonnegative. If maxDuration is also defined, quadraticSoftMaxDuration must be less than maxDuration , and the difference must be no larger than one day:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

costPerHourAfterSoftMax

number

Cost per hour incurred if the softMaxDuration threshold is violated. The additional cost is 0 if the duration is under the threshold, otherwise the cost depends on the duration as follows:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

The cost must be nonnegative.

costPerSquareHourAfterQuadraticSoftMax

number

Cost per square hour incurred if the quadraticSoftMaxDuration threshold is violated.

The additional cost is 0 if the duration is under the threshold, otherwise the cost depends on the duration as follows:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

The cost must be nonnegative.

DistanceLimit

A limit defining a maximum distance which can be traveled. It can be either hard or soft.

If a soft limit is defined, both softMaxMeters and costPerKilometerAboveSoftMax must be defined and be nonnegative.

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

string ( int64 format)

A hard limit constraining the distance to be at most maxMeters. The limit must be nonnegative.

softMaxMeters

string ( int64 format)

A soft limit not enforcing a maximum distance limit, but when violated results in a cost which adds up to other costs defined in the model, with the same unit.

If defined softMaxMeters must be less than maxMeters and must be nonnegative.

costPerKilometerBelowSoftMax

number

Cost per kilometer incurred, increasing up to softMaxMeters , with formula:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

This cost is not supported in routeDistanceLimit .

costPerKilometerAboveSoftMax

number

Cost per kilometer incurred if distance is above softMaxMeters limit. The additional cost is 0 if the distance is under the limit, otherwise the formula used to compute the cost is the following:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

The cost must be nonnegative.

BreakRule

Rules to generate time breaks for a vehicle (eg lunch breaks). A break is a contiguous period of time during which the vehicle remains idle at its current position and cannot perform any visit. A break may occur:

  • during the travel between two visits (which includes the time right before or right after a visit, but not in the middle of a visit), in which case it extends the corresponding transit time between the visits,
  • or before the vehicle start (the vehicle may not start in the middle of a break), in which case it does not affect the vehicle start time.
  • or after the vehicle end (ditto, with the vehicle end time).
JSON-представление
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Поля
breakRequests[]

object ( BreakRequest )

Sequence of breaks. See the BreakRequest message.

frequencyConstraints[]

object ( FrequencyConstraint )

Several FrequencyConstraint may apply. They must all be satisfied by the BreakRequest s of this BreakRule . See FrequencyConstraint .

BreakRequest

The sequence of breaks (ie their number and order) that apply to each vehicle must be known beforehand. The repeated BreakRequest s define that sequence, in the order in which they must occur. Their time windows ( earliestStartTime / latestStartTime ) may overlap, but they must be compatible with the order (this is checked).

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

string ( Timestamp format)

Required. Lower bound (inclusive) on the start of the break.

Uses RFC 3339, where generated output will always be Z-normalized and use 0, 3, 6 or 9 fractional digits. Offsets other than "Z" are also accepted. Examples: "2014-10-02T15:01:23Z" , "2014-10-02T15:01:23.045123456Z" or "2014-10-02T15:01:23+05:30" .

latestStartTime

string ( Timestamp format)

Required. Upper bound (inclusive) on the start of the break.

Uses RFC 3339, where generated output will always be Z-normalized and use 0, 3, 6 or 9 fractional digits. Offsets other than "Z" are also accepted. Examples: "2014-10-02T15:01:23Z" , "2014-10-02T15:01:23.045123456Z" or "2014-10-02T15:01:23+05:30" .

minDuration

string ( Duration format)

Required. Minimum duration of the break. Must be positive.

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

FrequencyConstraint

One may further constrain the frequency and duration of the breaks specified above, by enforcing a minimum break frequency, such as "There must be a break of at least 1 hour every 12 hours". Assuming that this can be interpreted as "Within any sliding time window of 12h, there must be at least one break of at least one hour", that example would translate to the following FrequencyConstraint :

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

The timing and duration of the breaks in the solution will respect all such constraints, in addition to the time windows and minimum durations already specified in the BreakRequest .

A FrequencyConstraint may in practice apply to non-consecutive breaks. For example, the following schedule honors the "1h every 12h" example:

  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)

Required. Minimum break duration for this constraint. Nonnegative. See description of FrequencyConstraint .

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

maxInterBreakDuration

string ( Duration format)

Required. Maximum allowed span of any interval of time in the route that does not include at least partially a break of duration >= minBreakDuration . Must be positive.

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

Цель

Objectives replace the cost model completely, and are therefore incompatible with pre-existing costs. Each objective maps to a number of pre-defined costs for, eg, vehicles, shipments or transition attributes.

Experimental: See https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request for more details.

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

enum ( Type )

The type of the objective.

weight

number

How much this objective should count relatively to the others. This can be any non-negative number, weights do not have to sum to 1. Weights default to 1.0.

Тип

The objective type that will be mapped to a set of costs.

Перечисления
DEFAULT A default set of costs will be used, to ensure a reasonable solution. Note: this objective can be used on its own, but will also always be added with weight 1.0, as a baseline, to the objectives specified by the user, if it's not already present.
MIN_DISTANCE "MIN" objectives. Minimize the total distance traveled.
MIN_WORKING_TIME Minimize the total working time, summed over all vehicles.
MIN_TRAVEL_TIME Same as above but focusing on travel time only.
MIN_NUM_VEHICLES Minimize the number of vehicles used.

DurationDistanceMatrix

Specifies a duration and distance matrix from visit and vehicle start locations to visit and vehicle end locations.

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

object ( Row )

Specifies the rows of the duration and distance matrix. It must have as many elements as ShipmentModel.duration_distance_matrix_src_tags .

vehicleStartTag

string

Tag defining to which vehicles this duration and distance matrix applies. If empty, this applies to all vehicles, and there can only be a single matrix.

Each vehicle start must match exactly one matrix, ie exactly one of their startTags field must match the vehicleStartTag of a matrix (and of that matrix only).

All matrices must have a different vehicleStartTag .

Ряд

Specifies a row of the duration and distance matrix.

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

string ( Duration format)

Duration values for a given row. It must have as many elements as ShipmentModel.duration_distance_matrix_dst_tags .

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

meters[]

number

Distance values for a given row. If no costs or constraints refer to distances in the model, this can be left empty; otherwise it must have as many elements as durations .

TransitionAttributes

Specifies attributes of transitions between two consecutive visits on a route. Several TransitionAttributes may apply to the same transition: in that case, all extra costs add up and the strictest constraint or limit applies (following natural "AND" semantics).

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

string

Tags defining the set of (src->dst) transitions these attributes apply to.

A source visit or vehicle start matches iff its VisitRequest.tags or Vehicle.start_tags either contains srcTag or does not contain excludedSrcTag (depending on which of these two fields is non-empty).

excludedSrcTag

string

See srcTag . Exactly one of srcTag and excludedSrcTag must be non-empty.

dstTag

string

A destination visit or vehicle end matches iff its VisitRequest.tags or Vehicle.end_tags either contains dstTag or does not contain excludedDstTag (depending on which of these two fields is non-empty).

excludedDstTag

string

See dstTag . Exactly one of dstTag and excludedDstTag must be non-empty.

cost

number

Specifies a cost for performing this transition. This is in the same unit as all other costs in the model and must not be negative. It is applied on top of all other existing costs.

costPerKilometer

number

Specifies a cost per kilometer applied to the distance traveled while performing this transition. It adds up to any Vehicle.cost_per_kilometer specified on vehicles.

distanceLimit

object ( DistanceLimit )

Specifies a limit on the distance traveled while performing this transition.

As of 2021/06, only soft limits are supported.

delay

string ( Duration format)

Specifies a delay incurred when performing this transition.

This delay always occurs after finishing the source visit and before starting the destination visit.

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

ShipmentTypeIncompatibility

Specifies incompatibilties between shipments depending on their shipmentType. The appearance of incompatible shipments on the same route is restricted based on the incompatibility mode.

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

string

List of incompatible types. Two shipments having different shipment_types among those listed are "incompatible".

incompatibilityMode

enum ( IncompatibilityMode )

Mode applied to the incompatibility.

IncompatibilityMode

Modes defining how the appearance of incompatible shipments are restricted on the same route.

Перечисления
INCOMPATIBILITY_MODE_UNSPECIFIED Unspecified incompatibility mode. This value should never be used.
NOT_PERFORMED_BY_SAME_VEHICLE In this mode, two shipments with incompatible types can never share the same vehicle.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

In this mode, two shipments with incompatible types can never be on the same vehicle at the same time:

  • They can share the same vehicle only if one is delivered before the other is picked up.
  • When both shipments are pickups-only (no deliveries) or deliveries-only (no pickups), they can't share the same vehicle at all.

ShipmentTypeRequirement

Specifies requirements between shipments based on their shipmentType. The specifics of the requirement are defined by the requirement mode.

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

string

List of alternative shipment types required by the dependentShipmentTypes .

dependentShipmentTypes[]

string

All shipments with a type in the dependentShipmentTypes field require at least one shipment of type requiredShipmentTypeAlternatives to be visited on the same route.

NOTE: Chains of requirements such that a shipmentType depends on itself are not allowed.

requirementMode

enum ( RequirementMode )

Mode applied to the requirement.

RequirementMode

Modes defining the appearance of dependent shipments on a route.

Перечисления
REQUIREMENT_MODE_UNSPECIFIED Unspecified requirement mode. This value should never be used.
PERFORMED_BY_SAME_VEHICLE In this mode, all "dependent" shipments must share the same vehicle as at least one of their "required" shipments.
IN_SAME_VEHICLE_AT_PICKUP_TIME

With the IN_SAME_VEHICLE_AT_PICKUP_TIME mode, all "dependent" shipments need to have at least one "required" shipment on their vehicle at the time of their pickup.

A "dependent" shipment pickup must therefore have either:

  • A delivery-only "required" shipment delivered on the route after, or
  • A "required" shipment picked up on the route before it, and if the "required" shipment has a delivery, this delivery must be performed after the "dependent" shipment's pickup.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Same as before, except the "dependent" shipments need to have a "required" shipment on their vehicle at the time of their delivery .

PrecedenceRule

A precedence rule between two events (each event is the pickup or the delivery of a shipment): the "second" event has to start at least offsetDuration after "first" has started.

Several precedences can refer to the same (or related) events, eg, "pickup of B happens after delivery of A" and "pickup of C happens after pickup of B".

Furthermore, precedences only apply when both shipments are performed and are otherwise ignored.

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

boolean

Indicates if the "first" event is a delivery.

secondIsDelivery

boolean

Indicates if the "second" event is a delivery.

offsetDuration

string ( Duration format)

The offset between the "first" and "second" event. It can be negative.

A duration in seconds with up to nine fractional digits, ending with ' s '. Example: "3.5s" .

firstIndex

integer

Shipment index of the "first" event. This field must be specified.

secondIndex

integer

Shipment index of the "second" event. This field must be specified.