Method: projects.locations.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/*/locations/*}:optimizeTours

URL использует синтаксис перекодировки gRPC .

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

Параметры
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)

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

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

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

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

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

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

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

interpretInjectedSolutionsUsingLabels

boolean

Если верно:

  • использует 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 (соответственно Shipment.label ) однозначно идентифицирует сущность транспортного средства (соответственно, груз), используемую в двух соответствующих запросах: предыдущем запросе, который сгенерировал OptimizeToursResponse используемый во внедренном решении, и текущем запросе, включающем внедренное решение. Описанных выше проверок уникальности недостаточно для обеспечения выполнения этого требования.

considerRoadTraffic

boolean

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

populatePolylines

boolean

Если true, полилинии будут заполнены в ответе ShipmentRoute s.

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

Если значение равно true, расстояния проезда будут рассчитываться с использованием геодезических расстояний вместо расстояний Google Maps, а время проезда будет рассчитываться с использованием геодезических расстояний со скоростью, определяемой параметром 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) , если не задан параметр solvedMode=VALIDATE_ONLY: см. поле OptimizeToursResponse.validation_errors . Значение по умолчанию — 100, ограничение — 10 000.

Тело ответа

В случае успеха тело ответа содержит экземпляр OptimizeToursResponse .

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

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

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

Разрешения IAM

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

  • routeoptimization.locations.use

Более подробную информацию см. в документации IAM .