Interpretowanie odpowiedzi

Deweloperzy z Europejskiego Obszaru Gospodarczego (EOG)

Interfejs Route Optimization API zwraca trasy dla pojazdów w odpowiednim żądaniu. Przesyłki są przypisywane do pojazdów lub mogą być pomijane w zależności od właściwości żądania.

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

  • routes[] to trasy dla każdego pojazdu z przypisanymi do niego przesyłkami. Każdy element Route zawiera dane odzwierciedlające właściwości danej trasy.
  • metrics to zagregowane dane dotyczące całej odpowiedzi, obejmujące wszystkie pojazdy i plany tras. Dane najwyższego poziomu zawierają te same właściwości co dane dotyczące poszczególnych tras, a wartości są agregowane we wszystkich trasach.

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

  1. skippedShipments[] zawiera przesyłki, które nie są realizowane przez żaden pojazd. Dostawę można pominąć, jeśli nie można jej zrealizować w ramach określonych ograniczeń lub jeśli koszt dostawy przekracza koszt kary. Jeśli na przykład odbiór lub dostawa przesyłki ma bardzo wąskie okno czasowe timeWindow, może się okazać, że pojazd nie będzie mógł zrealizować wizyty w wymaganym czasie lub będzie to nieopłacalne.
  2. validationErrors[] określa błędy, które powodują, że żądanie jest nieprawidłowe lub niemożliwe do rozwiązania, gdy wartość solvingMode żądania jest ustawiona na VALIDATE_ONLY. W normalnym trybie DEFAULT_SOLVE błędy weryfikacji będą wyświetlane w komunikacie o błędzie zamiast w treści odpowiedzi. Pamiętaj, że VALIDATE_ONLYtryb rozwiązywania może zgłaszać kilka błędów jednocześnie, co jest przydatne do szybkiego debugowania żądań.

Właściwości trasy

Każdy wpis routes[] to wiadomość ShipmentRoute (REST, gRPC). Każda właściwość ShipmentRoute reprezentuje przypisanie trasy do konkretnego pojazdu z żądania. Ważne właściwości ShipmentRoute powiązane z odpowiednim Vehicle to:

  • vehicleIndex to indeks Vehicle w odpowiedniej wiadomości żądania. Odpowiedzi REST pomijają tę właściwość, gdy wartość wynosi zero.
  • vehicleStartTime to godzina, o której pojazd musi rozpocząć trasę.
  • vehicleEndTime to czas, w którym pojazd ma 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 ShipmentRoute zawiera uporządkowaną listę visits, które pojazd wykona. Każdy obiekt Visit (REST, gRPC) reprezentuje obiekt VisitRequest (REST, gRPC) z odpowiedniego żądania. Ważne Visitwłaściwości to:

  • shipmentIndex to indeks przesyłki, do której należy ta wizyta, w odpowiednim żądaniu (liczony od zera).
  • isPickup ma wartość „prawda”, gdy wizyta dotyczy odbioru, a „fałsz”, gdy dotyczy dostawy. W przypadku odpowiedzi REST ta właściwość jest pomijana, gdy wartość to „false”.
  • visitRequestIndex to indeks VisitRequest od Shipment.pickups lub Shipment.deliveries w odpowiednim żądaniu, które reprezentuje Visit. Odpowiedzi REST pomijają tę właściwość, gdy wartość wynosi zero.
  • startTime to oczekiwany czas rozpoczęcia wizyty.
  • loadDemands mapuje typ obciążenia na ilość obciążenia wymaganą do ukończenia Visit. Wartości ładunku są ujemne w przypadku wizyt dostawy, co oznacza, że ładunek jest usuwany z pojazdu.

Przykład Visit wygląda tak:

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

