Интерпретируйте ответ

Разработчики из Европейской экономической зоны (ЕЭЗ)

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

Сообщение OptimizeToursResponse ( REST , gRPC ) имеет два основных свойства верхнего уровня:

  • routes[] содержит маршруты для каждого транспортного средства с назначенными ему грузами. Каждый Route содержит метрики, отражающие свойства этого отдельного маршрута.
  • metrics представляют собой агрегированные метрики для всего ответа, по всем транспортным средствам и планам маршрутов. Метрики верхнего уровня содержат те же свойства, что и метрики для каждого маршрута, со значениями, агрегированными по всем маршрутам.

В зависимости от результатов оптимизации некоторые свойства могут быть заполнены не всегда:

  1. В skippedShipments[] перечислены отправления, которые не выполняются ни одним транспортным средством. Отправление может быть пропущено, если его невозможно выполнить в рамках заданных ограничений или если стоимость выполнения отправления превышает штрафные санкции. Например, если timeWindow приема или доставки отправления очень ограничено, может оказаться невозможным или нерентабельным для транспортного средства выполнить визит в течение требуемого временного окна.
  2. 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
    }
  }
}