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żdyRoute
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:
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ąskatimeWindow
, przeprowadzenie wizyty w danym przedziale czasu może być niemożliwe lub opłacalne.validationErrors[]
określa błędy, które sprawiają, że żądanie jest nieprawidłowe lub niemożliwe do naprawienia, gdysolvingMode
żądania ma wartośćVALIDATE_ONLY
. W normalnym trybieDEFAULT_SOLVE
błędy weryfikacji będą się wyświetlać w komunikacie o błędzie zamiast w treści odpowiedzi. Pamiętaj, że tryb rozwiązywaniaVALIDATE_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 liczbyVehicle
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 funkcjiVisitRequest
zShipment.pickups
lubShipment.deliveries
w odpowiednim żądaniu reprezentowanym przezVisit
. 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 zadaniaVisit
. 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 kolejnyVisit
. Opłata może być związana zstart_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ślapenaltyCost
, 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 parametruTransitionAttributes
.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 wszystkichVisitRequest.duration
wartości parametrówVisitRequest
odpowiadającychVisit
przypisanym 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
}
}
}