Интерпретация ответа Route Optimization API… с собаками

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

Примечание для рабочей версии

Для простоты в этом руководстве используются REST и JSON. Однако для рабочей среды рекомендуется использовать gRPC и клиентские библиотеки, чтобы повысить производительность. Подробнее о клиентских библиотеках Route Optimization API…

После того как вы отправите запрос, как описано в разделе Как отправить первый запрос, оптимизатор вернет объект OptimizeToursResponse. Этот ответ представляет собой план маршрута, которому должен следовать ваш водитель. В этом руководстве рассказывается, как его читать.

Сводка по плану маршрута

В сценарии с детским садом для собак оптимизатор назначает бернского зенненхунда и чихуахуа в ваш фургон и пропускает немецкую овчарку. Маршрут водителя:

  • Начать смену в 7:55 в детском саду.
  • Забрать бернского зенненхунда у башни Койт в 8:20.
  • Забрать чихуахуа в парке Саут-Сансет-Плейграунд в 8:58.
  • Вернитесь в детский сад в 9:24 и подождите до 9:30, когда откроется окно приема.
  • Привезите бернского зенненхунда в 9:30.
  • Отвезти чихуахуа в 9:35.
  • Завершение смены в 9:40.

Стоимость маршрута составляет 147,22 доллара США, включая штраф в размере 100 долларов США за пропуск немецкой овчарки.

Чтобы проверить результаты, сравните свой ответ с полным примером ответа. Результаты могут немного отличаться, поскольку время в пути и расстояние зависят от текущих данных о дорогах.

Полный пример ответа

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T15:55:04Z",
      "vehicleEndTime": "2024-02-13T17:40:00Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T16:20:00Z",
          "detour": "0s",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2024-02-13T16:58:12Z",
          "detour": "2600s",
          "shipmentLabel": "Chihuahua",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "startTime": "2024-02-13T17:30:00Z",
          "detour": "2297s",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "DELIVER_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2024-02-13T17:35:00Z",
          "detour": "656s",
          "shipmentLabel": "Chihuahua",
          "visitType": "DELIVER_SHIPMENT"
        }
      ],
      "transitions": [
        {
          "travelDuration": "1496s",
          "travelDistanceMeters": 7082,
          "waitDuration": "0s",
          "totalDuration": "1496s",
          "startTime": "2024-02-13T15:55:04Z"
        },
        {
          "travelDuration": "1992s",
          "travelDistanceMeters": 16589,
          "waitDuration": "0s",
          "totalDuration": "1992s",
          "startTime": "2024-02-13T16:25:00Z"
        },
        {
          "travelDuration": "1252s",
          "travelDistanceMeters": 7860,
          "waitDuration": "356s",
          "totalDuration": "1608s",
          "startTime": "2024-02-13T17:03:12Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T17:35:00Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T17:40:00Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "4740s",
        "waitDuration": "356s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "6296s",
        "travelDistanceMeters": 31531,
        "performedShipmentPenaltyCostSum": 2000
      },
      "routeCosts": {
        "model.vehicles.cost_per_hour": 47.22
      },
      "routeTotalCost": 47.22,
      "vehicleFullness": {
        "maxFullness": 0.3497777777777778,
        "activeSpan": 0.3497777777777778
      }
    }
  ],
  "skippedShipments": [
    {
      "index": 2,
      "label": "German shepherd",
      "penaltyCost": 100
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "4740s",
      "waitDuration": "356s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "6296s",
      "travelDistanceMeters": 31531,
      "performedShipmentPenaltyCostSum": 2000
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T15:55:04Z",
    "latestVehicleEndTime": "2024-02-13T17:40:00Z",
    "totalCost": 147.22,
    "costs": {
      "model.vehicles.cost_per_hour": 47.22,
      "model.shipments.penalty_cost": 100
    }
  }
}
    

Структура ответа

OptimizeToursResponse содержит объект ShipmentRoute с типом сообщения visits и объект Metrics с aggregatedRouteMetrics и totalCost.

OptimizeToursResponse состоит из двух основных компонентов:

  • routes – план маршрута для каждого транспортного средства в вашем автопарке, включая порядок и время для каждого получения и доставки. У вас один фургон, поэтому у вас один план маршрута.
  • metrics – сводка по всему маршруту, включая общую стоимость, продолжительность и расстояние.

Поскольку оптимизатор пропускает немецкую овчарку, ответ также включает skippedShipments.

