ShipmentRoute

Trasę pojazdu można rozłożyć na osi czasu w ten sposób (zakładamy, że jest n wizyt):

  |            |            |          |       |  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

Trzeba pamiętać, że:

  • „zdarzenia punktowe”, takie jak początek i koniec podróży pojazdu, a także początek i koniec każdej wizyty (tj. przyjazd i odjazd). Mają miejsce w danej sekundzie.
  • „przedziały czasu”, takie jak same odwiedziny i przejście między nimi. Chociaż przedziały czasowe mogą czasami mieć zerowy czas trwania, czyli np. początek i koniec w tej samej sekundzie, często mają dodatni czas trwania.

Niezmienniki:

  • Jeśli jest n wizyt, to jest n + 1 przejść.
  • Wizyta jest zawsze otoczona przez przejście poprzedzające ją (ten sam indeks) i przejście następujące po niej (indeks + 1).
  • Po uruchomieniu pojazdu zawsze następuje przejście #0.
  • Koniec pojazdu jest zawsze poprzedzony przez przejście #n.

Oto, co się dzieje podczas TransitionVisit:

---+-------------------------------------+-----------------------------+-->
   |           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

Na koniec opisujemy, jak można ustawić elementy TRAVEL, BREAKS, DELAY i WAIT podczas przejścia.

  • Nie nakładają się.
  • OPÓŹNIENIE jest niepowtarzalne i musi przypadać w ciągłym okresie tuż przed kolejną wizytą (lub wyłączeniem pojazdu). Dzięki temu wystarczy znać czas trwania opóźnienia, aby poznać godzinę jego rozpoczęcia i zakończenia.
  • PRZERWA to sąsiadujące ze sobą okresy, które nie nakładają się na siebie. Odpowiedź zawiera czas rozpoczęcia i czas trwania każdej przerwy.
  • TRAVEL i WAIT są „wymienne”: mogą być przerywane kilka razy podczas tego przejścia. Klienci mogą zakładać, że podróże odbywają się „jak najszybciej”, a czas oczekiwania zostanie wydłużony.

Przykład A (złożony):

                               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 (Visit)
    }
  ],
  "transitions": [
    {
      object (Transition)
    }
  ],
  "hasTrafficInfeasibilities": boolean,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "breaks": [
    {
      object (Break)
    }
  ],
  "metrics": {
    object (AggregatedMetrics)
  },
  "routeCosts": {
    string: number,
    ...
  },
  "routeTotalCost": number
}
Pola
vehicleIndex

integer

Pojazd wykonujący trasę, zidentyfikowany przez swój indeks w źródle ShipmentModel.

vehicleLabel

string

Etykieta pojazdu poruszającego się po tej trasie, równa ShipmentModel.vehicles(vehicleIndex).label, jeśli została określona.

vehicleStartTime

string (Timestamp format)

Godzina, o której pojazd rozpoczyna trasę.

Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

vehicleEndTime

string (Timestamp format)

Czas, w którym pojazd kończy trasę.

Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

visits[]

object (Visit)

Uporządkowana sekwencja wizyt reprezentująca trasę. visits[i] to i-ta wizyta na trasie. Jeśli to pole jest puste, pojazd jest uważany za nieużywany.

transitions[]

object (Transition)

Uporządkowana lista przejść na trasie.

hasTrafficInfeasibilities

boolean

Gdy OptimizeToursRequest.consider_road_traffic jest ustawione na wartość true, to pole wskazuje, że niezgodności w czasie trwania trasy są przewidywane na podstawie szacunków czasu przejazdu na podstawie natężenia ruchu. Może nie wystarczyć czasu na przebycie trasy z uwzględnieniem natężenia ruchu, opóźnień i przerwy między wizytami przed pierwszą wizytą lub po ostatniej, przy zachowaniu limitu czasu wizyty i czasu pracy pojazdu. Na przykład

  startTime(previous_visit) + duration(previous_visit) +
  travelDuration(previous_visit, next_visit) > startTime(next_visit)

