ShipmentRoute

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

integer

Pojazd poruszający się po trasie, określony za pomocą indeksu w źródle ShipmentModel.

vehicleLabel

string

Etykieta pojazdu obsługującego tę trasę, 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 „Zulu” RFC3339 UTC 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, 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: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

visits[]

object (Visit)

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

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 szacowanego czasu podróży na podstawie natężenia ruchu. Czas podróży dostosowany do natężenia ruchu, opóźnienia i przerwy między wizytami, przed pierwszą lub ostatnią wizytą może być niewystarczający na realizację wyświetleń i przedziałów czasowych pojazdu. Przykład:

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

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 travelDuration(previous_visit, next_visit) ze względu na natężenie ruchu. Przerwa może się też pokrywać z wizytą z powodu zwiększenia szacowanego czasu podróży oraz ograniczeń czasowych wizyt lub przerw.

routePolyline

object (EncodedPolyline)

Zakodowana reprezentacja trasy za pomocą linii łamanej. To pole jest wypełniane tylko wtedy, gdy OptimizeToursRequest.populate_polylines ma wartość Prawda.

breaks[]

object (Break)

Zaplanowane przerwy na pojazd poruszający się na tej trasie. Sekwencja breaks reprezentuje przedziały czasu, których każde rozpoczyna się w odpowiedniej wartości startTime i trwa duration s.

metrics

object (AggregatedMetrics)

Dane o czasie trwania, odległości i obciążeniu na tej trasie. Pola pola AggregatedMetrics są sumowane we wszystkich elementach ShipmentRoute.transitions lub ShipmentRoute.visits, w zależności od kontekstu.

routeCosts

map (key: string, value: number)

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 "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

routeTotalCost

number

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 (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 odbiorowi Shipment. W przeciwnym razie odpowiada ona wyświetleniu.

visitRequestIndex

integer

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

startTime

string (Timestamp format)

Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może przyjechać do miejsca wizyty wcześniej. Czas jest zgodny z tym ustawieniem: ShipmentModel.

Sygnatura czasowa w formacie „Zulu” RFC3339 UTC 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 zapotrzebowanie na wizytę po stronie jako suma przesyłki i żądania wizyty loadDemands. Wartości są ujemne, jeśli wizyta zakończyła się wyświetleniem. Żądania są raportowane dla tych samych typów co pole Transition.loads (zobacz to pole).

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

detour

string (Duration format)

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

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

W innych przypadkach jest obliczany na podstawie startLocation pojazdu i równa się:

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

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

shipmentLabel

string

Kopia odpowiedniej wartości Shipment.label, jeśli została określona w Shipment.

visitLabel

string

Kopia odpowiedniej wartości VisitRequest.label, jeśli została określona w VisitRequest.

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 (EncodedPolyline)
  },
  "vehicleLoads": {
    string: {
      object (VehicleLoad)
    },
    ...
  }
}
Pola
travelDuration

string (Duration format)

Czas podróży podczas tego przejścia.

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

travelDistanceMeters

number

Dystans pokonany podczas przejścia.

trafficInfoUnavailable

boolean

Jeśli żądanie informacji o ruchu jest wysyłane przez interfejs OptimizeToursRequest.consider_road_traffic, ale nie udało się pobrać informacji o ruchu dla parametru Transition, ta wartość logiczna ma wartość „true”. Może być to sytuacja przejściowa (rzadkie zacinanie się serwerów ruchu w czasie rzeczywistym) lub stała (brak danych dotyczących tej lokalizacji).

delayDuration

string (Duration format)

Suma czasów opóźnienia zastosowanych do tego przejścia. W razie potrzeby opóźnienie zaczyna się dokładnie delayDuration s przed następnym zdarzeniem (wizytą lub końcem pojazdu). Zobacz TransitionAttributes.delay.

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

breakDuration

string (Duration format)

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 ShipmentRoute.breaks.

Czas trwania w sekundach z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „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 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 „s”. Przykład: "3.5s".

totalDuration

string (Duration format)

Całkowity czas trwania przejścia podany dla wygody użytkowników. Jest równa:

  • na stronie startTime (lub vehicleEndTime, jeśli jest to ostatnie przejście) – jest to startTime tego przejścia.
  • jeśli ShipmentRoute.has_traffic_infeasibilities ma wartość fałsz, dodatkowo zostają zachowane te informacje: `totalDuration = travelDuration + delayDuration
  • breakDuration + czas oczekiwania`.

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

startTime

string (Timestamp format)

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: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

routePolyline

object (EncodedPolyline)

Zakodowana reprezentacja trasy łamanej, która odbywa się podczas przejścia. To pole jest wypełniane tylko wtedy, gdy populateTransitionPolylines ma wartość Prawda.

vehicleLoads

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

Liczba ładunków pojazdów podczas tej zmiany w przypadku każdego typu, który pojawia się w dokumencie Vehicle.load_limits tego pojazdu, lub w przypadku niektórych dostaw na tej trasie, które mają wartość Shipment.load_demands większą od zera.

Obciążenia podczas pierwszego przejścia to początkowe obciążenie na trasie pojazdu. Następnie po każdej wizycie loadDemands wizyty są dodawane lub odejmowane, aby uzyskać wczytanie następnego elementu 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 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

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)

Godzina rozpoczęcia przerwy.

Sygnatura czasowa w formacie „Zulu” RFC3339 UTC 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 z maksymalnie 9 cyframi po przecinku, kończącym się cyframi „s”. Przykład: "3.5s".