В следующих разделах показано, где в ответе найти каждую деталь сводки плана маршрута.

Какое транспортное средство следует по какому маршруту?

Оптимизатор генерирует план маршрута (массив routes), который соответствует порядку vehicles в вашем запросе.

Поле vehicleIndex идентифицирует каждое транспортное средство на основе его позиции, отсчитываемой от нуля. Для вашего фургона это 0. Поля vehicleStartTime и vehicleEndTime указывают водителю, когда начинать и заканчивать смену.

Route Optimization API возвращает временные метки в формате UTC, отмеченные суффиксом Z, независимо от смещения в запросе. Чтобы узнать время в Сан-Франциско, вычтите 8 часов. Для вашего фургона смена длится с 7:55 до 9:40, как показано в следующем примере кода.

{
"routes": [
    {
    // "vehicleIndex": 0, // Omitted in actual JSON response because it's 0
    "vehicleStartTime": "2024-02-13T15:55:04Z",
    "vehicleEndTime": "2024-02-13T17:40:00Z",
    ...
    }
  ]
  ...
}

В каком порядке нужно забирать и высаживать пассажиров?

Внутри каждого маршрута массив visits содержит все пункты получения и доставки для назначенного транспортного средства в хронологическом порядке.

Значение shipmentIndex каждого посещения – это позиция доставки в запросе, начиная с нуля: 0 – бернский зенненхунд, а 1 – чихуахуа. В поле shipmentLabel указывается ярлык, который вы задали для каждой доставки.

Чтобы отличить посадку от высадки (или доставку от получения), проверьте поля visitType или isPickup:

  • visitType – явным образом определяет действие посещения.
    • Самовывоз: visitType = "PICKUP_SHIPMENT"
    • Доставка: visitType = "DELIVER_SHIPMENT"
  • isPickup – вспомогательное логическое поле.
    • Самовывоз: isPickup = true
    • Доставка: isPickup = false (пропущено в JSON)

Чтобы определить точную последовательность событий и ожидаемое время прибытия в каждое место, прочитайте массив visits по порядку. В таблице ниже показано, как действия в плане маршрута зависят от порядка и значений полей shipmentIndex, isPickup или visitType и startTime.

Серия На сумму shipmentIndex Значение isPickup или visitType startTime значение (UTC) Действие
Первое посещение 0 (в JSON не указывается) True или PICKUP_SHIPMENT. 2024-02-13T16:20:00Z Забрать бернского зенненхунда в 8:20.
Второе посещение 1 True или PICKUP_SHIPMENT. 2024-02-13T16:58:12Z Забрать чихуахуа в 8:58.
Третье посещение 0 (в JSON не указывается) False (опущено) или DELIVER_SHIPMENT 2024-02-13T17:30:00Z Отвези бернского зенненхунда в детский сад для собак к 9:30.
Четвертое посещение 1 False (опущено) или DELIVER_SHIPMENT 2024-02-13T17:35:00Z Отвезти чихуахуа в детский сад для собак в 9:35.

В приведенном ниже фрагменте кода показано, как ответ обеспечивает эту последовательность:

{
  "routes": [
    {
      "visits": [
        {
          // "shipmentIndex": 0, // Omitted in actual JSON response because it's 0
          "isPickup": true,
          "startTime": "2024-02-13T16:20:00Z",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2024-02-13T16:58:12Z",
          "shipmentLabel": "Chihuahua",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          // "shipmentIndex": 0, // Omitted in actual JSON response because it's 0
          // "isPickup": false, // Omitted in actual JSON response because it's false
          "startTime": "2024-02-13T17:30:00Z",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "DELIVER_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          // "isPickup": false, // Omitted in actual JSON response because it's false
          "startTime": "2024-02-13T17:35:00Z",
          "shipmentLabel": "Chihuahua",
          "visitType": "DELIVER_SHIPMENT"
        }
      ]
    }
  ]
}

Каждое посещение также имеет visitRequestIndex, который представляет собой позицию с отсчетом от нуля для варианта получения или доставки, выбранного оптимизатором для отправления. У каждой собаки в этом сценарии есть только один вариант посадки и один вариант высадки, поэтому visitRequestIndex всегда равен 0 и в ответе опускается.

Что происходит между посещениями?