Przyjazd na stronie next_visit prawdopodobnie nastąpi później niż w bieżącym oknie czasowym ze względu na zwiększony szacowany czas podróży (travelDuration(previous_visit, next_visit)) ze względu na korki. Przerwa może też nakładać się na wizytę z powodu wydłużenia szacowanego czasu podróży oraz ograniczeń dotyczących czasu wizyty lub przerwy.

routePolyline

object (EncodedPolyline)

Zakodowana reprezentacja trasy w postaci linii łamanej. To pole jest wypełniane tylko wtedy, gdy OptimizeToursRequest.populate_polylines ma wartość true (prawda).

breaks[]

object (Break)

Przerwy zaplanowane dla pojazdu na tej trasie. Sekwencja breaks reprezentuje przedziały czasu, z których każdy zaczyna się w odpowiednim startTime i trwa duration sekund.

metrics

object (AggregatedMetrics)

Dane dotyczące czasu trwania, odległości i obciążenia na tej trasie. Pola AggregatedMetrics są sumowane dla wszystkich ShipmentRoute.transitions lub ShipmentRoute.visits, w zależności od kontekstu.

routeCosts

map (key: string, value: number)

Koszt trasy z podziałem na pola żądania związane z kosztami. Klucze są ścieżkami proto w odniesieniu do danych wejściowych OptimizeToursRequest, np. „model.shipments.pickups.cost”, a ich wartości to łączny koszt wygenerowany przez odpowiednie pole kosztu, zsumowany dla całej trasy. Innymi słowy, costs["model.shipments.pickups.cost"] to suma wszystkich kosztów odbioru na trasie. Wszystkie koszty zdefiniowane w modelu są tutaj szczegółowo raportowane, z wyjątkiem kosztów związanych z atributem TransitionAttributes, które od 1 stycznia 2022 r. są raportowane tylko w sposób zagregowany.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

routeTotalCost

number

Łączny koszt trasy. Suma wszystkich kosztów na mapie kosztów.

Odwiedź

Wizyta przeprowadzona na trasie. Ta wizyta odpowiada odbiórowi lub dostawie: Shipment.

Zapis JSON
{
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "detour": string,
  "shipmentLabel": string,
  "visitLabel": string,
  "injectedSolutionLocationToken": integer
}
Pola
shipmentIndex

integer

Indeks pola shipments w źródle ShipmentModel.

isPickup

boolean

Jeśli ma wartość prawda, wizyta odpowiada odbiorze produktu Shipment. W przeciwnym razie odpowiada on dostawie.

visitRequestIndex

integer

Indeks VisitRequest w polu odbioru lub dostawy na: Shipment (patrz isPickup).

startTime

string (Timestamp format)

Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może pojawić się na miejscu wcześniej. Czasy są zgodne z ShipmentModel.

Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

loadDemands

map (key: string, value: object (Load))

Łączne obciążenie związane z wizytami jako suma dostawy i żądania wizyty loadDemands. Jeśli wizyta to dostawa, wartości są ujemne. Popyt jest raportowany w przypadku tych samych typów co Transition.loads (patrz to pole).

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

detour

string (Duration format)

Dodatkowy czas objazdu ze względu na wizyty w miejscach na trasie przed wizytą oraz potencjalny czas oczekiwania spowodowany oknami czasowymi. Jeśli wizyta to dostawa, objazd jest obliczany na podstawie odpowiedniej wizyty odbioru i jest równy:

startTime(delivery) - startTime(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

W przeciwnym razie jest obliczana na podstawie pojazdu startLocation i jest równa:

startTime - vehicleStartTime - travel duration from
the vehicle's `startLocation` to the visit.

Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „s”. Przykład: "3.5s".

shipmentLabel

string

Kopia odpowiedniego elementu Shipment.label, jeśli został on podany w elemencie Shipment.

visitLabel

string

Kopia odpowiedniego pola VisitRequest.label, jeśli określono ją w zasadzie VisitRequest.

injectedSolutionLocationToken

integer

Nieprzejrzysty token reprezentujący informacje o lokalizacji wizyty.

To pole może być wypełniane w przypadku wizyt na trasach wyników, gdy w przypadku tej wizyty pole VisitRequest.avoid_u_turns ma wartość prawda lub gdy w żądaniu OptimizeToursRequest pole ShipmentModel.avoid_u_turns ma wartość prawda.

Przejście

Przejście między 2 zdarzeniami na trasie. Zobacz opis ShipmentRoute.

Jeśli pojazd nie ma wartości startLocation ani 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 (EncodedPolyline)
  },
  "vehicleLoads": {
    string: {
      object (VehicleLoad)
    },
    ...
  }
}
Pola
travelDuration

