ShipmentRoute

Il percorso di un veicolo può essere scomposto lungo l'asse temporale, in questo modo (presupponiamo che siano state effettuate n visite):

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

Tieni presente che facciamo differenza tra:

  • "eventi puntuali", come l'inizio e la fine del veicolo e l'inizio e la fine di ogni visita (ovvero arrivo e partenza). Si verificano in un determinato secondo.
  • "intervalli di tempo", come le visite stesse e la transizione tra le visite. Anche se a volte gli intervalli di tempo possono avere una durata pari a zero, ovvero iniziare e terminare allo stesso secondo, spesso hanno una durata positiva.

Invarianti:

  • Se ci sono n visite, sono presenti n + 1 transizioni.
  • Una visita è sempre circondata da una transizione prima di questa (stesso indice) e da una transizione successiva (indice + 1).
  • L'avvio del veicolo è sempre seguito dalla transizione n. 0.
  • La fine del veicolo è sempre preceduta dalla transizione #n.

Aumentando lo zoom, ecco cosa succede durante Transition e 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

Infine, ecco come possono essere organizzati VIAGGI, PAUSA, RITARDO e ATTESA durante una transizione.

  • Non si sovrappongono.
  • Il ritardo è univoco e deve essere un periodo di tempo contiguo subito prima della prossima visita (o della fine del veicolo). Pertanto, è sufficiente conoscere la durata del ritardo per conoscere l'ora di inizio e di fine.
  • I BREAKS sono periodi di tempo contigui e non sovrapposti. La risposta specifica l'ora di inizio e la durata di ogni interruzione.
  • VIAGGI e ATTESA sono "prerilasciabili": possono essere interrotti più volte durante questa transizione. I clienti possono presumere che il viaggio avvenga "il prima possibile" e che l'"attesa" riempia il tempo rimanente.

Esempio (complesso):

                               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     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Rappresentazione 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
}
Campi
vehicleIndex

integer

Veicolo che esegue il percorso, identificato dal proprio indice nell'origine ShipmentModel.

vehicleLabel

string

Etichetta del veicolo che sta effettuando questo percorso, uguale a ShipmentModel.vehicles(vehicleIndex).label, se specificata.

vehicleStartTime

string (Timestamp format)

L'ora in cui il veicolo inizia il percorso.

Un timestamp in formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

vehicleEndTime

string (Timestamp format)

L'ora in cui il veicolo termina il percorso.

Un timestamp in formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

visits[]

object (Visit)

Sequenza ordinata di visite che rappresenta un itinerario. Visit[i] è la i-esima visita nel percorso. Se questo campo è vuoto, il veicolo è considerato inutilizzato.

transitions[]

object (Transition)

Elenco ordinato di transizioni per il percorso.

hasTrafficInfeasibilities

boolean

Se OptimizeToursRequest.consider_road_traffic è impostato su true, questo campo indica che vengono previste incongruenze nella tempistica del percorso utilizzando le stime della durata del viaggio basate sul traffico. Potrebbe non essere sufficiente tempo per completare la corsa adattata al traffico, i ritardi e le pause tra una visita e l'altra, prima o dopo l'ultima visita, soddisfacendo comunque la visita e gli intervalli di tempo del veicolo. Ad esempio:

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

L'arrivo a next_visit avverrà probabilmente dopo l'attuale finestra temporale a causa dell'aumento della stima del tempo di percorrenza (travelDuration(previous_visit, next_visit)) a causa del traffico. Inoltre, una pausa potrebbe essere costretta a sovrapporsi a una visita a causa di un aumento delle stime dei tempi di percorrenza e di restrizioni per le pause e le visite.

routePolyline

object (EncodedPolyline)

La rappresentazione della polilinea codificata della route. Questo campo viene compilato solo se OptimizeToursRequest.populate_polylines è impostato su true.

breaks[]

object (Break)

Soste programmate per il veicolo che sta effettuando questo percorso. La sequenza breaks rappresenta gli intervalli di tempo, ciascuno a partire dal valore startTime corrispondente e con una durata di duration secondi.

metrics

object (AggregatedMetrics)

Metriche relative a durata, distanza e carico per questo percorso. I campi di AggregatedMetrics vengono sommati per tutti i campi ShipmentRoute.transitions o ShipmentRoute.visits, a seconda del contesto.

routeCosts

map (key: string, value: number)

Costo del percorso suddiviso in base ai campi di richiesta correlati al costo. Le chiavi sono percorsi di protocollo, relative all'input OptimizeToursRequest, ad esempio "model.shipments.pickups.cost", e i valori sono il costo totale generato dal campo del costo corrispondente, aggregato per l'intero percorso. In altre parole, i costi["model.shipments.pickups.cost"] sono la somma di tutti i costi di ritiro lungo il percorso. Tutti i costi definiti nel modello sono riportati in dettaglio qui, ad eccezione dei costi relativi a TransizioneAttributes che sono riportati solo in modo aggregato a partire dal 1° gennaio 2022.

Un oggetto contenente un elenco di "key": value coppie. Esempio: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

routeTotalCost

number

Costo totale del percorso. La somma di tutti i costi nella mappa dei costi.

Visita

Una visita eseguita durante un percorso. Questa visita corrisponde a un ritiro o una consegna di Shipment.

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

integer

Indice del campo shipments nell'origine ShipmentModel.

isPickup

boolean

Se il valore è true, la visita corrisponde al ritiro di un Shipment. In caso contrario, corrisponde a una consegna.

visitRequestIndex

integer

Indice di VisitRequest nel campo di ritiro o consegna di Shipment (vedi isPickup).

startTime

string (Timestamp format)

