Interpretowanie odpowiedzi

Route Optimization API zwraca trasy pojazdów w odpowiednim żądaniu. Przesyłki są przypisane do pojazdów lub mogą zostać pominięte w zależności od właściwości żądania.

Komunikat OptimizeToursResponse (REST, gRPC) ma 2 główne właściwości najwyższego poziomu:

  • routes[] to trasy każdego pojazdu z przypisanymi przesyłki. Każdy element Route zawiera dane odzwierciedlające właściwości danej trasy.
  • metrics to zagregowane wskaźniki dla całej odpowiedzi, dotyczące wszystkich pojazdów i planów trasy. Wskaźniki najwyższego poziomu zawierają te same właściwości co wskaźniki poszczególnych tras, z wartościami zagregowanymi dla wszystkich tras.

W zależności od wyników optymalizacji niektóre właściwości mogą nie zawsze być wypełniane:

  1. skippedShipments[] zawiera listę przesyłek, które nie są wykonywane przez żaden pojazd. Przesyłkę można pominąć, jeśli nie można jej zrealizować w ramach określonych ograniczeń lub gdy koszt dostawy przekracza jej koszt karny. Jeśli na przykład odbiór lub dostawa przesyłki są bardzo wąskie timeWindow, wykonanie wizyty przez pojazd w wymaganym przedziale czasu może być niewykonalne lub nieopłacalne.
  2. validationErrors[] określa błędy, które sprawiają, że żądanie jest nieprawidłowe lub niemożliwe do usunięcia, gdy solvingMode żądania ma wartość VALIDATE_ONLY. W normalnym trybie DEFAULT_SOLVE błędy weryfikacji wyświetlają się w komunikacie o błędzie, a nie w treści odpowiedzi. Pamiętaj, że tryb rozwiązywania VALIDATE_ONLY może jednocześnie zgłosić wiele błędów, co jest przydatne w przypadku szybkiego debugowania żądań.

Właściwości trasy

Każdy wpis routes[] jest wiadomością ShipmentRoute (REST, gRPC). Każdy wpis ShipmentRoute reprezentuje przypisanie trasy dla konkretnego pojazdu z żądania. Ważne właściwości ShipmentRoute związane z odpowiadającymi mu właściwościami Vehicle to:

  • vehicleIndex to liczony od zera indeks elementu Vehicle w odpowiednim komunikacie żądania. W odpowiedziach REST ta właściwość jest pomijana, gdy wartość wynosi 0.
  • vehicleStartTime oznacza godzinę, o której pojazd musi rozpocząć podróż.
  • vehicleEndTime to godzina, kiedy pojazd powinien zakończyć trasę.

W odpowiedzi routes będzie wyglądać tak:

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T00:00:00Z",
      "vehicleEndTime": "2024-02-13T00:38:42Z",
      "visits": [
        ...
      ],
      "transitions": [
        ...
      ],
      "metrics": {
        ...
      },
      ...
    }
  ],
  ...
}

Każdy element ShipmentRoute zawiera uporządkowaną listę visits, którą pojazd zakończy. Każdy Visit (REST, gRPC) reprezentuje VisitRequest (REST, gRPC) z odpowiedniego żądania. Ważne właściwości Visit to:

  • shipmentIndex to liczony od zera indeks dostawy, do której należy ta wizyta w odpowiednim żądaniu.
  • isPickup ma wartość prawdziwą, gdy wizyta jest odbiorem, a fałsz, gdy wizyta jest związana z dostawą. Odpowiedzi REST pomijają tę właściwość, jeśli wartość jest fałsz.
  • visitRequestIndex to liczony od zera indeks VisitRequest z tabeli Shipment.pickups lub Shipment.deliveries w odpowiednim żądaniu reprezentowanym przez Visit. W odpowiedziach REST ta właściwość jest pomijana, gdy wartość wynosi 0.
  • Przewidywana godzina rozpoczęcia wizyty to startTime.
  • loadDemands mapuje typ wczytywania, aby wczytać ilość danych potrzebną do wykonania Visit. Wielkości obciążenia są ujemne w przypadku wizyt związanych z dostawą, co oznacza usunięcie obciążenia z pojazdu.

Przykładowy element Visit wygląda tak:

{
  "routes": [
    {
      ...
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T00:00:00Z",
          "detour": "0s"
        },
        ...
      ],
    },
    ...
  ],
  ...
}

