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 elementRoutezawiera dane odzwierciedlające właściwości danej trasy.metricsto 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:
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 czasowetimeWindow, może się okazać, że pojazd nie będzie mógł zrealizować wizyty w wymaganym czasie lub będzie to nieopłacalne.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 naVALIDATE_ONLY. W normalnym trybieDEFAULT_SOLVEbłędy weryfikacji będą wyświetlane w komunikacie o błędzie zamiast w treści odpowiedzi. Pamiętaj, żeVALIDATE_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:
vehicleIndexto indeksVehiclew odpowiedniej wiadomości żądania. Odpowiedzi REST pomijają tę właściwość, gdy wartość wynosi zero.vehicleStartTimeto godzina, o której pojazd musi rozpocząć trasę.vehicleEndTimeto 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:
shipmentIndexto indeks przesyłki, do której należy ta wizyta, w odpowiednim żądaniu (liczony od zera).isPickupma 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”.visitRequestIndexto indeksVisitRequestodShipment.pickupslubShipment.deliveriesw odpowiednim żądaniu, które reprezentujeVisit. Odpowiedzi REST pomijają tę właściwość, gdy wartość wynosi zero.startTimeto oczekiwany czas rozpoczęcia wizyty.loadDemandsmapuje typ obciążenia na ilość obciążenia wymaganą do ukończeniaVisit. 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:
startTimeto czas, w którym pojazd zacznie wykonywać przejście.travelDurationto czas, przez jaki pojazd musi się poruszać, aby zakończyć przejście.travelDistanceMetersto odległość w metrach, jaką pojazd musi pokonać, aby zakończyć przejście.trafficInfoUnavailablewskazuje, czy dla przejścia dostępne są dane o ruchu.waitDurationreprezentuje czas bezczynności, który pojazd spędza na oczekiwaniu, zanim będzie mógł rozpocząć następnyVisit. Może to być spowodowanestart_timetychVisit.totalDurationto łączny czas trwania przejścia, w tym czas podróży, oczekiwania, przerw i opóźnień.vehicleLoadsmapuje 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:
totalCostto łączny koszt poniesiony na pokonanie tras. Więcej informacji o kosztach znajdziesz w sekcji Parametry modelu kosztów.usedVehicleCountto łączna liczba pojazdów używanych w rozwiązaniu. Pojazdy mogą mieć puste trasy, gdy optymalizator uzna, że ich użycie jest niepotrzebne.skippedMandatoryShipmentCountto liczba pominiętych przesyłek, które są „obowiązkowe”. W przypadku obowiązkowej dostawy nie podanopenaltyCost, 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:
performedShipmentCountto liczba przesyłek zrealizowanych przez pojazdy na całej trasie.travelDurationto łączny czas, jaki pojazdy spędzają w drodze podczas realizacji tras.waitDurationto łączny czas oczekiwania pojazdów podczas realizacji tras.delayDurationto łączny czas opóźnienia pojazdów. Zwykle jest to zero, chyba że w żądaniu użyto parametruTransitionAttributes.breakDurationto łączny czas, jaki pojazdy spędzają na przerwach podczas pokonywania tras.visitDurationto łączny czas, jaki pojazdy spędzają na odwiedzaniu miejsc podczas pokonywania tras. Jest to suma wszystkich wartościVisitRequest.durationdlaVisitRequestodpowiadającychVisitprzypisanych do danego pojazdu.totalDurationto łączny czas potrzebny na przejechanie tras przez pojazdy.travelDistanceMetersto łączna odległość pokonana przez pojazdy podczas realizacji tras.maxLoadsmapuje 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
}
}
}