Ora in cui inizia la visita. Tieni presente che il veicolo potrebbe arrivare prima di questo orario nel luogo in cui ti trovi. Gli orari sono coerenti con il ShipmentModel.

Un timestamp in formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

loadDemands

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

Domanda del carico totale delle visite come somma della spedizione e della richiesta di visita loadDemands. I valori sono negativi se la visita è una consegna. Le richieste vengono registrate per gli stessi tipi di Transition.loads (vedi questo campo).

Un oggetto contenente un elenco di "key": value coppie. Esempio: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

detour

string (Duration format)

Tempo di deviazione aggiuntivo dovuto alle spedizioni visitate lungo il percorso prima della visita e al potenziale tempo di attesa generato dalle finestre temporali. Se la visita è una consegna, la deviazione viene calcolata in base alla visita di ritiro corrispondente ed è pari a:

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

In caso contrario, viene calcolato dal veicolo startLocation ed è uguale a:

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

Una durata in secondi con un massimo di nove cifre frazionarie, che termina con "s". Esempio: "3.5s".

shipmentLabel

string

Copia del valore Shipment.label corrispondente, se specificato in Shipment.

visitLabel

string

Copia del valore VisitRequest.label corrispondente, se specificato in VisitRequest.

Transizioni

Transizione tra due eventi lungo il percorso. Vedi la descrizione di ShipmentRoute.

Se il veicolo non dispone di un startLocation e/o endLocation, le metriche di viaggio corrispondenti sono 0.

Rappresentazione JSON
{
  "travelDuration": string,
  "travelDistanceMeters": number,
  "trafficInfoUnavailable": boolean,
  "delayDuration": string,
  "breakDuration": string,
  "waitDuration": string,
  "totalDuration": string,
  "startTime": string,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "vehicleLoads": {
    string: {
      object (VehicleLoad)
    },
    ...
  }
}
Campi
travelDuration

string (Duration format)

Durata del viaggio durante questa transizione.

Una durata in secondi con un massimo di nove cifre frazionarie, che termina con "s". Esempio: "3.5s".

travelDistanceMeters

number

Distanza percorsa durante la transizione.

trafficInfoUnavailable

boolean

Quando il traffico viene richiesto tramite OptimizeToursRequest.consider_road_traffic e non è stato possibile recuperare le informazioni sul traffico per un Transition, questo valore booleano è impostato su true. Può trattarsi di un problema temporaneo (raro problema nei server del traffico in tempo reale) o permanente (nessun dato per questa località).

delayDuration

string (Duration format)

Somma delle durate del ritardo applicate a questa transizione. Se presente, il ritardo inizia esattamente delayDuration secondi prima dell'evento successivo (visita o fine del veicolo). Leggi i TransitionAttributes.delay.

Una durata in secondi con un massimo di nove cifre frazionarie, che termina con "s". Esempio: "3.5s".

breakDuration

string (Duration format)

Somma dell'eventuale durata delle interruzioni che si sono verificate durante questa transizione. I dettagli relativi all'ora di inizio e alla durata di ogni interruzione vengono archiviati in ShipmentRoute.breaks.

Una durata in secondi con un massimo di nove cifre frazionarie, che termina con "s". Esempio: "3.5s".

waitDuration

string (Duration format)

Tempo di attesa durante questa transizione. La durata di attesa corrisponde al tempo di inattività e non include il tempo di interruzione. Tieni inoltre presente che questo tempo di attesa può essere suddiviso in più intervalli non contigui.

Una durata in secondi con un massimo di nove cifre frazionarie, che termina con "s". Esempio: "3.5s".

totalDuration

string (Duration format)

Durata totale della transizione, fornita per praticità. Questo equivale a:

  • prossima visita startTime (o vehicleEndTime se si tratta dell'ultima transizione): le startTime di questa transizione;
  • Se ShipmentRoute.has_traffic_infeasibilities è falso, viene applicato anche quanto segue: "totalDuration = travelDuration + lateDuration
  • breakDuration + WaitDuration".

Una durata in secondi con un massimo di nove cifre frazionarie, che termina con "s". Esempio: "3.5s".

startTime

string (Timestamp format)

Ora di inizio di questa transizione.

Un timestamp in formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

routePolyline

object (EncodedPolyline)

La rappresentazione codificata della polilinea seguita durante la transizione. Questo campo viene compilato solo se populateTransitionPolylines è impostato su true.

vehicleLoads

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

Carichi dei veicoli durante questa transizione, per ogni tipo presente nel Vehicle.load_limits di questo veicolo o con Shipment.load_demands diversi da zero su alcune spedizioni eseguite su questo percorso.

I carichi durante la prima transizione corrispondono ai carichi di partenza del percorso del veicolo. Quindi, dopo ogni visita, i loadDemands della visita vengono aggiunti o sottratti per ottenere i caricamenti della transizione successiva, a seconda che la visita fosse un ritiro o una consegna.

Un oggetto contenente un elenco di "key": value coppie. Esempio: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

EncodedPolyline

La rappresentazione codificata di una polilinea. Ulteriori informazioni sulla codifica delle poliline sono disponibili qui: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Rappresentazione JSON
{
  "points": string
}
Campi
points

string

Stringa che rappresenta i punti codificati della polilinea.

Pausa

Dati che rappresentano l'esecuzione di un'interruzione.

Rappresentazione JSON
{
  "startTime": string,
  "duration": string
}
Campi
startTime

string (Timestamp format)

Ora di inizio di una pausa.

Un timestamp in formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: "2014-10-02T15:01:23Z" e "2014-10-02T15:01:23.045123456Z".

duration

string (Duration format)

Durata di una pausa.

Una durata in secondi con un massimo di nove cifre frazionarie, che termina con "s". Esempio: "3.5s".