Внутри каждого маршрута массив transitions содержит сведения о поездках между посещениями. Хотя visits и transitions – это разные списки, они чередуются во времени следующим образом:

  1. transitions[0] (поездка от начала до первого посещения)
  2. visits[0] (первое посещение)
  3. transitions[1] (стимулирование повторных посещений)
  4. visits[1] (второе посещение)
  5. ...
  6. visits[N-1] (последнее посещение, где N – общее количество посещений)
  7. transitions[N] (поездка от последнего посещения до конца)

Вы можете отслеживать хронологию маршрута, просматривая поле startTime в обоих массивах. startTime перехода – это время, когда водитель начинает движение, а startTime посещения – время, когда водитель начинает забирать или высаживать пассажира.

Для каждого перехода указывается ожидаемое время в пути и расстояние между местоположениями. В таблице ниже показано, как поля transitions и visits сопоставляются с хронологическими действиями на маршруте для сценария с детским садом для собак.

Серия Название поля startTime значение (UTC) Сведения Действие
Первый переход transitions[0] 2024-02-13T15:55:04Z travelDuration: 1496s
travelDistanceMeters: 7082
Проехать 7 км за 25 минут от детского сада, чтобы забрать бернского зенненхунда. Смена начинается в 7:55.
Первое посещение visits[0] 2024-02-13T16:20:00Z shipmentIndex: 0 (опущено в JSON)
isPickup: True
Забрать бернского зенненхунда. Время: 8:20. Продолжительность: 5 минут.
Второй переход transitions[1] 2024-02-13T16:25:00Z travelDuration: 1992s
travelDistanceMeters: 16589
Проехать 17 км за 33 минуты от башни Койт, чтобы забрать чихуахуа, начиная с 8:25.
Второе посещение visits[1] 2024-02-13T16:58:12Z shipmentIndex: 1
isPickup: True
Забрать чихуахуа. Начало в 8:58. Продолжительность – 5 минут.
Третий переход transitions[2] 2024-02-13T17:03:12Z travelDuration: 1252 с
travelDistanceMeters: 7860
waitDuration: 356 с
В 9:03 отправляется обратно в детский сад от South Sunset Playground. Проезжает 8 км за 21 минуту. Прибывает в 9:24 и ждет 6 минут, пока не откроется окно высадки.
Третье посещение visits[2] 2024-02-13T17:30:00Z shipmentIndex: 0 (опущено в JSON)
isPickup: False (опущено в JSON)
Отвезите бернского зенненхунда в центр дневного ухода за собаками. Время начала: 9:30. Продолжительность: 5 минут.
Четвертый переход transitions[3] 2024-02-13T17:35:00Z travelDuration: 0s
travelDistanceMeters: 0 (опущено в JSON)
Не садитесь за руль. Готово. Напоминание "Отвезти чихуахуа в детский сад в 9:35" установлено.
Четвертое посещение visits[3] 2024-02-13T17:35:00Z shipmentIndex: 1
isPickup: False (опущено в JSON)
Оставить чихуахуа в центре дневного ухода за собаками. Время начала: 9:35. Продолжительность: 5 минут.
Пятый переход transitions[4] 2024-02-13T17:40:00Z travelDuration: 0s
travelDistanceMeters: 0 (опущено в JSON)
Не садитесь за руль. Водитель заканчивает смену в 9:40.

В приведенном ниже примере кода показано, как ответ предоставляет эту последовательность для transitions[0] и transitions[1]:

{
  "routes": [
    {
      "transitions": [
        {
          "travelDuration": "1496s",
          "travelDistanceMeters": 7082,
          "waitDuration": "0s",
          "totalDuration": "1496s",
          "startTime": "2024-02-13T15:55:04Z"
        },
        {
          "travelDuration": "1992s",
          "travelDistanceMeters": 16589,
          "waitDuration": "0s",
          "totalDuration": "1992s",
          "startTime": "2024-02-13T16:25:00Z"
        },
        ...
      ]
    }
  ]
}

Сколько стоит проезд по маршруту?

В ответе можно посмотреть несколько полей в зависимости от того, нужна ли вам стоимость для конкретного транспортного средства или общая стоимость для всего автопарка.

В таблице ниже перечислены все способы получения информации о стоимости в ответе.

Родитель Параметр Область действия Описание
ShipmentRoute routeCosts Для каждого маршрута Разбивка конкретных компонентов стоимости (например, стоимости за час) для этого конкретного маршрута.
routeTotalCost Для каждого маршрута Общая стоимость, рассчитанная для этого маршрута.
Metrics totalCost Всего (все маршруты) Общая стоимость всех маршрутов в решении.
costs Всего (все маршруты) Разбивка агрегированных компонентов стоимости по всем маршрутам в решении.

