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.
Wiadomość OptimizeToursResponse (REST, gRPC) ma 2 główne właściwości najwyższego poziomu:
routes[]to trasy każdego pojazdu z przypisanymi przesyłkami. Każdy elementRoutezawiera dane odzwierciedlające właściwości danej trasy.metricsto zagregowane dane dotyczące całej odpowiedzi dla wszystkich pojazdów i planów tras. Dane na najwyższym poziomie zawierają te same właściwości co dane na poziomie trasy, a ich wartości są zagregowane dla wszystkich tras.
Niektóre właściwości mogą nie być zawsze wypełniane w zależności od wyników optymalizacji:
skippedShipments[]zawiera listę przesyłek, które nie są realizowane przez żaden pojazd. Przesyłka może zostać pominięta, jeśli nie można jej zrealizować w ramach określonych ograniczeń lub jeśli koszt jej realizacji przekracza koszt kary. Jeśli na przykład odbiór lub dostawa przesyłki ma bardzo krótki czastimeWindow, może się okazać, że nie jest możliwe lub nieopłacalne, aby pojazd wykonał wizytę w wymaganym oknie czasowym.- Wartość
validationErrors[]określa błędy, które powodują, że żądanie jest nieprawidłowe lub niemożliwe do rozwiązania, gdy parametrsolvingModema wartośćVALIDATE_ONLY. W normalnym trybieDEFAULT_SOLVEbłędy weryfikacji będą się pojawiać w komunikacie o błędzie, a nie w treści odpowiedzi. Pamiętaj, że tryb rozwiązywania problemówVALIDATE_ONLYmoż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 lub gRPC). Każdy element ShipmentRoute odpowiada przypisaniu trasy do konkretnego pojazdu z żądania. Ważne właściwości ShipmentRoute związane z odpowiednim elementem Vehicle:
vehicleIndexto indeksVehiclew odpowiedniej wiadomości z żądaniem, liczony od 0. Odpowiedzi REST pomijają tę właściwość, gdy jej wartość wynosi 0.vehicleStartTimeto czas, w którym 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 ma wykonać. Każdy element Visit (REST, gRPC) reprezentuje element VisitRequest(REST, gRPC) z odpowiedniego żądania. Ważne właściwości: Visit
shipmentIndexto indeks przesyłki, do której należy ta wizyta, w odpowiednim żądaniu.isPickupma wartość true (prawda), gdy wizyta to odbiór, a fałsz (fałsz), gdy wizyta to dostawa. Odpowiedzi REST pomijają tę właściwość, gdy jej wartość jest równa fałsz.visitRequestIndexto indeks od zera elementówVisitRequestzShipment.pickupslubShipment.deliveriesw odpowiednim żądaniu, które reprezentujeVisit. Odpowiedzi REST pomijają tę właściwość, gdy jej wartość jest równa 0.startTimeto godzina planowanego rozpoczęcia wizyty.loadDemandsmapuje typ wczytywania na ilość danych wymaganych do wykonaniaVisit. W przypadku wizyt dostawy wartości ładunku są ujemne, co oznacza ładunek usuwany z pojazdu.
Przykładowa wartość Visit:
{
"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ą przejazdy między elementami visits danego pojazdu. Ważne właściwości wiadomości Transition (REST, gRPC):
startTimeto czas, w którym pojazd rozpocznie wykonywanie przejścia.travelDurationto czas, przez który pojazd musi się przemieszczać, aby dokończyć przenoszenie.travelDistanceMetersto odległość w metrach, jaką pojazd musi pokonać, aby dokończyć przejazd.trafficInfoUnavailablewskazuje, czy dane o ruchu są dostępne w przypadku przejścia.waitDurationoznacza czas bezczynności pojazdu, który czeka, aż będzie można rozpocząć następnyVisit. Może to być spowodowanestart_timez tychVisit.totalDurationto łączny czas trwania przejścia, w tym czas przejazdu, oczekiwania, przerwy i opóźnienia.vehicleLoadsmapuje typ ładunku na ilość ładunku przewiezionego przez pojazd podczas tego przejścia.
Przykładowa wartość Transition:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
Więcej informacji o związku między vists a transitions znajdziesz w dokumentacji Optymalizacja kolejności zatrzymywania na punktach odbioru i dostawy oraz w dokumentacji referencyjnej ShipmentRoute (REST, gRPC). Więcej informacji o właściwościach routePolyline i routeToken wiadomości Transition znajdziesz w artykule Przejście na polilinie i tokeny trasy.
Właściwości danych
Wiadomość Metrics (REST, gRPC) podsumowuje całe rozwiązanie.
Niektóre ważne właściwości Metrics to:
totalCostto łączny koszt przejazdu po trasach. Więcej informacji o kosztach znajdziesz w artykule Parametry modelu kosztowego.usedVehicleCountto łączna liczba pojazdów używanych w rozwiązaniu. Jeśli optymalizator uzna, że nie jest to konieczne, trasy pojazdów mogą być puste.skippedMandatoryShipmentCountto liczba pominiętych przesyłek, które są „obowiązkowe”. W przypadku przesyłki obowiązkowej nie określa siępenaltyCost, które jest naliczane, jeśli przesyłka zostanie pominięta. Wymagania dotyczące przesyłek można pominąć, jeśli ich realizacja nie jest możliwa z powodu określonych ograniczeń. Więcej informacji o kosztach znajdziesz w sekcji Parametry modelu kosztowego.
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, a w przypadku właściwości ShipmentRoute.metrics zawiera dane zagregowane ze wszystkich ShipmentRoute w usługach OptimizeToursResponse.Metrics.aggregatedRouteMetrics Każda usługa ShipmentRoute.metrics zawiera dane dotyczące konkretnego ShipmentRoute.
Ważne właściwości AggregatedMetrics:
performedShipmentCountto liczba przesyłek zrealizowanych przez pojazdy na wszystkich ich trasach.travelDurationto łączny czas, jaki pojazdy spędzają w trasie podczas wykonywania swoich tras.waitDurationto łączny czas oczekiwania pojazdów podczas wykonywania swoich tras.delayDurationto łączny czas opóźnienia pojazdów. Zwykle jest to 0, chyba że w żądaniu użyto parametruTransitionAttributes.breakDurationto łączny czas przerw w trakcie wykonywania przez pojazdy swoich tras.visitDurationto łączny czas, jaki pojazdy spędzają na wykonywaniu wizyt podczas realizacji swoich tras. Jest to suma wszystkich wartościVisitRequest.durationdlaVisitRequestodpowiadającychVisitprzypisanych do danego pojazdu.totalDurationto łączny czas potrzebny na przejechanie trasy przez pojazdy.travelDistanceMetersto całkowita odległość przebyta przez pojazdy podczas realizacji ich tras.maxLoadsmapuje typy ładunków na maksymalną ilość ładunku przewożonego przez pojazdy w dowolnym punkcie ich trasy.
Przykładowa wiadomość Metrics:
{
"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 konstruktora żądań:
{
"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
}
}
}