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[]są trasami dla każdego pojazdu z przypisanymi do niego przesyłkami. Każda z nichRoutezawiera 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, 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_SOLVEbłędy weryfikacji będą wyświetlane w komunikacie o błędzie zamiast w treści odpowiedzi. Pamiętaj, żeVALIDATE_ONLYtryb 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 Vehicle to:
vehicleIndexto indeksVehiclew odpowiedniej wiadomości z żądaniem (liczony od zera). Odpowiedzi REST pomijają tę właściwość, gdy jej wartość wynosi zero.vehicleStartTimeto czas, w którym pojazd musi rozpocząć trasę.vehicleEndTimeto 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 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 jest odbiorem, a wartość „fałsz”, gdy jest dostawą. W przypadku odpowiedzi REST ta właściwość jest pomijana, gdy wartość to „false”.visitRequestIndexto indeks elementuVisitRequestodShipment.pickupslubShipment.deliveriesw odpowiednim żądaniu, które reprezentuje elementVisit. 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. 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:
startTimeto czas, w którym pojazd zacznie przeprowadzać zmianę.travelDurationto czas, w którym pojazd musi się poruszać, aby zakończyć przejście.travelDistanceMetersto odległość w metrach, jaką musi pokonać pojazd, aby zakończyć przejście.trafficInfoUnavailablewskazuje, czy dla przejścia dostępne są dane o ruchu.waitDurationoznacza czas bezczynności pojazdu, który musi upłynąć, zanim będzie mógł rozpocząć kolejnąVisit. Może to być spowodowanestart_timeponiższychVisit.totalDurationto łączny czas trwania podróży, w tym czas oczekiwania, przerwy i opóźnienia.vehicleLoadsmapuje typ ładunku 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 ShipmentRoutedokumentacji (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:
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 jest określanapenaltyCost, która jest naliczana, 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 ShipmentRoute w OptimizeToursResponse. Każda usługa 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 pokonywania 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 wizytach podczas realizacji tras. Jest to suma wszystkich wartościVisitRequest.durationdlaVisitRequestodpowiadającychVisitprzypisanych do danego pojazdu.totalDurationto łączny czas potrzebny na przejechanie tras przez pojazdy.travelDistanceMetersto całkowita odległość przebyta przez pojazdy podczas pokonywania 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
}
}
}
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
}
}
}