Method: projects.optimizeTours

Отправляет OptimizeToursRequest, содержащий ShipmentModel, и возвращает OptimizeToursResponse, содержащий ShipmentRoute, которые представляют собой набор маршрутов, которые должны быть выполнены транспортными средствами, минимизируя общую стоимость.

Модель ShipmentModel в основном состоит из Shipment, которые нужно выполнить, и Vehicle, которые можно использовать для транспортировки Shipment. ShipmentRoute назначает Shipment Vehicle. В частности, они назначают каждому транспортному средству серию Visit, где Visit соответствует VisitRequest, то есть получению или доставке Shipment.

Цель состоит в том, чтобы назначить ShipmentRoute Vehicle так, чтобы минимизировать общую стоимость, где стоимость состоит из множества компонентов, определенных в ShipmentModel.

HTTP-запрос

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*}:optimizeTours

URL имеет синтаксис gRPC Transcoding.

Параметры пути

Параметры
parent

string

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

Формат:

  • projects/{project-id}
  • projects/{project-id}/locations/-

Региональные значения {location-id} не поддерживаются.

Тело запроса

Ниже приведена структура данных в теле запроса.

JSON-представление
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
Поля
timeout

string (Duration format)

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

Для асинхронных запросов сервер генерирует решение (если возможно) до истечения времени ожидания.

model

object (ShipmentModel)

Модель доставки, которую нужно решить.

solvingMode

enum (SolvingMode)

По умолчанию используется режим DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

Режим поиска, использованный для выполнения запроса.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

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

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

Решение должно соответствовать некоторым базовым предположениям о валидности:

  • Для всех маршрутов значение vehicleIndex должно быть в допустимом диапазоне и не должно повторяться.
  • Для всех посещений shipmentIndex и visitRequestIndex должны быть в диапазоне.
  • На отправление можно ссылаться только в одном маршруте.
  • забор отправления должен быть выполнен до его доставки.
  • Для одной доставки можно выполнить не более одной альтернативной доставки или самовывоза.
  • Для всех маршрутов время увеличивается (т.е. vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • Доставка может выполняться только на разрешенном транспортном средстве. Транспортное средство допускается, если поле Shipment.allowed_vehicle_indices пустое или его значение vehicleIndex включено в Shipment.allowed_vehicle_indices.

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

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

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

refreshDetailsRoutes[]

object (ShipmentRoute)

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

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

Поля routePolyline переданных маршрутов могут не соответствовать маршруту transitions.

Это поле нельзя использовать вместе с injectedFirstSolutionRoutes или injectedSolutionConstraint.

Правила Shipment.ignore и Vehicle.ignore не влияют на работу функции. Ломаные линии по-прежнему заполняются между всеми посещениями на всех непустых маршрутах, независимо от того, игнорируются ли связанные отправления или транспортные средства.

interpretInjectedSolutionsUsingLabels

boolean

Если значение true:

  • использует ShipmentRoute.vehicle_label вместо vehicleIndex, чтобы сопоставить маршруты во внедренном решении с транспортными средствами в запросе; повторно использует сопоставление исходного ShipmentRoute.vehicle_index с новым ShipmentRoute.vehicle_index, чтобы обновить ConstraintRelaxation.vehicle_indices, если оно не пустое, но сопоставление должно быть однозначным (т.е. несколько ShipmentRoute не должны иметь один и тот же исходный vehicleIndex).
  • использует ShipmentRoute.Visit.shipment_label вместо shipmentIndex для сопоставления посещений в добавленном решении с доставками в запросе;
  • использует SkippedShipment.label вместо SkippedShipment.index, чтобы сопоставить пропущенные отправки во внедренном решении с отправками из запроса.

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

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

Если vehicleLabel во внедренном решении не соответствует транспортному средству из запроса, соответствующий маршрут удаляется из решения вместе с посещениями. Если shipmentLabel в добавленном решении не соответствует доставке из запроса, соответствующее посещение удаляется из решения. Если SkippedShipment.label в добавленном решении не соответствует отправлению из запроса, SkippedShipment удаляется из решения.

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

ПРИМЕЧАНИЕ. Вызывающий абонент должен убедиться, что каждый Vehicle.label (resp. Shipment.label) уникально идентифицирует транспортное средство (или отправление), используемое в двух соответствующих запросах: прошлом запросе, который создал OptimizeToursResponse, используемый во внедренном решении, и текущем запросе, который включает внедренное решение. Описанных выше проверок уникальности недостаточно, чтобы гарантировать выполнение этого требования.

considerRoadTraffic

boolean

Учитывайте оценку трафика при расчете полей ShipmentRoute (Transition.travel_duration, Visit.start_time и vehicleEndTime), при заполнении поля ShipmentRoute.has_traffic_infeasibilities и при расчете поля OptimizeToursResponse.total_cost.

populatePolylines

boolean

Если задано значение true, в ответе ShipmentRoute будут указаны ломаные линии.

populateTransitionPolylines

boolean

Если задано значение true, в ответе ShipmentRoute.transitions будут указаны ломаные линии и токены маршрутов.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Если это значение задано, то у запроса может быть крайний срок (см. https://grpc.io/blog/deadlines) до 60 минут. В противном случае максимальный срок составляет 30 минут. Обратите внимание, что у долгосрочных запросов риск прерывания значительно выше, хотя и остается небольшим.

useGeodesicDistances

boolean

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

label

string

Ярлык, который можно использовать для идентификации этого запроса, возвращаемый в OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

Если для параметра useGeodesicDistances задано значение true, это поле должно быть заполнено. Оно определяет скорость, которая используется для расчета времени в пути. Значение должно быть не менее 1,0 м/с.

maxValidationErrors

integer

Ограничивает количество возвращаемых ошибок проверки. Обычно эти ошибки прикрепляются к полезной нагрузке ошибки INVALID_ARGUMENT как сведения об ошибке BadRequest (https://cloud.google.com/apis/design/errors#error_details), если только solvingMode не имеет значение VALIDATE_ONLY. См. поле OptimizeToursResponse.validation_errors. По умолчанию используется значение 100,а максимальное значение – 10 000.

Тело ответа

Если ответ получен успешно, его тело содержит экземпляр OptimizeToursResponse.

Области авторизации

Требуется следующая область действия OAuth:

  • https://www.googleapis.com/auth/cloud-platform

Права доступа IAM

Требуется следующее разрешение IAM для ресурса parent:

  • routeoptimization.locations.use

Подробную информацию можно найти в документации по IAM.