L'itinerario di un veicolo può essere scomposto, lungo l'asse temporale, in questo modo (supponiamo che ci siano 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 una distinzione tra:
- "eventi puntuali", come l'inizio e la fine del viaggio del veicolo e l'inizio e la fine di ogni visita (ovvero l'arrivo e la partenza). Si verificano in un determinato secondo.
- "intervalli di tempo", come le visite stesse e la transizione tra le visite. Sebbene gli intervalli di tempo possano a volte avere durata zero, ovvero iniziare e terminare nello stesso secondo, spesso hanno una durata positiva.
Invarianti:
- Se ci sono n visite, ci sono n+1 transizioni.
- Una visita è sempre preceduta da una transizione (stesso indice) e seguita da una transizione (indice + 1).
- L'avvio del veicolo è sempre seguito dalla transizione n. 0.
- La fine del veicolo è sempre preceduta dalla transizione n.
Ingrandendo, ecco cosa succede durante un Transition e un 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 i periodi di TRASFERIMENTO, PAUSE, RITARDO e ATTESA durante una transizione.
- Non si sovrappongono.
- Il RITARDO è univoco e deve essere un periodo di tempo contiguo immediatamente prima della visita successiva (o della fine del viaggio del veicolo). Pertanto, è sufficiente conoscere la durata del ritardo per conoscerne l'ora di inizio e di fine.
- Le PAUSE sono periodi di tempo contigui e non sovrapposti. La risposta specifica l'ora di inizio e la durata di ogni pausa.
- TRAVEL e WAIT sono "interrompibili": possono essere interrotti più volte durante questa transizione. I clienti possono presumere che il viaggio avvenga "il prima possibile" e che il "tempo di attesa" riempia il tempo rimanente.
Un 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 ( |
| Campi | |
|---|---|
vehicleIndex |
Veicolo che esegue il percorso, identificato dal relativo indice nell' |
vehicleLabel |
Etichetta del veicolo che esegue questa route, uguale a |
vehicleStartTime |
Ora in cui il veicolo inizia il suo percorso. Utilizza RFC 3339, in cui l'output generato è sempre normalizzato in base al fuso orario UTC e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: |
vehicleEndTime |
Ora in cui il veicolo termina il percorso. Utilizza RFC 3339, in cui l'output generato è sempre normalizzato in base al fuso orario UTC e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: |
visits[] |
Sequenza ordinata di visite che rappresentano un percorso. visits[i] è la i-esima visita del percorso. Se questo campo è vuoto, il veicolo viene considerato inutilizzato. |
transitions[] |
Elenco ordinato delle transizioni per l'itinerario. |
hasTrafficInfeasibilities |
Quando L'arrivo a next_visit avverrà probabilmente più tardi rispetto all'attuale finestra temporale a causa dell'aumento della stima del tempo di percorrenza |
routePolyline |
La rappresentazione della polilinea codificata del percorso. Questo campo viene compilato solo se il criterio |
breaks[] |
Pause programmate per il veicolo che esegue questo percorso. La sequenza |
metrics |
Metriche di durata, distanza e carico per questo percorso. I campi di |
vehicleFullness |
Campo Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro. |
routeCosts |
Costo dell'itinerario, suddiviso per campi della richiesta correlati al costo. Le chiavi sono i percorsi proto, relativi all'input OptimizeToursRequest, ad esempio "model.shipments.pickups.cost", e i valori sono il costo totale generato dal campo di costo corrispondente, aggregato sull'intero percorso. In altre parole, costs["model.shipments.pickups.cost"] è 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 TransitionAttributes che vengono riportati solo in modo aggregato a partire dal 01/01/2022. |
routeTotalCost |
Costo totale dell'itinerario. La somma di tutti i costi nella mappa dei costi. |
Visita
Una visita eseguita durante un percorso. Questa visita corrisponde a un ritiro o a una consegna di un Shipment.
| Rappresentazione JSON |
|---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
| Campi | |
|---|---|
shipmentIndex |
Indice del campo |
isPickup |
Se il valore è true, la visita corrisponde al ritiro di un |
visitRequestIndex |
Indice di |
startTime |
L'ora in cui inizia la visita. Tieni presente che il veicolo potrebbe arrivare prima di questo orario nella posizione della visita. Gli orari sono conformi al Utilizza RFC 3339, in cui l'output generato è sempre normalizzato in base al fuso orario UTC e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: |
loadDemands |
Domanda totale di carico delle visite come somma della spedizione e della richiesta di visita |
detour |
Tempo di deviazione aggiuntivo dovuto alle spedizioni visitate sul percorso prima della visita e al potenziale tempo di attesa indotto dalle finestre temporali. Se la visita è una consegna, la deviazione viene calcolata dalla visita di ritiro corrispondente ed è uguale a: In caso contrario, viene calcolato dal veicolo Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
shipmentLabel |
Copia del |
visitLabel |
Copia del |
injectedSolutionLocationToken |
Un token opaco che rappresenta le informazioni su un luogo visitato. Questo campo può essere compilato nelle visite degli itinerari dei risultati quando Sperimentale: per ulteriori dettagli, consulta la pagina https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request. |
Transizione
Transizione tra due eventi sul percorso. Vedi la descrizione di ShipmentRoute.
Se il veicolo non dispone di startLocation e/o endLocation, le metriche di viaggio corrispondenti sono pari a 0.
| Rappresentazione JSON |
|---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
| Campi | |
|---|---|
travelDuration |
Durata del viaggio durante questa transizione. Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
travelDistanceMeters |
Distanza percorsa durante la transizione. |
trafficInfoUnavailable |
Quando il traffico viene richiesto tramite |
delayDuration |
Somma delle durate del ritardo applicate a questa transizione. Se presente, il ritardo inizia esattamente Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
breakDuration |
Somma della durata delle interruzioni che si verificano durante questa transizione, se presenti. I dettagli sull'ora di inizio e sulla durata di ogni pausa vengono memorizzati in Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
waitDuration |
Tempo trascorso in attesa durante questa transizione. La durata dell'attesa corrisponde al tempo di inattività e non include il tempo di pausa. Tieni inoltre presente che questo tempo di attesa potrebbe essere suddiviso in diversi intervalli non contigui. Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
totalDuration |
Durata totale della transizione, fornita per praticità. È uguale a:
Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
startTime |
Ora di inizio di questa transizione. Utilizza RFC 3339, in cui l'output generato è sempre normalizzato in base al fuso orario UTC e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: |
routePolyline |
La rappresentazione della polilinea codificata del percorso seguito durante la transizione. Questo campo viene compilato solo se il criterio |
routeToken |
Solo output. Un token opaco che può essere passato all'SDK di navigazione per ricostruire il percorso durante la navigazione e, in caso di ricalcolo del percorso, rispettare l'intenzione originale al momento della creazione del percorso. Considera questo token come un blob opaco. Non confrontare il suo valore tra le richieste, in quanto potrebbe cambiare anche se il servizio restituisce esattamente lo stesso percorso. Questo campo viene compilato solo se il criterio |
vehicleLoads |
Carichi del veicolo durante questa transizione, per ogni tipo che compare nel I carichi durante la prima transizione sono i carichi iniziali dell'itinerario del veicolo. Poi, dopo ogni visita, i |
EncodedPolyline
La rappresentazione codificata di una polilinea. Per ulteriori informazioni sulla codifica polilineare, visita le pagine https://developers.google.com/maps/documentation/utilities/polylinealgorithm e https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
| Rappresentazione JSON |
|---|
{ "points": string } |
| Campi | |
|---|---|
points |
Stringa che rappresenta i punti codificati della polilinea. |
Pausa
Dati che rappresentano l'esecuzione di una pausa.
| Rappresentazione JSON |
|---|
{ "startTime": string, "duration": string } |
| Campi | |
|---|---|
startTime |
Ora di inizio di una pausa. Utilizza RFC 3339, in cui l'output generato è sempre normalizzato in base al fuso orario UTC e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: |
duration |
Durata di una pausa. Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
VehicleFullness
VehicleFullness è una metrica che calcola il livello di riempimento di un veicolo. Ogni campo VehicleFullness è compreso tra 0 e 1 e viene calcolato come rapporto tra un campo della metrica con limite (ad es. AggregatedMetrics.travel_distance_meters) e il relativo limite del veicolo (ad es. Vehicle.route_distance_limit), se esistente. In caso contrario, il rapporto di pienezza rimane non impostato. Se il limite è 0, il campo è impostato su 1. Nota: quando un percorso è soggetto a problemi di traffico, alcuni rapporti di riempimento grezzi potrebbero superare 1,0, ad esempio il veicolo potrebbe superare il limite di distanza. In questi casi, i valori di pienezza vengono limitati a 1.0.
| Rappresentazione JSON |
|---|
{ "maxFullness": number, "distance": number, "travelDuration": number, "activeDuration": number, "maxLoad": number, "activeSpan": number } |
| Campi | |
|---|---|
maxFullness |
Il valore massimo di tutti gli altri campi di questo messaggio. |
distance |
Il rapporto tra |
travelDuration |
Il rapporto tra [AggregatedMetrics.travel_duration_seconds][] e |
activeDuration |
Il rapporto tra [AggregatedMetrics.total_duration_seconds][] e |
maxLoad |
Il rapporto massimo tra tutti i tipi di [AggregatedMetrics.max_load][] e i rispettivi |
activeSpan |
Il rapporto (vehicleEndTime - vehicleStartTime) / (latestVehicleEndTime - earliestVehicleStartTime) per un determinato veicolo. Se il denominatore non è presente, viene utilizzato ( |