ShipmentRoute

Trasa pojazdu można podzielić na osi czasu w następujący 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 określonej 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, występują przejścia n+1.
  • Odwiedziny są zawsze otoczone przejściem przed nią (ten sam indeks) i przejściem po niej (indeks + 1).
  • Po uruchomieniu pojazdu zawsze następuje przejście nr 0.
  • Koniec pojazdu jest zawsze poprzedzony przejściem nr n.

Gdy powiększasz widok, pokazujemy, co się dzieje podczas wyświetlania elementów 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

Na koniec zobacz, jak można zorganizować TRAVEL, PRZERW, OPÓŹNIENIA i OCZEKIWANIE w trakcie 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ę rozpoczęcia i zakończenia.
  • BREAKS są ze sobą przylegające, niepokrywające się okresy. Odpowiedź określa czas rozpoczęcia i czas trwania każdej przerwy.
  • TRAVEL (TRAVEL) i WAIT (opóźnienia) są „wywłaszczeniowe” – mogą zostać kilka razy przerwane w trakcie tego przejścia. Klienci mogą zakładać, że podróże odbywają się „jak najszybciej” i „poczekaj”. wypełni pozostały czas.

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 pokonujący trasę, określony za pomocą indeksu 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 RFC3339 UTC „Zulu” z rozdzielczością nanosekundową 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 zakończenia trasy przez pojazd.

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

visits[]

object (Visit)

Uporządkowana sekwencja wizyt reprezentująca trasę. wizyta[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

Jeśli zasada OptimizeToursRequest.consider_road_traffic ma wartość Prawda, to pole wskazuje, że niespójności w czasie podróży są prognozowane na podstawie szacunków czasu podróży na podstawie natężenia ruchu. Może brakować czasu na skoordynowanie podróży dostosowanej do natężenia ruchu, opóźnień i przerw między wizytami, przed pierwszą wizytą lub po ostatniej wizycie, a jednocześnie niezmiennie musi spełniać wymagania związane z wizytą i pojazdem. 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ż pokrywać się z wizytą ze względu na dłuższy szacowany czas podróży oraz ograniczenia przedziałów czasowych 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 przedstawia przedziały czasowe. Każdy z nich rozpoczyna się w odpowiednim momencie startTime i trwa duration s.

metrics

object (AggregatedMetrics)

Dane o czasie trwania, dystansie i obciążeniu tej trasy. Pola AggregatedMetrics są sumowane dla wszystkich elementów 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 to ścieżki proto, względem danych wejściowych OptimizeToursRequest, np. „model.shipments.pickups.cost”, a ich wartości to łączny koszt wygenerowany przez odpowiednie pole kosztu, zagregowany dla całej trasy. Inaczej mówiąc, koszt["model.shipments.pickups.cost"] to suma wszystkich kosztów odbioru na trasie. Wszystkie koszty zdefiniowane w modelu są uwzględnione w szczegółowym raporcie z wyjątkiem kosztów związanych z atrybutami przejścia, które od 2022 roku są raportowane tylko w postaci zbiorczej.

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

routeTotalCost

number

Całkowity koszt danej 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
}
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 ona 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. Godziny są zgodne z ShipmentModel.

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową 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 dotyczy dostawy, wartości są ujemne. Raportowane są żądania dotyczące tych samych typów co pole 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 przesyłki odwiedzone na trasie przed wizytą oraz potencjalny czas oczekiwania związany z przedziałami czasowymi. Jeśli wizyta dotyczy dostawy, zmiana trasy jest obliczana na podstawie odpowiedniej wizyty z odbiorem i ma wartość:

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

W przeciwnym razie jest obliczany na podstawie pojazdu startLocation. Ma on wartość:

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

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

shipmentLabel

string

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

visitLabel

string

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

Przejście

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

Jeśli pojazd nie ma startLocation lub endLocation, odpowiadające mu 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 podróży w trakcie tej zmiany.

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

travelDistanceMeters

number

Dystans pokonany 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 trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

breakDuration

string (Duration format)

Suma czasu trwania przerw w trakcie tego przejścia (jeśli występują). Szczegółowe informacje o czasie rozpoczęcia i czasie trwania każdej przerwy są przechowywane w ShipmentRoute.breaks.

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

waitDuration

string (Duration format)

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

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

totalDuration

string (Duration format)

Całkowity czas trwania zmiany podany dla wygody użytkowników. Jest ona równa:

  • następna wizyta startTime (lub vehicleEndTime, jeśli jest to ostatnie przejście) – startTime dla 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 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

startTime

string (Timestamp format)

Godzina rozpoczęcia tego przejścia.

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

routePolyline

object (EncodedPolyline)

Zakodowana reprezentacja linii łamanej trasy, która była następnie używana podczas przejścia. To pole jest wypełniane tylko wtedy, gdy populateTransitionPolylines ma wartość true (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, loadDemands wizyty jest dodawane lub odejmowane, aby uzyskać obciążenie 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 łamanej. Więcej informacji o kodowaniu linii ł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

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 RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

duration

string (Duration format)

Czas trwania przerwy.

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