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

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

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

Если этот параметр установлен, то срок выполнения запроса может составлять до 60 минут (см. https://grpc.io/blog/deadlines ). В противном случае максимальный срок составляет всего 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) , за исключением случаев, когда solveMode=VALIDATE_ONLY: см. поле OptimizeToursResponse.validation_errors . По умолчанию это значение равно 100 и ограничено 10 000.

Тело ответа

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

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

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

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

IAM-разрешения

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

  • routeoptimization.locations.use

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