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.
OptimizeToursResponse
(REST, gRPC) ma 2 główne właściwości najwyższego poziomu:
routes[]
– trasy dla każdego pojazdu z przypisanymi do niego przesyłkami. Każda z nichRoute
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, ale ich wartości są zagregowane 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 określonych ramach lub jeśli koszt dostawy przekracza koszt kary. Jeśli na przykład przedział czasu odbioru lub dostawy przesyłki jest bardzo wąskitimeWindow
, pojazd może nie być w stanie zrealizować wizyty w wymaganym przedziale czasu lub może to być 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_SOLVE
błędy weryfikacji będą wyświetlane w komunikacie o błędzie zamiast w treści odpowiedzi. Pamiętaj, żeVALIDATE_ONLY
tryb rozwiązywania problemów może zgłaszać wiele 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żdy element ShipmentRoute
reprezentuje przypisanie trasy do konkretnego pojazdu z żądania. Ważne właściwości ShipmentRoute
powiązane z odpowiednim elementem Vehicle
to:
vehicleIndex
to indeksVehicle
w odpowiedniej wiadomości z żądaniem (liczony od zera). Odpowiedzi REST pomijają tę właściwość, gdy jej wartość wynosi zero.vehicleStartTime
to czas, w którym pojazd musi rozpocząć trasę.vehicleEndTime
to czas, w którym pojazd ma zakończyć trasę.
W odpowiedzi znak routes
będzie wyglądać tak:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
Każda ShipmentRoute
zawiera uporządkowaną listę visits
, które pojazd będzie realizować. Każdy znak Visit
(REST, gRPC) reprezentuje znak VisitRequest
(REST, gRPC) z odpowiedniego żądania. Ważne Visit
wł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 jest odbiorem, a wartość „fałsz”, gdy jest dostawą. W przypadku odpowiedzi REST ta właściwość jest pomijana, gdy wartość to „false”.visitRequestIndex
to indeks elementuVisitRequest
odShipment.pickups
lubShipment.deliveries
w odpowiednim żądaniu, które reprezentuje elementVisit
. 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ńczeniaVisit
. W przypadku wizyt związanych z dostawą wartości obciążenia są ujemne, co oznacza, że ładunek jest usuwany z pojazdu.
Przykładowa wartość 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óre reprezentują podróż między visits
danym pojazdem. Ważne właściwości wiadomości Transition
(REST, gRPC) to:
startTime
to czas, w którym pojazd zacznie przeprowadzać zmianę.travelDuration
to czas, w którym pojazd musi się poruszać, aby zakończyć przejście.travelDistanceMeters
to odległość w metrach, jaką musi pokonać pojazd, aby zakończyć przejście.trafficInfoUnavailable
wskazuje, czy dla przejścia dostępne są dane o ruchu.waitDuration
oznacza czas bezczynności pojazdu, który musi upłynąć, zanim będzie mógł rozpocząć kolejnąVisit
. Może to być spowodowanestart_time
poniższychVisit
.totalDuration
to łączny czas trwania przejścia, w tym czas podróży, oczekiwania, przerw i opóźnień.vehicleLoads
mapuje typ obciążenia na ilość ładunku przewożonego przez pojazd podczas tego przejścia.
Przykładowa wartość 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 ShipmentRoute
dokumentacji (REST, gRPC). Więcej informacji o właściwościach routePolyline
i routeToken
wiadomości Transition
znajdziesz w artykule Przejściowe polilinie i tokeny trasy.
Właściwości danych
Metrics
wiadomość (REST, gRPC) podsumowuje całe rozwiązanie.
Niektóre ważne Metrics
właściwości 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”. Wymagana dostawa nie określapenaltyCost
, które są ponoszone w przypadku pominięcia dostawy. 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 ShipmentRoute
w OptimizeToursResponse
. Każda usługa 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 parametruTransitionAttributes
.breakDuration
to łączny czas, jaki pojazdy spędzają na przerwach podczas pokonywania tras.visitDuration
to łączny czas, jaki pojazdy spędzają na wizytach podczas realizacji tras. Jest to suma wszystkich wartościVisitRequest.duration
dlaVisitRequest
odpowiadającychVisit
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
}
}
}
Pełny 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
}
}
}