Każda właściwość ShipmentRoute zawiera uporządkowaną listę właściwości transitions, które reprezentują podróż między visits w przypadku danego pojazdu. Ważne właściwości wiadomości Transition (REST, gRPC) to:

  • startTime to czas, w którym pojazd zacznie wykonywać przejście.
  • travelDuration to czas, przez jaki pojazd musi się poruszać, aby zakończyć przejście.
  • travelDistanceMeters to odległość w metrach, jaką pojazd musi pokonać, aby zakończyć przejście.
  • trafficInfoUnavailable wskazuje, czy dla przejścia dostępne są dane o ruchu.
  • waitDuration reprezentuje czas bezczynności, który pojazd spędza na oczekiwaniu, zanim będzie mógł rozpocząć następny Visit. Może to być spowodowane start_time tych Visit.
  • totalDuration to łączny czas trwania przejścia, w tym czas podróży, oczekiwania, przerw i opóźnień.
  • vehicleLoads mapuje typ ładunku na ilość ładunku przewożonego przez pojazd podczas tego przejścia.

Przykład Transition wygląda tak:

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

Więcej informacji o relacji między vists a transitions znajdziesz w artykule Optymalizacja kolejności przystanków odbioru i dostawy oraz w ShipmentRoutedokumentacji (REST, gRPC). Więcej informacji o właściwościach routePolyline i routeToken wiadomości Transition znajdziesz w artykule Przejście na linie łamane i tokeny trasy.

Właściwości danych

Wiadomość Metrics (REST, gRPC) zawiera podsumowanie całego rozwiązania. Niektóre ważne właściwości Metrics to:

  • totalCost to łączny koszt poniesiony na pokonanie tras. Więcej informacji o kosztach znajdziesz w sekcji Parametry modelu kosztów.
  • usedVehicleCount to łączna liczba pojazdów używanych w rozwiązaniu. Pojazdy mogą mieć puste trasy, gdy optymalizator uzna, że ich użycie jest niepotrzebne.
  • skippedMandatoryShipmentCount to liczba pominiętych przesyłek, które są „obowiązkowe”. W przypadku obowiązkowej dostawy nie podano penaltyCost, które są naliczane, jeśli dostawa zostanie pominięta. Wymagane dostawy można pominąć, jeśli ich realizacja nie jest możliwa w ramach określonych ograniczeń. Więcej informacji o kosztach znajdziesz w sekcji Parametry modelu kosztów.

Dodatkowe dane są raportowane jako wiadomości AggregatedMetrics (REST, gRPC). Typ wiadomości AggregatedMetrics jest używany w przypadku właściwości Metrics.aggregatedRouteMetrics i właściwości ShipmentRoute.metrics. Właściwość Metrics.aggregatedRouteMetrics zawiera dane zagregowane ze wszystkich obiektów ShipmentRoute w obiekcie OptimizeToursResponse. Każda właściwość ShipmentRoute.metrics zawiera dane dotyczące konkretnego ShipmentRoute.

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

  • performedShipmentCount to liczba przesyłek zrealizowanych przez pojazdy na całej trasie.
  • travelDuration to łączny czas, jaki pojazdy spędzają w drodze podczas realizacji tras.
  • waitDuration to łączny czas oczekiwania pojazdów podczas realizacji tras.
  • delayDuration to łączny czas opóźnienia pojazdów. Zwykle jest to zero, chyba że w żądaniu użyto parametru TransitionAttributes.
  • breakDuration to łączny czas, jaki pojazdy spędzają na przerwach podczas pokonywania tras.
  • visitDuration to łączny czas, jaki pojazdy spędzają na odwiedzaniu miejsc podczas pokonywania tras. Jest to suma wszystkich wartości VisitRequest.duration dla VisitRequest odpowiadających Visit przypisanych do danego pojazdu.
  • totalDuration to łączny czas potrzebny na przejechanie tras przez pojazdy.
  • travelDistanceMeters to łączna odległość pokonana przez pojazdy podczas realizacji tras.
  • maxLoads mapuje typy ładunków na maksymalną ilość ładunku przewożonego przez pojazdy w dowolnym momencie na trasie.

Przykładowa wiadomość 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
    }
  }
}

Kompletny przykład

Pełna przykładowa odpowiedź na żądanie z sekcji Tworzenie żą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
    }
  }
}