Interpretowanie odpowiedzi

Interfejs 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 do niego przesyłkami. Każdy Route zawiera dane odzwierciedlające właściwości danej trasy.
  • metrics to zagregowane wskaźniki dotyczące całej odpowiedzi, obejmujące wszystkie pojazdy i plany tras. Wskaźniki najwyższego poziomu zawierają te same właściwości co wskaźniki dla poszczególnych tras, a wartości są zagregowane dla wszystkich tras.

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

  1. skippedShipments[] zawiera listę dostaw, które nie są wykonywane przez żaden pojazd. Przesyłki można pominąć, jeśli nie można jej zrealizować w określonych granicach lub jeśli koszt dostawy przekracza jej koszt karny. Jeśli na przykład opcja odbioru lub dostawy przesyłki jest bardzo wąska timeWindow, przeprowadzenie wizyty w danym przedziale czasu może być niemożliwe lub opłacalne.
  2. validationErrors[] określa błędy, które sprawiają, że żądanie jest nieprawidłowe lub niemożliwe do naprawienia, gdy solvingMode żądania ma wartość VALIDATE_ONLY. W normalnym trybie DEFAULT_SOLVE błędy weryfikacji będą się wyświetlać w komunikacie o błędzie zamiast w treści odpowiedzi. Pamiętaj, że tryb rozwiązywania VALIDATE_ONLY może zgłosić wiele błędów jednocześnie, co jest przydatne podczas szybkiego debugowania żądań.

Właściwości trasy

Każdy wpis routes[] to komunikat ShipmentRoute (REST, gRPC). Każdy element ShipmentRoute odpowiada przypisanej trasie dla konkretnego pojazdu z żądania. Ważne właściwości ShipmentRoute związane z powiązanymi z nimi właściwościami Vehicle to między innymi:

  • vehicleIndex to liczony od zera indeks liczby Vehicle w odpowiednim komunikacie z żądania. Odpowiedzi REST pomijają tę właściwość, gdy jej wartość wynosi 0.
  • vehicleStartTime to czas, w którym pojazd musi rozpocząć trasę.
  • vehicleEndTime to czas, w którym pojazd powinien zakończyć przejazd.

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ą wykona pojazd. Każdy obiekt Visit (REST, gRPC) reprezentuje wartość 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ść true (prawda), gdy wizyta oznacza odbiór, a fałsz, gdy wizyta jest dostawą. Odpowiedzi REST pomijają tę właściwość, gdy wartość jest równa false.
  • visitRequestIndex to liczony od zera indeks funkcji VisitRequest z Shipment.pickups lub Shipment.deliveries w odpowiednim żądaniu reprezentowanym przez Visit. Odpowiedzi REST pomijają tę właściwość, gdy jej wartość wynosi 0.
  • startTime to spodziewany czas rozpoczęcia wizyty.
  • loadDemands mapuje typ wczytywania, aby wczytać ilość potrzebną do ukończenia zadania Visit. Kwoty obciążenia są ujemne w przypadku wizyt związanych z dostawą, co oznacza usunięcie ładunku 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ę transitions, która reprezentuje podróż z uwzględnieniem visits danego pojazdu. Ważne właściwości Transition (REST, gRPC) to między innymi:

  • startTime to godzina, o której pojazd rozpocznie przełączanie.
  • travelDuration to czas, jaki pojazd musi pokonać, aby dokończyć przejście.
  • travelDistanceMeters to odległość, jaką musi pokonać pojazd, aby wykonać przejście.
  • trafficInfoUnavailable wskazuje, czy dane o ruchu są dostępne do momentu przejścia.
  • waitDuration oznacza czas bezczynności pojazdu, który musi upłynąć, zanim będzie mógł zostać uruchomiony kolejny Visit. Opłata może być związana z start_time tych: Visit.
  • totalDuration to całkowity czas przejścia, w tym czasy podróży, oczekiwania, przerwy i opóźnienia.
  • vehicleLoads mapuje typ obciążenia na ilość obciążenia przenoszonego przez pojazd 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 zatrzymania zamówienia z odbiorem i dostawą oraz w dokumentacji referencyjnej ShipmentRoute (REST, gRPC).

Właściwości danych

Komunikat Metrics (REST, gRPC) podsumowuje całe rozwiązanie. Ważne właściwości Metrics to między innymi:

  • totalCost to całkowity koszt poniesionych w związku z pokonaniem tras. Więcej informacji o kosztach znajdziesz w artykule Parametry modelu kosztu.
  • usedVehicleCount to łączna liczba pojazdów używanych w rozwiązaniu. Pojazdy mogą mieć puste trasy, gdy optymalizator ustali, że ich użycie jest niepotrzebne.
  • skippedMandatoryShipmentCount to liczba przesyłek pominiętych, które są „obowiązkowe”. Obowiązkowa przesyłka nie określa penaltyCost, które jest naliczane, jeśli jej pominiesz. Obowiązkowe dostawy nadal można pominąć, jeśli ich wydajność nie jest możliwa przy określonych ograniczeniach. 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 usłudze Metrics.aggregatedRouteMetrics, a w przypadku usługi ShipmentRoute.metrics Metrics.aggregatedRouteMetrics zawiera wskaźniki zebrane ze wszystkich usług ShipmentRoute w OptimizeToursResponse. Każda usługa ShipmentRoute.metrics zawiera dane dotyczące konkretnego elementu ShipmentRoute.

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

  • performedShipmentCount to liczba ładunków realizowanych przez pojazdy na wszystkich trasach.
  • travelDuration to łączny czas, jaki pojazd spędził w transporcie, podczas pokonywania trasy.
  • waitDuration to łączny czas oczekiwania pojazdów na pokonanie trasy.
  • delayDuration to całkowity czas opóźnienia dla pojazdów. Zwykle ma ona wartość 0, chyba że w żądaniu użyto parametru TransitionAttributes.
  • breakDuration to łączny czas, jaki pojazd poświęca na przerwy podczas pokonywania trasy.
  • visitDuration to łączny czas, przez jaki pojazdy spędzają na odwiedzaniu miejsca, podczas pokonywania trasy. Jest to suma wszystkich VisitRequest.duration wartości parametrów VisitRequest odpowiadających Visitprzypisanym pojazdom.
  • totalDuration to łączny czas wymagany do pokonania trasy dla pojazdów.
  • travelDistanceMeters to całkowita odległość pokonana przez pojazdy podczas pokonywania ich tras.
  • Funkcja maxLoads mapuje typy obciążenia na maksymalne obciążenie przenoszone przez pojazdy w dowolnym punkcie na ich trasach.

Przykładowa wiadomość w usłudze 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 narzędzia Utwórz żądanie 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
    }
  }
}