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 .

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

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

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

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

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

If a vehicleLabel in the injected solution does not correspond to a request vehicle, the corresponding route is removed from the solution along with its visits. If a shipmentLabel in the injected solution does not correspond to a request shipment, the corresponding visit is removed from the solution. If a SkippedShipment.label in the injected solution does not correspond to a request shipment, the SkippedShipment is removed from the solution.

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

NOTE: The caller must ensure that each Vehicle.label (resp. Shipment.label ) uniquely identifies a vehicle (resp. shipment) entity used across the two relevant requests: the past request that produced the OptimizeToursResponse used in the injected solution and the current request that includes the injected solution. The uniqueness checks described above are not enough to guarantee this requirement.

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 .