Стоимость, указанная в полях routeCosts и costs, отражает ограничения стоимости, которые вы задали в запросе. Дополнительную информацию можно найти в статье Основные понятия: модель затрат.

В сценарии с передержкой собак, поскольку одна доставка пропущена, стоимость маршрута и общая стоимость различаются. Стоимость маршрута включает только расходы, связанные с этим конкретным маршрутом (заработная плата водителя), а общая стоимость также включает штраф за пропущенную доставку. В приведенном ниже примере кода показано, где найти эти значения в ответе.

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T15:55:04Z",
      "vehicleEndTime": "2024-02-13T17:40:00Z",
      ...
      "routeCosts": {
        "model.vehicles.cost_per_hour": 47.22
      },
      "routeTotalCost": 47.22
    }
  ],
  "metrics": {
    "totalCost": 147.22,
    "costs": {
      "model.shipments.penalty_cost": 100,
      "model.vehicles.cost_per_hour": 47.22
    },
    ...
  }
}

Согласно плану маршрута, водитель управляет фургоном с 7:55 до 9:40, то есть примерно 1 час 45 минут (6296 секунд). При заданной вами ставке 27 долларов США в час стоимость маршрута составляет 47, 22 доллара США. Поскольку оптимизатор пропустил доставку немецкой овчарки, он добавляет штрафную стоимость в размере 100 долларов США, в результате чего общая совокупная стоимость составляет 147,22 доллара США.

Почему отправка была пропущена?

Оптимизатор перечисляет все невыполненные доставки в массиве skippedShipments. Причина пропуска зависит от того, задали ли вы penaltyCost:

  • Обязательные перевозки (без penaltyCost). Оптимизатор никогда не пропускает их, даже если они дорогостоящие. Пропуск возможен, только если отправление не удается включить ни в один маршрут, например из-за того, что его временное окно конфликтует с другими отправлениями.
  • Необязательные перевозки (с penaltyCost). Оптимизатор может пропускать их, если стоимость перевозки превышает штраф. Вы можете задать разные штрафы, чтобы приоритет одних поставок был выше, чем других.

В этом сценарии время, когда нужно забрать немецкую овчарку, конфликтует со временем, когда нужно забрать бернского зенненхунда. Башня Койт и Лэндс-Энд находятся в 25 минутах езды друг от друга, поэтому водитель не сможет забрать обоих пассажиров в течение 20-минутного окна. Оптимизатор должен пропустить один из них. Поскольку у немецкой овчарки штраф меньше (100 долларов США против 1000 долларов США для обычного клиента), оптимизатор пропускает ее и налагает штраф в размере 100 долларов США.

В приведенном ниже фрагменте кода показан объект skippedShipments в ответе:

{
  ...
  "skippedShipments": [
    {
      "index": 2,
      "label": "German shepherd",
      "penaltyCost": 100
    }
  ],
  ...
}

Объект skippedShipments в ответе содержит следующие поля:

  • index – индекс отправления в запросе, начиная с нуля (2 для третьего отправления).
  • label – ярлык, указанный в запросе ("немецкая овчарка").
  • penaltyCost – штраф, указанный в запросе, который API добавляет к общей стоимости.

Чтобы оптимизатор не пропускал отправку, ослабьте ограничение, вызывающее конфликт. Например, попросите владельца немецкой овчарки расширить временной интервал для передачи собаки, а затем обновите timeWindows для этой передачи в своем запросе.

Поля ответа в примере

В таблице ниже описаны все поля ответа, возвращаемые в OptimizeToursResponse в примере сценария. Для понимания плана маршрута не обязательно использовать все поля, но вы можете проанализировать их, чтобы определить, как настроить OptimizeToursRequest в соответствии с потребностями вашего бизнеса. Дополнительную информацию можно найти в разделе Жизненный цикл плана маршрута.

Вы можете отфильтровать содержимое по родительскому элементу или с помощью текстового поиска.

