Trasa pojazdu może zostać rozłożona zgodnie z osią czasu w ten sposób (zakładamy, że liczba wizyt wynosi n):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
Rozróżniamy między tymi elementami:
- „wydarzenia punktowe”, np. początek i koniec każdej wizyty oraz początek i koniec każdej wizyty (tzw. przyjazd i odjazd). Występują w określonej sekundzie.
- „przedziały czasu”, np. same wizyty oraz przejścia między odwiedzinami. Chociaż czas trwania przedziałów czasowych może czasami wynosić zero, tj. zaczyna się i kończy o tej samej sekundzie, często ma dodatnią długość.
Niezmienniki:
- Jeśli liczba wizyt wynosi n, oznacza to n+1 przejść.
- Wizyta zawsze poprzedza przejście (ten sam indeks) i przejście po niej (indeks + 1).
- Po uruchomieniu pojazdu zawsze następuje przejście nr 0.
- Koniec pojazdu jest zawsze poprzedzony przejściem nr n.
Powiększanie. Oto, co się dzieje podczas zdarzeń Transition
i Visit
:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
Oto jak można ustawić PODRÓŻE, NARUSY, OPÓŹNIENIA i OCZEKIWANIE podczas przejścia.
- Nie nakładają się na siebie.
- Opóźnienie jest niepowtarzalne i musi się liczyć w ciągu poprzedzającym kolejną wizytę (lub koniec pojazdu). Aby poznać czas rozpoczęcia i zakończenia, wystarczy znać czas opóźnienia.
- ZMIANY to graniczące ze sobą okresy, które nie nakładają się na siebie. Odpowiedź określa czas rozpoczęcia i czas trwania każdej przerwy.
- Funkcje TRAVEL i WAIT są „możliwość wywłaszczania”: w trakcie tego przejścia można je kilka razy przerwać. Klienci mogą założyć, że podróż odbywa się „jak najszybciej” i że pozostały czas zapełnia się „oczekiwaniem”.
A (złożony) przykład:
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
Zapis JSON |
---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
Pola | |
---|---|
vehicleIndex |
Pojazd poruszający się po trasie, określony za pomocą indeksu w źródle |
vehicleLabel |
Etykieta pojazdu obsługującego tę trasę, równa |
vehicleStartTime |
Godzina, o której pojazd rozpoczyna trasę. Sygnatura czasowa w formacie „Zulu” RFC3339 UTC z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: |
vehicleEndTime |
Czas, o którym pojazd kończy trasę. Sygnatura czasowa w formacie „Zulu” RFC3339 UTC z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: |
visits[] |
Uporządkowana sekwencja wizyt reprezentująca trasę. Odwiedziny[i] to i-te odwiedziny na trasie. Jeśli to pole jest puste, pojazd jest uznawany za nieużywany. |
transitions[] |
Uporządkowana lista przejść na trasie. |
hasTrafficInfeasibilities |
Jeśli zasada
Przyjazd na stację next_visit prawdopodobnie odbędzie się później niż bieżące okno ze względu na wydłużony szacowany czas podróży o |
routePolyline |
Zakodowana reprezentacja trasy za pomocą linii łamanej. To pole jest wypełniane tylko wtedy, gdy |
breaks[] |
Zaplanowane przerwy na pojazd poruszający się na tej trasie. Sekwencja |
metrics |
Dane o czasie trwania, odległości i obciążeniu na tej trasie. Pola pola |
routeCosts |
Koszt trasy z podziałem na pola żądań związane z kosztami. Klucze to ścieżki proto względem danych wejściowych OptimizeToursRequest, np. „model.shipments.pickups.cost”, a wartościami są łączny koszt wygenerowany przez odpowiednie pole kosztu, zagregowany na całej trasie. Inaczej mówiąc, koszt["model.shipments.pickups.cost"] to suma wszystkich kosztów odbioru na trasie. Wszystkie koszty zdefiniowane w modelu są raportowane tutaj szczegółowo z wyjątkiem kosztów związanych z atrybutami przejścia, które od 2022 r. są raportowane tylko w postaci zbiorczej. Obiekt zawierający listę par |
routeTotalCost |
Całkowity koszt trasy. Suma wszystkich kosztów na mapie kosztów. |
Wejdź na
Wizyta wykonana podczas trasy. Ta wizyta odpowiada odbiorze lub dostawie produktu Shipment
.
Zapis JSON |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
Pola | |
---|---|
shipmentIndex |
Indeks pola |
isPickup |
Jeśli ma wartość prawda, wizyta odpowiada odbiorowi |
visitRequestIndex |
Indeks |
startTime |
Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może przyjechać do miejsca wizyty wcześniej. Czas jest zgodny z tym ustawieniem: Sygnatura czasowa w formacie „Zulu” RFC3339 UTC z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: |
loadDemands |
Łączne zapotrzebowanie na wizytę po stronie jako suma przesyłki i żądania wizyty Obiekt zawierający listę par |
detour |
Dodatkowy czas odjazdu ze względu na przesyłki odwiedzone na trasie przed wizytą i potencjalny czas oczekiwania wynikający z przedziałów czasowych. Jeśli wizyta obejmuje dostawę, zmiana trasy jest obliczana na podstawie odpowiedniej wizyty i równa się:
W innych przypadkach jest obliczany na podstawie
Czas trwania w sekundach z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „ |
shipmentLabel |
Kopia odpowiedniej wartości |
visitLabel |
Kopia odpowiedniej wartości |
Przejście
Przejście między dwoma zdarzeniami na trasie. Zobacz opis aplikacji ShipmentRoute
.
Jeśli pojazd nie ma startLocation
lub endLocation
, odpowiednie dane dotyczące podróży mają wartość 0.
Zapis JSON |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
Pola | |
---|---|
travelDuration |
Czas podróży podczas tego przejścia. Czas trwania w sekundach z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „ |
travelDistanceMeters |
Dystans pokonany podczas przejścia. |
trafficInfoUnavailable |
Jeśli żądanie informacji o ruchu jest wysyłane przez interfejs |
delayDuration |
Suma czasów opóźnienia zastosowanych do tego przejścia. W razie potrzeby opóźnienie zaczyna się dokładnie Czas trwania w sekundach z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „ |
breakDuration |
Suma czasu trwania przerw występujących podczas tego przejścia (jeśli mają miejsce). Szczegółowe informacje o godzinie i czasie trwania każdej przerwy są przechowywane w usłudze Czas trwania w sekundach z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „ |
waitDuration |
Czas oczekiwania podczas tego przejścia. Czas oczekiwania odpowiada czasowi bezczynności i nie uwzględnia czasu przerwy. Pamiętaj też, że ten czas oczekiwania można podzielić na kilka niesąsiadujących ze sobą przedziałów. Czas trwania w sekundach z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „ |
totalDuration |
Całkowity czas trwania przejścia podany dla wygody użytkowników. Jest równa:
Czas trwania w sekundach z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „ |
startTime |
Godzina rozpoczęcia tego przejścia. Sygnatura czasowa w formacie „Zulu” RFC3339 UTC z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: |
routePolyline |
Zakodowana reprezentacja trasy łamanej, która odbywa się podczas przejścia. To pole jest wypełniane tylko wtedy, gdy |
vehicleLoads |
Liczba ładunków pojazdów podczas tej zmiany w przypadku każdego typu, który pojawia się w dokumencie Obciążenia podczas pierwszego przejścia to początkowe obciążenie na trasie pojazdu. Następnie po każdej wizycie Obiekt zawierający listę par |
EncodedPolyline
Zakodowana reprezentacja linii łamanej. Więcej informacji o kodowaniu w liniach łamanych znajdziesz tutaj: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
Zapis JSON |
---|
{ "points": string } |
Pola | |
---|---|
points |
Ciąg znaków reprezentujący zakodowane punkty linii łamanej. |
Przerwa
Dane reprezentujące wykonanie przerwy.
Zapis JSON |
---|
{ "startTime": string, "duration": string } |
Pola | |
---|---|
startTime |
Godzina rozpoczęcia przerwy. Sygnatura czasowa w formacie „Zulu” RFC3339 UTC z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: |
duration |
Czas trwania przerwy. Czas trwania w sekundach z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „ |