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

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

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 см. в разделе «Оптимизация заказов 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
    }
  }
}