Родитель Параметр Тип ресурса Описание
OptimizeToursResponse routes Массив объектов (ShipmentRoute) Он содержит список маршрутов, рассчитанных для каждого транспортного средства (по одному на транспортное средство). Для этого сценария детского сада для собак он содержит подробный план маршрута для вашего единственного фургона.
metrics Объект (Metrics) Здесь содержатся общие показатели для решения, агрегированные по всем маршрутам. Для этого сценария детского сада для собак это сводка затрат и продолжительности работы за день.
skippedShipments Массив объектов (SkippedShipment) Содержит список отправлений, которые были пропущены в решении. В этом случае третья собака (немецкая овчарка) пропускается.
ShipmentRoute vehicleStartTime Временная метка Это время, когда транспортное средство начинает движение по маршруту. В нашем сценарии с детским садом для собак водитель начинает движение в 7:55.
vehicleEndTime Временная метка Время, когда транспортное средство завершает маршрут. В нашем примере с детским садом для собак водитель заканчивает поездку в 9:40.
visits Массив объектов (Visit) Это упорядоченный список пунктов получения и доставки на маршруте. Для этого сценария с передержкой собак это последовательность забора и высадки двух собак.
transitions Массив объектов (Transition) Это упорядоченный список расстояний, времени в пути и времени ожидания между посещениями. Для этого сценария с детским садом для собак здесь подробно описаны расстояние и время в пути между башней Койт, парком South Sunset Playground и детским садом.
metrics Объект (AggregatedMetrics) Это показатели, относящиеся к этому единственному маршруту. Для этого сценария с детским садом для собак это статистика для этого конкретного фургона. Эти показатели рассчитываются на основе расходов, указанных в запросе. Подробную информацию вы найдете в статье Основные понятия, связанные с моделями затрат.
routeCosts Объект (карта) Это разбивка конкретных расходов по этому маршруту. Для этого сценария с детским садом для собак это показывает стоимость, рассчитанную на основе заработной платы водителя в размере 27 долларов в час.
routeTotalCost Число Это общая стоимость для конкретного маршрута. В этом сценарии общая стоимость маршрута фургона составляет 47.22.
vehicleFullness Объект (VehicleFullness) Это разбивка того, насколько близко транспортное средство подходит к своим эксплуатационным ограничениям, таким как время, расстояние и нагрузка. В сценарии с детским садом для собак водителя ограничивает только время начала и окончания смены, поэтому оптимизатор вычисляет vehicleFullness как долю фактической продолжительности маршрута и максимального времени, доступного для смены водителя.
Visit shipmentIndex Целое число Это индекс отправления в исходном запросе, отсчитываемый от нуля. В нашем примере с детским садом для собак 0 соответствует бернскому зенненхунду, а 1 – чихуахуа.
isPickup Логическое значение Это поле имеет значение true, если посещение является самовывозом. В нашем примере с передержкой собак это значение будет true, когда собаку забирают, и false (или отсутствует), когда собаку оставляют.
startTime Временная метка Это расчетное время начала посещения. Для этого сценария с детским садом для собак это когда водитель стучит в дверь.
detour длительность; Это дополнительное время, которое оптимизатор добавляет к времени доставки конкретного груза. Отклонение – это разница между фактическим планом маршрута и идеальной прямой поездкой, если у водителя нет других поставок или задач.

