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)

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

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

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

Если это правда:

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

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

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

Если 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

Если это так, полилинии будут заполнены в ответ на запрос ShipmentRoute .

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

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

Ответный текст

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

Области полномочий

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

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

Разрешения IAM

Для работы с parent ресурсом требуются следующие разрешения IAM :

  • routeoptimization.locations.use

Для получения более подробной информации см. документацию IAM .