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 elementRoute
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:
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ąskietimeWindow
, wykonanie wizyty przez pojazd w wymaganym przedziale czasu może być niewykonalne lub nieopłacalne.validationErrors[]
określa błędy, które sprawiają, że żądanie jest nieprawidłowe lub niemożliwe do usunięcia, gdysolvingMode
żądania ma wartośćVALIDATE_ONLY
. W normalnym trybieDEFAULT_SOLVE
błędy weryfikacji wyświetlają się w komunikacie o błędzie, a nie w treści odpowiedzi. Pamiętaj, że tryb rozwiązywaniaVALIDATE_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 elementuVehicle
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 indeksVisitRequest
z tabeliShipment.pickups
lubShipment.deliveries
w odpowiednim żądaniu reprezentowanym przezVisit
. 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 wykonaniaVisit
. 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ć kolejneVisit
. 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 elementupenaltyCost
, 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.metrics
Metrics.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 elementTransitionAttributes
.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ściVisitRequest.duration
parametruVisitRequest
odpowiadających elementomVisit
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
}
}
}