В нашем примере с передержкой собак первый визит – забрать бернского зенненхунда – имеет отклонение 0, потому что водитель едет прямо из центра передержки к этому месту. Для чихуахуа отклонение от маршрута составляет 43 минуты, потому что водитель сначала забирает бернского зенненхунда (и тратит 5 минут на погрузку).
shipmentLabel Строка Это ярлык из запроса для каждого отправления. Для этого сценария с детским садом для собак ярлыками являются «чихуахуа» или «бернский зенненхунд».
visitType Строка (перечисление) Указывает тип посещения: PICKUP_SHIPMENT для самовывоза или DELIVER_SHIPMENT для доставки. В данном случае это PICKUP_SHIPMENT или DELIVER_SHIPMENT.
Transition travelDuration длительность; Это время, потраченное на перемещение между посещениями. Например, в этом сценарии с детским садом для собак водитель тратит примерно 25 минут на поездку от детского сада до башни Койт, чтобы забрать бернского зенненхунда.
travelDistanceMeters Целое число Расстояние в метрах, пройденное во время этого перехода. Например, в этом сценарии с детским садом для собак водитель проезжает 7 километров от детского сада до башни Койт, чтобы забрать бернского зенненхунда.
waitDuration длительность; Это время ожидания перед следующим получением или доставкой. В нашем примере для третьего перехода это значение равно 6 минутам (356 секундам), поскольку водитель прибывает в детский сад до открытия окна высадки в 9:30. Для других переходов это значение равно 0.
totalDuration длительность; Это общая продолжительность перехода, включая вождение и ожидание. Например, водитель тратит 25 минут (25 минут за рулем и 0 минут ожидания) на первый переход и 27 минут (21 минута за рулем и 6 минут ожидания) на третий переход обратно в детский сад.
startTime Временная метка Время начала поездки. Оно совпадает со временем завершения предыдущего посещения (или, для первого перехода, со временем начала работы транспортного средства). В сценарии с детским садом для собак первый переход начинается в 7:55, когда водитель уезжает из детского сада, а второй переход начинается в 8:25, когда водитель уезжает из башни Койт.
Metrics aggregatedRouteMetrics Объект (AggregatedMetrics) Это сумма показателей по всем маршрутам. Для этого сценария с детским садом для собак это общие показатели для вашего фургона.
usedVehicleCount Целое число Это количество транспортных средств, используемых в решении. Для этого сценария с детским садом для собак вы используете только один фургон.
earliestVehicleStartTime Временная метка Это самое раннее время начала среди всех транспортных средств. В нашем сценарии с детским садом для собак маршрут фургона начинается в 7:55.
latestVehicleEndTime Временная метка Это самое позднее время окончания среди всех транспортных средств. В нашем примере с детским садом для собак маршрут фургона заканчивается в 9:40.
totalCost Число Это общая стоимость решения. Для этого сценария с детским садом для собак весь план маршрута стоит 147.22 за день (включая заработную плату водителя 47.22 и штраф за пропущенную доставку 100).
costs Объект (карта) Это разбивка общей стоимости по категориям. Для этого сценария с детским садом для собак оптимизатор рассчитал стоимость маршрута на основе стоимости часа и штрафа за пропущенную немецкую овчарку.
AggregatedMetrics performedShipmentCount Целое число Количество отправлений, для которых успешно построен маршрут. В этом сценарии с детским садом для собак водитель перевозит двух собак.
travelDuration длительность; Это общее время, проведенное в пути. В этом сценарии с детским садом для собак водитель едет 79 минут.
waitDuration длительность; Это общее время ожидания. В нашем примере водитель ждет открытия центра 6 минут (356 секунд).
delayDuration длительность; Это дополнительное время, которое вы определяете с помощью атрибутов перехода, например время, зарезервированное для парковки. В сценарии с передержкой собак вы не определили атрибуты перехода в запросе, поэтому это значение равно нулю.
breakDuration длительность; Это общее время, потраченное на перерывы. В этом сценарии с передержкой собак перерывов нет.
visitDuration длительность; Это общее время, потраченное на оказание услуг во время посещений. В нашем примере с передержкой собак это 20 минут (5 минут на посещение, умноженные на 4 посещения).
totalDuration длительность; Это сумма всех компонентов продолжительности. Для этого сценария с передержкой собак общая продолжительность составляет 105 минут (6296 секунд).
travelDistanceMeters Целое число Это общее расстояние в метрах. В этом сценарии водитель проезжает в общей сложности 31, 5 км.
performedShipmentPenaltyCostSum Двойной трекер Это сумма штрафов за все выполненные перевозки. В нашем случае это 2000, потому что водитель забрал бернского зенненхунда и чихуахуа (штраф за каждую собаку – 1000).
VehicleFullness maxFullness Число Это самый высокий коэффициент использования среди всех полей VehicleFullness. Для этого сценария детского сада для собак это значение равно 0,35, поскольку водитель управляет фургоном только 105 минут за всю утреннюю смену, которую вы определили в запросе как 5 часов.
activeSpan Число Это отношение общей продолжительности смены водителя к часам работы плана маршрута. Чем меньше число, тем меньше времени водитель проводит за рулем в течение рабочего дня. Для нашего сценария с детским садом для собак это значение равно 0,35, поскольку водитель управляет фургоном в течение 105 минут во время 5-часовой смены.
SkippedShipment index Целое число Это индекс отправления в исходном запросе, отсчитываемый от нуля. В этом сценарии 2 представляет немецкую овчарку.
label Строка Это ярлык, который вы указали для отправления в запросе.
penaltyCost Число Это штраф, который вы платите, когда оптимизатор пропускает эту отправку. Оно соответствует значению penaltyCost, указанному в запросе.