API оптимизации маршрутов возвращает маршруты для транспортных средств в соответствующем запросе. Отправления назначаются транспортным средствам или могут быть пропущены в зависимости от свойств запроса.
Сообщение OptimizeToursResponse ( REST , gRPC ) имеет два основных свойства верхнего уровня:
-
routes[]содержит маршруты для каждого транспортного средства с назначенными ему грузами. КаждыйRouteсодержит метрики, отражающие свойства этого отдельного маршрута. -
metricsпредставляют собой агрегированные метрики для всего ответа, по всем транспортным средствам и планам маршрутов. Метрики верхнего уровня содержат те же свойства, что и метрики для каждого маршрута, со значениями, агрегированными по всем маршрутам.
В зависимости от результатов оптимизации некоторые свойства могут быть заполнены не всегда:
- В
skippedShipments[]перечислены отправления, которые не выполняются ни одним транспортным средством. Отправление может быть пропущено, если его невозможно выполнить в рамках заданных ограничений или если стоимость выполнения отправления превышает штрафные санкции. Например, еслиtimeWindowприема или доставки отправления очень ограничено, может оказаться невозможным или нерентабельным для транспортного средства выполнить визит в течение требуемого временного окна. -
validationErrors[]указывает на ошибки, которые делают запрос недействительным или невозможным для решения, еслиsolvingModeзапроса установлен вVALIDATE_ONLY. В обычном режимеDEFAULT_SOLVEошибки проверки будут отображаться в сообщении об ошибке, а не в теле ответа. Обратите внимание, что режим решенияVALIDATE_ONLYможет сообщать о нескольких ошибках одновременно, что полезно для быстрой отладки запросов.
Свойства маршрута
Каждая запись в массиве routes[] представляет собой сообщение ShipmentRoute ( REST , gRPC ). Каждый ShipmentRoute отображает назначение маршрута для конкретного транспортного средства из запроса. Важные свойства объекта ShipmentRoute , относящиеся к соответствующему Vehicle включают:
-
vehicleIndex— это индекс объектаVehicleв соответствующем сообщении запроса, начинающийся с нуля. В REST-ответах это свойство опускается, если его значение равно нулю. -
vehicleStartTime— это время, когда транспортное средство должно начать свой маршрут. -
vehicleEndTime— это время, когда ожидается, что транспортное средство завершит свой маршрут.
В ответе routes будут выглядеть следующим образом:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
Каждый ShipmentRoute включает упорядоченный список visits , которые выполнит транспортное средство. Каждое Visit ( REST , gRPC ) представляет собой VisitRequest ( REST , gRPC ) от соответствующего запроса. Важные свойства Visit включают:
-
shipmentIndex— это индекс отправления, к которому относится данный визит, начиная с нуля, в соответствующем запросе. -
isPickupимеет значение `true`, если визит осуществляется с получением заказа, и `false`, если визит осуществляется с доставкой. В REST-ответах это свойство опускается, если его значение равно `false`. -
visitRequestIndex— это индекс объектаVisitRequestизShipment.pickupsилиShipment.deliveriesв соответствующем запросе, который представляет собойVisit. В REST-ответах это свойство опускается, если его значение равно нулю. -
startTime— это время, когда ожидается начало визита. - Параметр
loadDemandsсопоставляет тип груза с требуемым объемом груза для выполненияVisit. Для визитов по доставке объемы груза имеют отрицательное значение, что означает, что груз выгружается из транспортного средства.
Пример Visit выглядит следующим образом:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
Каждый ShipmentRoute включает упорядоченный список transitions , представляющих собой перемещение между visits для данного транспортного средства. Важные свойства сообщения Transition ( REST , gRPC ) включают:
-
startTime— это время, с которого транспортное средство начнет выполнять переход. -
travelDuration— это продолжительность времени, в течение которого транспортное средство должно проехать, чтобы завершить переход. -
travelDistanceMeters— это расстояние в метрах, которое транспортное средство должно преодолеть для завершения перехода. -
trafficInfoUnavailableуказывает, доступны ли данные о трафике для данного перехода. -
waitDurationобозначает время простоя, которое транспортное средство проводит в ожидании перед началом следующегоVisit. Это время может возникнуть из-заstart_timeследующегоVisit. -
totalDuration— это общая продолжительность перехода, включая время в пути, время ожидания, перерывы и задержки. - Функция
vehicleLoadsсопоставляет тип груза с объемом груза, перевозимого транспортным средством во время этого перехода.
Примерный Transition выглядит следующим образом:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
Для получения дополнительной информации о взаимосвязи между vists и transitions см. раздел «Оптимизация порядка остановки при получении и доставке» и справочную документацию ShipmentRoute ( REST , gRPC ). Для получения дополнительной информации о свойствах routePolyline и routeToken сообщения Transition см. разделы «Полилинии переходов и токены маршрута» .
Свойства метрик
Сообщение Metrics ( REST , gRPC ) суммирует все решение. К важным свойствам Metrics относятся:
-
totalCost— это общая сумма затрат, понесенных при выполнении маршрутов. Подробнее о затратах см. в разделе «Параметры модели затрат» . -
usedVehicleCount— это общее количество транспортных средств, использованных в решении. Транспортные средства могут иметь пустые маршруты, если оптимизатор определит, что их использование не требуется. -
skippedMandatoryShipmentCount— это количество пропущенных обязательных отгрузок. Для обязательной отгрузки не указываетсяpenaltyCost, которая взимается в случае пропуска. Обязательные отгрузки могут быть пропущены, если их выполнение невозможно при заданных ограничениях. Подробнее о затратах см. в разделе «Параметры модели затрат ».
Дополнительные метрики передаются в виде сообщений AggregatedMetrics ( REST , gRPC ). Тип сообщения AggregatedMetrics используется для свойства Metrics.aggregatedRouteMetrics , а для свойства ShipmentRoute.metrics свойство Metrics.aggregatedRouteMetrics содержит метрики, агрегированные по всем ShipmentRoute ) в объекте OptimizeToursResponse . Каждое свойство ShipmentRoute.metrics содержит метрики для конкретного ShipmentRoute .
Важные свойства AggregatedMetrics включают в себя:
-
performedShipmentCount— это количество отправлений, выполненных транспортными средствами на протяжении всего маршрута. -
travelDuration— это общее время, которое транспортные средства проводят в пути, выполняя свои маршруты. -
waitDuration— это общее время, которое транспортные средства проводят в ожидании выполнения своих маршрутов. -
delayDuration— это общее время задержки для транспортных средств. Обычно оно равно нулю, если в запросе не используютсяTransitionAttributes. -
breakDuration— это общее время, которое транспортные средства проводят в перерывах во время выполнения своих маршрутов. -
visitDuration— это общее время, которое транспортные средства проводят, совершая визиты во время выполнения своих маршрутов. По сути, это сумма всех значенийVisitRequest.durationдляVisitRequest, соответствующихVisit, назначенным соответствующему транспортному средству. -
totalDuration— это общее время, необходимое для прохождения маршрутов транспортными средствами. -
travelDistanceMeters— это общее расстояние, пройденное транспортными средствами при выполнении своих маршрутов. - Параметр
maxLoadsсопоставляет типы грузов с максимальным объемом груза, перевозимым транспортными средствами в любой точке их маршрута.
Пример сообщения в разделе Metrics выглядит следующим образом:
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
Полный пример
Полный пример ответа на запрос, полученный при создании запроса, выглядит следующим образом:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}