Każdy element ShipmentRoute zawiera uporządkowaną listę elementów transitions, która reprezentuje podróż między pojazdem (visits). Ważne właściwości Transition (REST, gRPC) obejmują:

  • startTime to godzina, o której pojazd rozpocznie przenoszenie.
  • travelDuration to czas, przez jaki pojazd musi podróżować, aby zakończyć przejście.
  • travelDistanceMeters to odległość w metrach, jaką musi pokonać pojazd, aby zakończyć przejście.
  • trafficInfoUnavailable wskazuje, czy są dostępne dane o ruchu na potrzeby przeniesienia.
  • waitDuration reprezentuje czas bezczynności pojazdu, po którym pojazd może uruchomić kolejne Visit. Przyczyną może być start_time: Visit.
  • totalDuration to łączny czas trwania przejścia, w tym czas podróży, oczekiwania, przerwy i opóźnienia.
  • vehicleLoads mapuje typ obciążenia na potrzeby obciążenia pojazdem podczas tej zmiany.

Przykładowy element Transition wygląda tak:

{
  "routes": [
    {
      ...
      "transitions": [
        ...
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

Związek między vists a transitions został opisany w sekcji Optymalizacja zamówień przy odbiorze i zatrzymaniu dostawy, a także w dokumentacji referencyjnej ShipmentRoute (REST, gRPC).

Właściwości danych

Komunikat Metrics (REST, gRPC) podsumowuje całe rozwiązanie. Niektóre ważne właściwości Metrics to:

  • totalCost to całkowity koszt poniesiony na ukończenie tras. Więcej informacji o kosztach znajdziesz w sekcji Parametry modelu kosztu.
  • usedVehicleCount to łączna liczba pojazdów używanych w rozwiązaniu. Pojazdy mogą mieć puste trasy, gdy optymalizator uzna, że ich korzystanie jest niepotrzebne.
  • skippedMandatoryShipmentCount to liczba pominiętych przesyłek, które są „wymagane”. Nie określa się w nim elementu penaltyCost, który zostanie zaliczony, jeśli przesyłka zostanie pominięta. Obowiązkowe dostawy można też pominąć, jeśli ich wydajność jest niemożliwa w ramach określonych ograniczeń. Więcej informacji o kosztach znajdziesz w artykule Parametry modelu kosztu.

Dodatkowe wskaźniki są raportowane jako komunikaty AggregatedMetrics (REST, gRPC). Typ komunikatu AggregatedMetrics jest używany w przypadku usługi Metrics.aggregatedRouteMetrics, a w usłudze ShipmentRoute.metricsMetrics.aggregatedRouteMetrics zawiera dane zbiorcze ze wszystkich ShipmentRoute komponentów typu OptimizeToursResponse. Każda usługa ShipmentRoute.metrics zawiera dane dotyczące tego konkretnego kryterium ShipmentRoute.

Ważne właściwości AggregatedMetrics to:

  • performedShipmentCount to liczba przesyłek wykonanych przez pojazdy na wszystkich ich trasach.
  • travelDuration to łączny czas, jaki pojazdy spędzają w transporcie publicznym podczas podróży.
  • waitDuration to łączny czas, przez jaki pojazdy czekają podczas jazdy.
  • delayDuration to łączny czas opóźnienia pojazdów. Zwykle ma ona wartość zero, chyba że w żądaniu jest używany element TransitionAttributes.
  • breakDuration to łączny czas, jaki pojazdy spędzają na przerwach na trasie dojazdu.
  • visitDuration to łączny czas, w jakim pojazdy korzystają z wizytacji podczas sprawdzania trasy. Jest to suma wszystkich wartości VisitRequest.duration parametru VisitRequest odpowiadających elementom Visit przypisanych do odpowiedniego pojazdu.
  • totalDuration to całkowity czas podróży wymagany do ukończenia tras pojazdów.
  • travelDistanceMeters to całkowita odległość, jaką pokonały pojazdy podczas korzystania z trasy.
  • maxLoads mapuje typy obciążenia na maksymalną wielkość obciążenia, która jest przenoszona przez pojazdy w dowolnym miejscu na ich trasie.

Przykładowy komunikat Metrics wygląda tak:

{
  "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
    }
  }
}

Pełny przykład

Pełna przykładowa odpowiedź na żądanie z tworzenia żądania wygląda tak:

{
  "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
    }
  }
}