string (Duration format)

Czas trwania podróży podczas tej zmiany.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

travelDistanceMeters

number

Odległość przebyta podczas przejścia.

trafficInfoUnavailable

boolean

Jeśli żądanie ruchu pochodzi z OptimizeToursRequest.consider_road_traffic i nie można pobrać informacji o ruchu dla Transition, ta wartość logiczna ma wartość Prawda. Może to być tymczasowe (rzadkie problemy z serwerami ruchu w czasie rzeczywistym) lub trwałe (brak danych dla tej lokalizacji).

delayDuration

string (Duration format)

Suma czasów opóźnienia zastosowanych do tego przejścia. Jeśli tak, opóźnienie zaczyna się dokładnie delayDuration sekundy przed następnym zdarzeniem (wizytą lub zakończeniem pojazdu). Zobacz TransitionAttributes.delay.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

breakDuration

string (Duration format)

Suma czasu trwania przerw w trakcie tego przejścia (jeśli występują). Szczegóły dotyczące czasu rozpoczęcia i długości trwania każdej przerwy są przechowywane w ShipmentRoute.breaks.

Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „s”. Przykład: "3.5s".

waitDuration

string (Duration format)

Czas oczekiwania podczas tego przejścia. Czas oczekiwania odpowiada czasowi bezczynności i nie uwzględnia przerwy. Pamiętaj też, że czas oczekiwania może być podzielony na kilka nieciągłych przedziałów.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

totalDuration

string (Duration format)

Łączny czas trwania przejścia, podany dla wygody. Jest ona równa:

  • następna wizyta startTime (lub vehicleEndTime, jeśli jest to ostatnia zmiana) – startTime tej zmiany;
  • jeśli ShipmentRoute.has_traffic_infeasibilities ma wartość fałsz, dodatkowo zawiera: `totalDuration = travelDuration + delayDuration
  • breakDuration + waitDuration`.

Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „s”. Przykład: "3.5s".

startTime

string (Timestamp format)

Czas rozpoczęcia tego przejścia.

Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z".

routePolyline

object (EncodedPolyline)

Zakodowana reprezentacja linii łamanej trasy, która wystąpiła podczas przejścia. To pole jest wypełniane tylko wtedy, gdy populateTransitionPolylines ma wartość Prawda.

vehicleLoads

map (key: string, value: object (VehicleLoad))

Ładunki pojazdów w trakcie tej zmiany dotyczące każdego typu pojazdu, który pojawia się w klastrze Vehicle.load_limits tego pojazdu lub ma wartość inną niż zeroShipment.load_demands w przypadku niektórych przesyłek realizowanych na tej trasie.

Ładunki występujące podczas pierwszego przejścia to początkowe wczytywanie trasy pojazdu. Następnie po każdej wizycie wartości loadDemands są dodawane lub odejmowane, aby uzyskać wartości ładunków dla następnego przejścia, w zależności od tego, czy wizyta była odbiorem czy dostawą.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

EncodedPolyline

Zakodowana reprezentacja linii złożonej. Więcej informacji o kodowaniu łańcucha znaków 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

string

Ciąg znaków reprezentujący zakodowane punkty linii łamanej.

Przerwa

Dane reprezentujące wykonanie przerwy.

Zapis JSON
{
  "startTime": string,
  "duration": string
}
Pola
startTime

string (Timestamp format)

Czas rozpoczęcia przerwy.

Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

duration

string (Duration format)

Czas trwania przerwy.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".