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 не может быть true, и ни durationDistanceMatrixSrcTags , ни durationDistanceMatrixDstTags не могут быть пустыми.

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

  • Существует два местоположения: locA и locB.
  • 1 транспортное средство начинает свой маршрут в точке locA и заканчивает его в точке locA.
  • 1 запрос на выезд для получения заказа в месте B.
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 транспортное средство начинает свой маршрут в точке A и заканчивает в точке B, используя матрицу "быстро".
  • 1 транспортное средство начинает свой маршрут в точке locB и заканчивает его в точке locB, используя матрицу "медленно".
  • 1 транспортное средство начинает свой маршрут в точке locB и заканчивает его в точке locB, используя матрицу "быстро".
  • 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 )

Наборы несовместимых типов отправлений (см. 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 ))

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

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 года, объезды поддерживаются только в том случае, если продолжительность поездки не зависит от транспортных средств.

Запрос на посещение

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

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 .

LatLng

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

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

number

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

longitude

number

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

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

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

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

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

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

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

object ( Location )

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

placeId

string

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

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

Расположение

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

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

object ( LatLng )

Географические координаты контрольной точки.

heading

integer

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

Временное окно

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

Жесткие временные рамки, startTime и endTime , определяют самое раннее и самое позднее время события, так что startTime <= event_time <= endTime . Нижняя граница мягкого временного окна, softStartTime , выражает предпочтение тому, чтобы событие произошло в или после softStartTime , взимая плату, пропорциональную тому, сколько времени прошло до softStartTime. Верхняя граница мягкого временного окна, softEndTime , выражает предпочтение тому, чтобы событие произошло в или до softEndTime , взимая плату, пропорциональную тому, сколько времени прошло после softEndTime . startTime , endTime , softStartTime и softEndTime должны находиться в пределах глобальных временных ограничений (см. ShipmentModel.global_start_time и ShipmentModel.global_end_time ) и должны учитывать:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
JSON-представление
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
Поля
startTime

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 )

Путевая точка (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

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

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

В противном случае, транспортное средство не перемещается от начальной до конечной точки, и для него не запланированы никакие 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 Maps, см.: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

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

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

Модификаторы маршрута

Представляет собой набор необязательных условий, которые необходимо соблюдать при расчете маршрутов для транспортных средств. Это аналогично RouteModifiers в API Routes Preferred платформы Google Maps; см.: 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 , применяется следующий штраф (только один раз для каждого транспортного средства): (load - 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

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 quadraticSoftMaxDuration is set, the following conditions must be met:

  • It must be non-negative.
  • maxDuration must be defined.
  • quadraticSoftMaxDuration must be less than maxDuration .
  • The difference must be no more 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.