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 см. в разделе «Оптимизация заказов Pickup and Delivery Stop Order» и справочной документации 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
}
}
}
Полный пример
Полный пример ответа на запрос от Construct a Request выглядит так:
{
"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
}
}
}