Package google.maps.routeoptimization.v1

Indice

RouteOptimization

Un servizio per ottimizzare i tour dei veicoli.

Validità di alcuni tipi di campi:

  • google.protobuf.Timestamp
    • Gli orari sono in tempo Unix: secondi dal 1970-01-01T00:00:00+00:00.
    • i secondi devono essere in [0, 253402300799], ad esempio in [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nano deve essere disattivato o impostato su 0.
  • google.protobuf.Duration
    • i secondi devono essere in [0, 253402300799], ad esempio in [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nano deve essere disattivato o impostato su 0.
  • google.type.LatLng
    • la latitudine deve essere [-90,0, 90,0].
    • la longitudine deve essere in [-180,0, 180,0].
    • almeno uno tra latitudine e longitudine deve essere diverso da zero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Ottimizza i tour dei veicoli per uno o più messaggi OptimizeToursRequest in gruppo.

Questo metodo è un'operazione a lunga esecuzione (LRO). Gli input per l'ottimizzazione (OptimizeToursRequest messaggi) e gli output (OptimizeToursResponse messaggi) vengono letti/scritti da e verso Cloud Storage nel formato specificato dall'utente. Come il metodo OptimizeTours, ogni OptimizeToursRequest contiene un ShipmentModel e restituisce un OptimizeToursResponse contenente ShipmentRoute, che sono un insieme di percorsi che devono essere eseguiti dai veicoli riducendo al minimo il costo complessivo.

Ambiti di autorizzazione

Richiede il seguente ambito OAuth:

  • https://www.googleapis.com/auth/cloud-platform
OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Invia un oggetto OptimizeToursRequest contenente un ShipmentModel e restituisce un OptimizeToursResponse contenente ShipmentRoute, che sono un insieme di percorsi che devono essere eseguiti dai veicoli riducendo al minimo il costo complessivo.

Un modello ShipmentModel è costituito principalmente da Shipment da eseguire e da Vehicle da utilizzare per trasportare gli Shipment. I ShipmentRoute assegnano Shipment ai Vehicle. Più precisamente, assegnano una serie di Visit a ciascun veicolo, dove un Visit corrisponde a un VisitRequest, ovvero un ritiro o una consegna a domicilio di un Shipment.

L'obiettivo è assegnare un valore di ShipmentRoute a Vehicle che riduca al minimo il costo totale se il costo ha molti componenti definiti nel ShipmentModel.

Ambiti di autorizzazione

Richiede il seguente ambito OAuth:

  • https://www.googleapis.com/auth/cloud-platform

AggregatedMetrics

Metriche aggregate per ShipmentRoute (ris. per OptimizeToursResponse per tutti gli elementi Transition e/o Visit (ovvero per tutti i ShipmentRoute).

Campi
performed_shipment_count

int32

Numero di spedizioni eseguite. Tieni presente che una coppia di ritiro e consegna viene conteggiata una sola volta.

travel_duration

Duration

Durata totale del viaggio per un percorso o una soluzione.

wait_duration

Duration

Durata totale di attesa per un percorso o una soluzione.

delay_duration

Duration

Durata totale del ritardo per una route o una soluzione.

break_duration

Duration

Durata totale delle interruzioni per un percorso o una soluzione.

visit_duration

Duration

Durata totale della visita per un percorso o una soluzione.

total_duration

Duration

La durata totale deve essere uguale alla somma di tutte le durate sopra indicate. Per le route, corrisponde anche a:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

Distanza da percorrere totale per un percorso o una soluzione.

max_loads

map<string, VehicleLoad>

Carico massimo raggiunto sull'intero percorso (ris. soluzione), per ciascuna delle quantità su questo percorso (rispettivamente la soluzione), calcolato come il massimo rispetto a tutti i valori di Transition.vehicle_loads (risp. ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Questo tipo non contiene campi.

Metadati delle operazioni per le chiamate BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Richiedi l'ottimizzazione in gruppo dei tour come operazione asincrona. Ogni file di input deve contenere un elemento OptimizeToursRequest, mentre ogni file di output conterrà un elemento OptimizeToursResponse. La richiesta contiene informazioni per leggere, scrivere e analizzare i file. Tutti i file di input e di output devono trovarsi all'interno dello stesso progetto.

Campi
parent

string

obbligatorio. Scegli come target il progetto e la località per effettuare una chiamata.

Formato: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Se non viene specificata alcuna località, viene scelta automaticamente una regione.

model_configs[]

AsyncModelConfig

obbligatorio. Informazioni di input/output per ogni modello di acquisto, ad esempio percorsi di file e formati di dati.

AsyncModelConfig

Informazioni per risolvere un modello di ottimizzazione in modo asincrono.

Campi
display_name

string

Campo facoltativo. Nome del modello definito dall'utente, può essere utilizzato come alias dagli utenti per tenere traccia dei modelli.

input_config

InputConfig

obbligatorio. Informazioni sul modello di input.

output_config

OutputConfig

obbligatorio. Le informazioni desiderate sulla posizione di output.

BatchOptimizeToursResponse

Questo tipo non contiene campi.

Risposta a BatchOptimizeToursRequest. Questo viene restituito nell'operazione a lunga esecuzione al termine dell'operazione.

BreakRule

Regole per creare pause per un veicolo (ad es. pause pranzo). Una pausa è un periodo di tempo contiguo durante il quale il veicolo rimane inattivo nella sua posizione attuale e non può effettuare alcuna visita. Può verificarsi un'interruzione:

  • durante il viaggio tra due visite (che include il tempo immediatamente prima o subito dopo una visita, ma non nel corso di una visita), nel qual caso estende il tempo di transito corrispondente tra le visite,
  • o prima dell'avvio del veicolo (il veicolo potrebbe non avviarsi nel mezzo di una pausa), nel qual caso non influisce sull'orario di avvio del veicolo.
  • o dopo la fine del veicolo (lo stesso vale per l'ora di fine).
Campi
break_requests[]

BreakRequest

Sequenza di interruzioni. Vedi il messaggio BreakRequest.

frequency_constraints[]

FrequencyConstraint

Potrebbero essere applicabili diversi FrequencyConstraint. Devono essere tutte soddisfatte dai BreakRequest di questo BreakRule. Leggi i FrequencyConstraint.

BreakRequest

La sequenza delle interruzioni (ovvero il loro numero e l'ordine) applicabile a ciascun veicolo deve essere nota in anticipo. I BreakRequest ripetuti definiscono questa sequenza nell'ordine in cui devono verificarsi. Le relative finestre temporali (earliest_start_time / latest_start_time) potrebbero sovrapporsi, ma devono essere compatibili con l'ordine (questa opzione è selezionata).

Campi
earliest_start_time

Timestamp

obbligatorio. Limite inferiore (incluso) all'inizio dell'interruzione.

latest_start_time

Timestamp

obbligatorio. Limite superiore (incluso) all'inizio dell'interruzione.

min_duration

Duration

obbligatorio. Durata minima dell'interruzione. Deve essere positivo.

FrequencyConstraint

Si può limitare ulteriormente la frequenza e la durata delle interruzioni specificate sopra applicando una frequenza minima delle interruzioni, ad esempio "Deve esserci una pausa di almeno 1 ora ogni 12 ore". Supponendo che questo possa essere interpretato come "In qualsiasi finestra temporale scorrevole di 12 ore, deve esserci almeno un'interruzione di almeno un'ora", l'esempio si traduce nel seguente FrequencyConstraint:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

La tempistica e la durata delle interruzioni nella soluzione rispetteranno tutti questi vincoli, oltre alle finestre temporali e alle durate minime già specificate in BreakRequest.

In pratica, un'FrequencyConstraint potrebbe essere applicata alle interruzioni non consecutive. Ad esempio, la tabella seguente rispetta l'esempio "1 h ogni 12 h":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Campi
min_break_duration

Duration

obbligatorio. Durata minima dell'interruzione per questo vincolo. Non negativo. Vedi la descrizione di FrequencyConstraint.

max_inter_break_duration

Duration

obbligatorio. Intervallo massimo consentito di qualsiasi intervallo di tempo nel percorso che non include almeno un'interruzione parziale di duration >= min_break_duration. Deve essere positivo.

DataFormat

Formati di dati per i file di input e di output.

Enum
DATA_FORMAT_UNSPECIFIED Valore non valido, il formato non deve essere UNSPECIFIED.
JSON JavaScript Object Notation.
PROTO_TEXT Formato di testo dei buffer di protocollo. Consulta la pagina https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Un limite che definisce la distanza massima che è possibile percorrere. Può essere duro o morbido.

Se viene definito un limite flessibile, è necessario definire sia soft_max_meters che cost_per_kilometer_above_soft_max e che non siano negativi.

Campi
max_meters

int64

Un limite fisso che limita la distanza a un massimo di max_meters. Il limite deve essere un numero non negativo.

soft_max_meters

int64

Un limite flessibile non applica un limite di distanza massima, ma se la violazione comporta un costo che somma gli altri costi definiti nel modello, con la stessa unità.

Se definito soft_max_meters, il valore deve essere inferiore a max_meters e non deve essere negativo.

cost_per_kilometer_above_soft_max

double

Costo per chilometro sostenuto se la distanza è superiore al limite di soft_max_meters. Il costo aggiuntivo è pari a 0 se la distanza è inferiore al limite, altrimenti la formula utilizzata per calcolare il costo è la seguente:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

Il costo deve essere un numero non negativo.

GcsDestination

Il percorso di Google Cloud Storage in cui verranno scritti i file di output.

Campi
uri

string

obbligatorio. URI Google Cloud Storage.

GcsSource

Il percorso di Google Cloud Storage da cui verrà letto il file di input.

Campi
uri

string

obbligatorio. URI di un oggetto Google Cloud Storage con il formato gs://bucket/path/to/object.

InjectedSolutionConstraint

Soluzione inserita nella richiesta, che include informazioni sulle visite che devono essere limitate e sulle relative modalità di limitazione.

Campi
routes[]

ShipmentRoute

Percorsi della soluzione da iniettare. Alcune route potrebbero essere omesse dalla soluzione originale. I percorsi e le spedizioni saltate devono soddisfare le ipotesi di validità di base elencate per injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Saltate spedizioni della soluzione da iniettare. Alcuni potrebbero essere omessi dalla soluzione originale. Controlla il campo routes.

constraint_relaxations[]

ConstraintRelaxation

Per zero o più gruppi di veicoli, specifica quando e quanto allentare i vincoli. Se questo campo è vuoto, tutti i percorsi dei veicoli non vuoti sono completamente limitati.

ConstraintRelaxation

Per un gruppo di veicoli, specifica a quali soglie i vincoli sulle visite saranno allentati e a quale livello. Le spedizioni elencate nel campo skipped_shipment sono vincolate a essere ignorate, ossia non possono essere eseguite.

Campi
relaxations[]

Relaxation

Tutti gli allungamenti ai vincoli di visita che si applicheranno alle visite su percorsi con veicoli in vehicle_indices.

vehicle_indices[]

int32

Specifica gli indici dei veicoli a cui si applica il vincolo di visite relaxations. Se vuoto, viene considerato il valore predefinito e il relaxations si applica a tutti i veicoli non specificati in altre constraint_relaxations. Può esistere al massimo un valore predefinito, ad esempio un campo di rilassamento del vincolo è consentito vuoto vehicle_indices. Un indice di veicoli può essere elencato una sola volta, anche all'interno di più constraint_relaxations.

Un indice di veicoli è mappato come ShipmentRoute.vehicle_index, se interpret_injected_solutions_using_labels è vero (vedi il commento fields).

Relax

Se il campo relaxations è vuoto, l'ora di inizio e la sequenza di tutte le visite il giorno routes sono completamente limitate e non è possibile inserire o aggiungere nuove visite a questi percorsi. Inoltre, l'ora di inizio e di fine di un veicolo in routes è completamente vincolata, a meno che il veicolo non sia vuoto (ovvero non abbia visite e abbia used_if_route_is_empty impostato su false nel modello).

relaxations(i).level specifica il livello di rilassamento del vincolo applicato a una visita #j che soddisfa:

  • route.visits(j).start_time >= relaxations(i).threshold_time E
  • j + 1 >= relaxations(i).threshold_visit_count

Analogamente, l'avvio del veicolo è rilassato fino a relaxations(i).level se soddisfa:

  • vehicle_start_time >= relaxations(i).threshold_time E
  • relaxations(i).threshold_visit_count == 0 e l'estremità del veicolo è rilassata fino a relaxations(i).level se soddisfa:
  • vehicle_end_time >= relaxations(i).threshold_time E
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Per applicare un livello di rilassamento se una visita soddisfa threshold_visit_count OPPURE i threshold_time, aggiungi due relaxations con lo stesso level: uno con solo threshold_visit_count impostato e l'altro con solo threshold_time impostato. Se una visita soddisfa le condizioni di più relaxations, si applica il livello più informale. Di conseguenza, dall'inizio del veicolo fino alla fine del percorso, il livello di rilassamento diventa più rilassato: in altre parole, il livello di rilassamento non diminuisce man mano che il percorso progredisce.

La tempistica e la sequenza delle visite al percorso che non soddisfano le condizioni di soglia di qualsiasi relaxations sono completamente vincolate e non è possibile inserire visite in queste sequenze. Inoltre, se l'inizio o la fine di un veicolo non soddisfa le condizioni di rilassamento, l'orario è fisso, a meno che il veicolo non sia vuoto.

Campi
level

Level

Il livello di rilassamento del vincolo che si applica quando sono soddisfatte le condizioni pari o successive a threshold_time E ad almeno threshold_visit_count.

threshold_time

Timestamp

L'ora alla quale o dopo la quale può essere applicato il rilassamento level.

threshold_visit_count

int32

Il numero di visite durante o dopo le quali può essere applicato il level di rilassamento. Se threshold_visit_count è 0 (o non viene configurato), la level può essere applicata direttamente all'avvio del veicolo.

Se è route.visits_size() + 1, level può essere applicato solo all'estremità del veicolo. Se è superiore a route.visits_size() + 1, level non viene applicato affatto per quel percorso.

Livello

Esprime i diversi livelli di rilassamento del vincolo, che vengono applicati a una visita e quelli che seguono quando soddisfa le condizioni di soglia.

L'elenco riportato di seguito è in ordine crescente.

Enum
LEVEL_UNSPECIFIED

Livello di rilassamento predefinito implicito: nessun vincolo è allentato, ossia tutte le visite sono completamente vincolate.

Questo valore non deve essere utilizzato esplicitamente in level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Gli orari di inizio e di fine delle visite saranno ridotti, ma ogni visita rimane vincolata allo stesso veicolo e la sequenza delle visite deve essere osservata: non è possibile inserire visite tra di loro o prima.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Come RELAX_VISIT_TIMES_AFTER_THRESHOLD, ma anche la sequenza di visite è semplice: le visite rimangono semplicemente legate al veicolo.
RELAX_ALL_AFTER_THRESHOLD Come per RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, ma il veicolo è anche a riposo: le visite sono completamente senza costi a partire dall'orario della soglia e potrebbero potenzialmente avere un rendimento inferiore.

InputConfig

Specifica un input per [BatchOptimizeTours][google.maps.route responsabile.v1.RouteOptimizingService.BatchOptimizeTours].

Campi
data_format

DataFormat

obbligatorio. Il formato dei dati di input.

Campo di unione source. obbligatorio. source può essere solo uno dei seguenti:
gcs_source

GcsSource

Una località di Google Cloud Storage. Deve essere un singolo oggetto (file).

Località

Incapsula una località (un punto geografico e un'intestazione facoltativa).

Campi
lat_lng

LatLng

Le coordinate geografiche del waypoint.

heading

int32

L'intestazione della bussola associata alla direzione del flusso del traffico. Questo valore viene utilizzato per specificare il lato della strada da utilizzare per le operazioni di prelievo e di discesa. I valori di intestazione possono essere compresi tra 0 e 360, dove 0 indica la direzione di nord, 90 indica un'intestazione di est e così via.

OptimizeToursRequest

Richiesta di essere fornita a un risolutore di ottimizzazione del tour che definisca il modello di spedizione da risolvere, nonché i parametri di ottimizzazione.

Campi
parent

string

obbligatorio. Scegli come target un progetto o una località per effettuare una chiamata.

Formato: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Se non viene specificata alcuna località, viene scelta automaticamente una regione.

timeout

Duration

Se questo timeout è impostato, il server restituisce una risposta prima che sia trascorso il periodo di timeout o prima che venga raggiunta la scadenza del server per le richieste sincrone, a seconda dell'evento che si verifica per primo.

Per le richieste asincrone, il server genera una soluzione (se possibile) prima che il timeout sia trascorso.

model

ShipmentModel

Modello di spedizione da risolvere.

solving_mode

SolvingMode

Per impostazione predefinita, la modalità di risoluzione è DEFAULT_SOLVE (0).

search_mode

SearchMode

Modalità di ricerca utilizzata per risolvere la richiesta.

injected_first_solution_routes[]

ShipmentRoute

Aiuta l'algoritmo di ottimizzazione a trovare una prima soluzione simile a una precedente.

Il modello è vincolato quando viene creata la prima soluzione. Eventuali spedizioni non eseguite su un itinerario vengono implicitamente ignorate nella prima soluzione, ma possono essere eseguite in soluzioni successive.

La soluzione deve soddisfare alcune ipotesi di base sulla validità:

  • per tutte le route, il campo vehicle_index deve essere nell'intervallo e non deve essere duplicato.
  • per tutte le visite, shipment_index e visit_request_index devono essere nell'intervallo.
  • è possibile fare riferimento a una spedizione su un solo percorso.
  • il ritiro di una spedizione con ritiro-consegna deve essere effettuato prima della consegna.
  • non è possibile effettuare più di un'alternativa di ritiro o consegna alternativa di una spedizione.
  • per tutti i percorsi, i tempi sono in aumento (ad es. vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • la spedizione può essere effettuata solo su un veicolo consentito. Un veicolo è consentito se Shipment.allowed_vehicle_indices è vuoto o se il relativo valore vehicle_index è incluso in Shipment.allowed_vehicle_indices.

Se la soluzione inserita non è fattibile, non viene necessariamente restituito un errore di convalida, ma potrebbe essere restituito un errore che indica l'infattibilità.

injected_solution_constraint

InjectedSolutionConstraint

Vincola l'algoritmo di ottimizzazione per trovare una soluzione finale simile a una soluzione precedente. Ad esempio, può essere utilizzato per bloccare parti di route che sono già state completate o che devono essere completate ma che non devono essere modificate.

Se la soluzione inserita non è fattibile, non viene necessariamente restituito un errore di convalida, ma potrebbe essere restituito un errore che indica l'infattibilità.

refresh_details_routes[]

ShipmentRoute

Se il campo non è vuoto, i percorsi specificati verranno aggiornati, senza modificare la sequenza sottostante di visite o tempi di percorrenza: verranno aggiornati solo gli altri dettagli. Questa operazione non risolve il modello.

A partire dal 2020/11, questo metodo compila solo le polilinee delle route non vuote e richiede che populate_polylines sia true.

I campi route_polyline delle route passate potrebbero non essere coerenti con il percorso transitions.

Questo campo non deve essere utilizzato insieme a injected_first_solution_routes o injected_solution_constraint.

Shipment.ignore e Vehicle.ignore non hanno alcun effetto su questo comportamento. Le polilinee vengono comunque compilate tra tutte le visite in tutti i percorsi non vuoti, indipendentemente dal fatto che le spedizioni o i veicoli correlati vengano ignorati.

interpret_injected_solutions_using_labels

bool

Se vero:

Questa interpretazione si applica ai campi injected_first_solution_routes, injected_solution_constraint e refresh_details_routes. Può essere utilizzato quando gli indici di spedizione o di veicoli nella richiesta sono cambiati dalla creazione della soluzione, ad esempio perché spedizioni o veicoli sono stati rimossi o aggiunti alla richiesta.

Se il valore è true, le etichette delle seguenti categorie devono apparire al massimo una volta nella categoria:

Se un vehicle_label nella soluzione iniettata non corrisponde a un veicolo richiesto, il percorso corrispondente viene rimosso dalla soluzione insieme alle visite. Se un shipment_label nella soluzione iniettata non corrisponde alla spedizione di una richiesta, la visita corrispondente viene rimossa dalla soluzione. Se un SkippedShipment.label nella soluzione iniettata non corrisponde alla spedizione di una richiesta, il SkippedShipment viene rimosso dalla soluzione.

La rimozione di visite al percorso o di interi percorsi da una soluzione inserita può avere un effetto sui vincoli impliciti, che possono portare a cambiamenti nella soluzione, errori di convalida o fattibilità.

NOTA: il chiamante deve assicurarsi che ogni Vehicle.label (ris. Shipment.label) identifica in modo univoco un veicolo (rispettivamente spedizione) utilizzato nelle due richieste pertinenti: la richiesta precedente che ha generato la OptimizeToursResponse utilizzata nella soluzione iniettata e la richiesta corrente che include la soluzione iniettata. I controlli di univocità descritti sopra non sono sufficienti per garantire questo requisito.

consider_road_traffic

bool

Considera la stima del traffico nel calcolo dei campi ShipmentRoute Transition.travel_duration, Visit.start_time e vehicle_end_time, nell'impostazione del campo ShipmentRoute.has_traffic_infeasibilities e nel calcolo del campo OptimizeToursResponse.total_cost.

populate_polylines

bool

Se il valore è true, le polilinee verranno compilate nella risposta ShipmentRoutes.

populate_transition_polylines

bool

Se il valore è true, le polilinee verranno compilate nella risposta ShipmentRoute.transitions.

allow_large_deadline_despite_interruption_risk

bool

Se questo criterio è impostato, la richiesta può avere una scadenza (vedi la pagina https://grpc.io/blog/deadlines) di massimo 60 minuti. In caso contrario, la scadenza massima è di soli 30 minuti. Tieni presente che le richieste di lunga durata presentano un rischio di interruzione significativamente maggiore (ma ancora ridotto).

use_geodesic_distances

bool

Se il valore è true, le distanze da percorrere verranno calcolate utilizzando le distanze geodetiche anziché quelle di Google Maps, mentre i tempi di percorrenza verranno calcolati utilizzando le distanze geodetiche con una velocità definita da geodesic_meters_per_second.

label

string

Etichetta che potrebbe essere utilizzata per identificare questa richiesta, riportata nel OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

Se use_geodesic_distances è true, questo campo deve essere impostato e definisce la velocità applicata ai tempi di percorrenza per il calcolo. Il suo valore deve essere di almeno 1,0 metri/secondi.

max_validation_errors

int32

Tronca il numero di errori di convalida restituiti. In genere, questi errori sono associati a un payload di errore INVALID_ARGUMENT come dettaglio di errore BadRequest (https://cloud.google.com/apis/design/errors#error_details), a meno che solving_mode=VALIDATE_ONLY: vedi il campo OptimizeToursResponse.validation_errors. Il valore predefinito è 100 ed è limitato a 10.000.

SearchMode

Modalità che definisce il comportamento della ricerca, combinando la latenza rispetto alla qualità della soluzione. In tutte le modalità viene applicata la scadenza globale per le richieste.

Enum
SEARCH_MODE_UNSPECIFIED Modalità di ricerca non specificata, equivalente a RETURN_FAST.
RETURN_FAST Interrompi la ricerca dopo aver trovato la prima buona soluzione.
CONSUME_ALL_AVAILABLE_TIME Dedica tutto il tempo a disposizione alla ricerca di soluzioni migliori.

SolvingMode

Definisce in che modo il risolutore deve gestire la richiesta. In tutte le modalità tranne VALIDATE_ONLY, se la richiesta non è valida, riceverai un errore INVALID_REQUEST. Consulta max_validation_errors per limitare il numero di errori restituiti.

Enum
DEFAULT_SOLVE Risolvi il modello.
VALIDATE_ONLY Convalida il modello solo senza risolverlo: compila il maggior numero possibile di OptimizeToursResponse.validation_errors.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Compila solo OptimizeToursResponse.validation_errors o OptimizeToursResponse.skipped_shipments e non risolve effettivamente il resto della richiesta (status e routes non sono impostati nella risposta). Se vengono rilevate delle imprecisioni nelle route injected_solution_constraint, queste vengono compilate nel campo OptimizeToursResponse.validation_errors e OptimizeToursResponse.skipped_shipments viene lasciato vuoto.

IMPORTANTE: non vengono restituite tutte le spedizioni non fattibili, ma solo quelle che vengono rilevate come non fattibili durante la pre-elaborazione.

OptimizeToursResponse

Risposta dopo aver risolto un problema di ottimizzazione del tour contenente i percorsi seguiti da ciascun veicolo, le spedizioni saltate e il costo complessivo della soluzione.

Campi
routes[]

ShipmentRoute

Percorsi calcolati per ciascun veicolo; il percorso i-esima corrisponde al veicolo i-esima nel modello.

request_label

string

Copia del OptimizeToursRequest.label, se è stata specificata un'etichetta nella richiesta.

skipped_shipments[]

SkippedShipment

L'elenco di tutte le spedizioni saltate.

validation_errors[]

OptimizeToursValidationError

Elenco di tutti gli errori di convalida che siamo stati in grado di rilevare in modo indipendente. Vedi la spiegazione "PIÙ ERRORI" per il messaggio OptimizeToursValidationError.

metrics

Metrics

Metriche relative a durata, distanza e utilizzo per questa soluzione.

Metriche

Metriche complessive, aggregate per tutte le route.

Campi
aggregated_route_metrics

AggregatedMetrics

Dati aggregati lungo le route. Ogni metrica è la somma (o il valore massimo per i caricamenti) di tutti i campi ShipmentRoute.metrics con lo stesso nome.

skipped_mandatory_shipment_count

int32

Numero di spedizioni obbligatorie saltate.

used_vehicle_count

int32

Numero di veicoli utilizzati. Nota: se il percorso di un veicolo è vuoto e Vehicle.used_if_route_is_empty è true, il veicolo è considerato usato.

earliest_vehicle_start_time

Timestamp

L'ora di inizio più vicina per un veicolo usato, calcolata come il valore minimo per tutti i veicoli usati del mese di ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

L'ora di fine più recente per un veicolo usato, calcolata come il valore massimo per tutti i veicoli usati pari a ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Costo della soluzione, suddiviso in base ai campi di richiesta correlati ai costi. Le chiavi sono percorsi di proto relativi all'input OptimizeToursRequest, ad esempio "model.shipments.pickups.cost", mentre i valori sono il costo totale generato dal campo del costo corrispondente, aggregato per l'intera soluzione. In altre parole, i costi["model.shipments.pickups.cost"] è la somma di tutti i costi di ritiro rispetto alla soluzione. 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.

total_cost

double

Costo totale della soluzione. La somma di tutti i valori nella mappa dei costi.

OptimizeToursValidationError

Descrive un errore riscontrato durante la convalida di un oggetto OptimizeToursRequest.

Campi
code

int32

Un errore di convalida viene definito dalla coppia (code, display_name) che sono sempre presenti.

Altri campi (di seguito) forniscono maggiore contesto sull'errore.

PIÙ ERRORI: quando sono presenti più errori, il processo di convalida cerca di riprodurne diversi. Proprio come un compilatore, questo è un processo imperfetto. Alcuni errori di convalida saranno "irreversibili", il che significa che interromperanno l'intero processo di convalida. Questo vale, ad esempio, per display_name="UNSPECIFIED" errori. Alcuni possono far sì che il processo di convalida ignori altri errori.

STABILITÀ: code e display_name devono essere molto stabili. Tuttavia, nel tempo potrebbero apparire nuovi codici e nomi visualizzati, il che potrebbe far sì che una determinata richiesta (non valida) generi una coppia diversa (code, display_name) perché il nuovo errore ha nascosto quello vecchio (consulta la sezione "PIÙ ERRORI").

REFERENCE: un elenco di tutte le coppie (codice, nome):

  • NON SPECIFICATA = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; Impossibile completare la convalida entro la scadenza.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_Small = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANZA = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANZA = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_RE_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_ successivamente_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_After_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_Long = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_After_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_MAIN_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_MAIN_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_than_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_MAIN_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_AFTER_END_TIME = 2814;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_END_TIME = 2815;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_COST_MAIN_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • ↗_ATTRIBUTES_ERROR = 30;
    • ↗_ATTRIBUTES_INVALID_COST = 3000;
    • ↗_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • ↗_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • ↗_ATTRIBUTES_DISTANZA_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • ↗_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • ↗_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • ↗_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • ↗_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • ↗_ATTRIBUTES_Rilevamento_DURATION_NEGATIVE_OR_NAN = 3008;
    • {9/}_ATTRIBUTES_intervallo_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANZA_LIMIT_ERROR = 36;
    • DISTANZA_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANZA_LIMIT_SOFT_MAX_WITHOUT_COST_MAIN_SOFT_MAX = 3602;
    • DISTANZA_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3603;
    • DISTANZA_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANZA_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANZA_LIMIT_SOFT_MAX_LARGER_than_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_FORMATTED_SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_MAIN_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_FORMATTED_SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_square_HOUR = 3807;
    • DURATION_LIMIT_COST_PER_square_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_than_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_than_MAX = 3811;
    • DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MINUTES_DURATION_longER_than_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_than_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • ERRORE_VEHICLE_OPERATOR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
display_name

string

Il nome visualizzato dell'errore.

fields[]

FieldReference

Un contesto di errore può includere 0, 1 (la maggior parte delle volte) o più campi. Ad esempio, facendo riferimento al veicolo n. 4 e al primo ritiro della spedizione 2, puoi procedere come segue:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

Tuttavia, tieni presente che la cardinalità di fields non deve cambiare per un determinato codice di errore.

error_message

string

Stringa leggibile che descrive l'errore. Esiste una mappatura 1:1 tra code e error_message (quando il codice != "UNSPECIFIED").

STABILITÀ: non stabile: il messaggio di errore associato a un determinato code potrebbe cambiare (si spera che sia chiaro) nel tempo. Usa invece i display_name e le code.

offending_values

string

Può contenere i valori dei campi. Questa opzione non è sempre disponibile. Non devi assolutamente farvi affidamento e utilizzarlo solo per il debug manuale dei modelli.

FieldReference

Specifica un contesto per l'errore di convalida. Un FieldReference fa sempre riferimento a un determinato campo di questo file e segue la stessa struttura gerarchica. Ad esempio, potremmo specificare l'elemento n. 2 di start_time_windows del veicolo n. 5 utilizzando:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

Tuttavia, omettiamo entità di primo livello come OptimizeToursRequest o ShipmentModel per evitare di sovraccaricare il messaggio.

Campi
name

string

Nome del campo, ad esempio "veicoli".

sub_field

FieldReference

Sottocampo nidificato in modo ricorsivo, se necessario.

Campo di unione index_or_key.

index_or_key può essere solo uno dei seguenti:

index

int32

Indice del campo se ripetuto.

key

string

Chiave se il campo è una mappa.

OutputConfig

Specifica una destinazione per i risultati di [BatchOptimizeTours][google.maps.routeoptimized.v1.RouteOptimizingService.BatchOptimizeTours].

Campi
data_format

DataFormat

obbligatorio. Il formato dei dati di output.

Campo di unione destination. obbligatorio. destination può essere solo uno dei seguenti:
gcs_destination

GcsDestination

Il percorso di Google Cloud Storage in cui scrivere l'output.

Spedizione

La spedizione di un singolo articolo, da uno dei suoi ritiri a una delle sue consegne. Affinché la spedizione venga considerata come effettuata, un veicolo specifico deve visitare uno dei punti di ritiro (e ridurre di conseguenza le capacità di riserva), per poi visitare uno dei punti di consegna in un secondo momento (e di conseguenza aumentare le capacità di riserva).

Campi
display_name

string

Il nome visualizzato della spedizione definito dall'utente. Può contenere fino a 63 caratteri e può utilizzare caratteri UTF-8.

pickups[]

VisitRequest

Insieme di alternative di ritiro associate alla spedizione. Se non specificato, il veicolo deve visitare solo una sede corrispondente alle consegne.

deliveries[]

VisitRequest

Insieme di alternative di consegna associate alla spedizione. Se non specificato, il veicolo deve visitare solo una sede corrispondente ai ritiri.

load_demands

map<string, Load>

Richieste di carico della spedizione (ad esempio peso, volume, numero di pallet e così via). Le chiavi nella mappa devono essere identificatori che descrivono il tipo del carico corrispondente, possibilmente includendo anche le unità. Ad esempio: "weight_kg", "volume_gallons", "pallet_count" e così via. Se una determinata chiave non viene visualizzata nella mappa, il carico corrispondente viene considerato null.

allowed_vehicle_indices[]

int32

Il gruppo di veicoli che possono effettuare questa spedizione. Se il campo è vuoto, è possibile che venga usato da tutti i veicoli. I veicoli sono forniti in base al relativo indice nell'elenco vehicles di ShipmentModel.

costs_per_vehicle[]

double

Specifica il costo sostenuto quando la spedizione viene consegnata da ciascun veicolo. Se specificato, deve avere O:

  • lo stesso numero di elementi di costs_per_vehicle_indices. costs_per_vehicle[i] corrisponde al veicolo costs_per_vehicle_indices[i] del modello.
  • lo stesso numero di elementi dei veicoli nel modello. L'elemento i-esima corrisponde al veicolo n. i del modello.

Questi costi devono essere nella stessa unità di penalty_cost e non devono essere negativi. Lascia vuoto questo campo se non sono previsti costi di questo tipo.

costs_per_vehicle_indices[]

int32

Indici dei veicoli a cui si applica costs_per_vehicle. Se non è vuoto, deve avere lo stesso numero di elementi di costs_per_vehicle. Un indice di veicoli non può essere specificato più di una volta. Se un veicolo viene escluso da costs_per_vehicle_indices, il suo costo è pari a zero.

pickup_to_delivery_absolute_detour_limit

Duration

Specifica il tempo di deviazione assoluto massimo rispetto al percorso più breve dal ritiro alla consegna. Se specificato, deve essere un numero non negativo e la spedizione deve includere almeno un ritiro e una consegna.

Ad esempio, lascia che sia il tempo più breve per passare dall'alternativa di ritiro selezionata direttamente a quella di consegna selezionata. L'impostazione di pickup_to_delivery_absolute_detour_limit applica quindi:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

Se per la stessa spedizione vengono specificati sia i limiti relativi che assoluti, viene utilizzato il limite più vincolante per ogni coppia possibile di ritiro/consegna. A partire dal 2017/10, le deviazioni sono supportate solo quando la durata del viaggio non dipende dai veicoli.

pickup_to_delivery_time_limit

Duration

Specifica la durata massima dall'inizio del ritiro all'inizio della consegna di una spedizione. Se specificato, deve essere un numero non negativo e la spedizione deve includere almeno un ritiro e una consegna. Ciò non dipende dalle alternative selezionate per il ritiro e la consegna, né dalla velocità del veicolo. Questo può essere specificato insieme ai vincoli massimi di deviazione: la soluzione rispetterà entrambe le specifiche.

shipment_type

string

Stringa non vuota che specifica un "type" per questa spedizione. Questa funzionalità può essere utilizzata per definire incompatibilità o requisiti tra shipment_types (vedi shipment_type_incompatibilities e shipment_type_requirements in ShipmentModel).

Differisce dal valore visit_types specificato per una singola visita: tutti i prelievi/consegne appartenenti alla stessa spedizione condividono lo stesso shipment_type.

label

string

Specifica un'etichetta per questa spedizione. Questa etichetta viene riportata nella risposta in shipment_label del ShipmentRoute.Visit corrispondente.

ignore

bool

Se il valore è true, salta questa spedizione, ma non applicare un penalty_cost.

Se ignori una spedizione, verrà restituito un errore di convalida quando nel modello sono presenti shipment_type_requirements.

È consentito ignorare una spedizione eseguita in injected_first_solution_routes o injected_solution_constraint; il risolutore rimuove le relative visite di ritiro/consegna dal percorso in esecuzione. Verranno ignorati anche gli elementi precedence_rules che fanno riferimento a spedizioni ignorate.

penalty_cost

double

Se la spedizione non viene completata, questa sanzione viene aggiunta al costo complessivo dei percorsi. Una spedizione è considerata completata se viene visitata una delle sue alternative di ritiro e consegna. Il costo può essere espresso nella stessa unità utilizzata per tutti gli altri campi relativi ai costi nel modello e deve essere positivo.

IMPORTANTE: se questa sanzione non è specificata, è considerata infinita, ossia la spedizione deve essere completata.

pickup_to_delivery_relative_detour_limit

double

Specifica il tempo di deviazione relativo massimo rispetto al percorso più breve dal ritiro alla consegna. Se specificato, deve essere un numero non negativo e la spedizione deve includere almeno un ritiro e una consegna.

Ad esempio, lascia che sia il tempo più breve per passare dall'alternativa di ritiro selezionata direttamente a quella di consegna selezionata. L'impostazione di pickup_to_delivery_relative_detour_limit applica quindi:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

Se per la stessa spedizione vengono specificati sia i limiti relativi che assoluti, viene utilizzato il limite più vincolante per ogni coppia possibile di ritiro/consegna. A partire dal 2017/10, le deviazioni sono supportate solo quando la durata del viaggio non dipende dai veicoli.

Carica

Quando effettui una visita, potrebbe essere aggiunto un importo predefinito al carico del veicolo (se si tratta di un ritiro) o sottratto se si tratta di una consegna. Questo messaggio definisce l'importo. Leggi i load_demands.

Campi
amount

int64

Di conseguenza, varia il carico del veicolo che effettua la visita corrispondente. Poiché si tratta di un numero intero, consigliamo agli utenti di scegliere un'unità appropriata per evitare perdite di precisione. Deve essere ≥ 0.

VisitRequest

Richiesta di una visita che può essere effettuata da un veicolo: ha una geolocalizzazione (o due, vedi sotto), gli orari di apertura e chiusura rappresentati da finestre temporali e una durata del servizio (tempo speso dal veicolo una volta arrivato al ritiro o alla consegna delle merci).

Campi
arrival_location

LatLng

La geolocalizzazione alla quale arriva il veicolo quando esegui questo VisitRequest. Se il modello di spedizione ha matrici di durata e distanza, non è necessario specificare arrival_location.

arrival_waypoint

Waypoint

Il waypoint a cui arriva il veicolo quando esegui questo VisitRequest. Se il modello di spedizione ha matrici di durata e distanza, non è necessario specificare arrival_waypoint.

departure_location

LatLng

La geolocalizzazione da cui parte il veicolo dopo aver completato questo VisitRequest. Può essere omesso se è uguale a arrival_location. Se il modello di spedizione ha matrici di durata e distanza, non è necessario specificare departure_location.

departure_waypoint

Waypoint

Il waypoint da cui parte il veicolo dopo aver completato questo VisitRequest. Può essere omesso se è uguale a arrival_waypoint. Se il modello di spedizione ha matrici di durata e distanza, non è necessario specificare departure_waypoint.

tags[]

string

Specifica i tag allegati alla richiesta di visita. Non sono consentite stringhe vuote o duplicate.

time_windows[]

TimeWindow

Finestre temporali che limitano l'ora di arrivo a una visita. Tieni presente che un veicolo potrebbe partire al di fuori dell'orario di arrivo, ad esempio se l'ora di arrivo e la durata non devono necessariamente rientrare in un intervallo di tempo. Ciò può comportare tempi di attesa se il veicolo arriva prima delle ore TimeWindow.start_time.

L'assenza di TimeWindow indica che il veicolo può effettuare questa visita in qualsiasi momento.

Le finestre temporali devono essere separate, ovvero nessuna finestra temporale deve sovrapporsi o essere adiacente a un'altra e devono essere in ordine crescente.

cost_per_hour_after_soft_end_time e soft_end_time possono essere impostati solo se è presente un'unica finestra temporale.

duration

Duration

Durata della visita, ovvero tempo trascorso dal veicolo tra l'arrivo e la partenza (da sommare ai possibili tempi di attesa; vedi time_windows).

cost

double

Costo del servizio per questa richiesta di visita su un percorso di veicoli. Questo metodo può essere utilizzato per pagare costi diversi per ogni ritiro o consegna alternativi di una spedizione. Questo costo deve essere nella stessa unità di Shipment.penalty_cost e non deve essere negativo.

load_demands

map<string, Load>

Carica le richieste di questa richiesta di visita. Funziona esattamente come il campo Shipment.load_demands, con la differenza che si applica solo a questo VisitRequest anziché all'intero Shipment. Le richieste elencate qui vengono aggiunte a quelle elencate in Shipment.load_demands.

visit_types[]

string

Specifica i tipi di visita. Può essere utilizzato per assegnare a un veicolo il tempo aggiuntivo necessario per completare la visita (vedi Vehicle.extra_visit_duration_for_visit_type).

Un tipo può apparire una sola volta.

label

string

Specifica un'etichetta per questo VisitRequest. Questa etichetta viene segnalata nella risposta come visit_label nel ShipmentRoute.Visit corrispondente.

ShipmentModel

Un modello di spedizione contiene un insieme di spedizioni che devono essere eseguite da un insieme di veicoli, riducendo al minimo il costo complessivo, ovvero la somma di:

  • il costo del percorso dei veicoli (somma del costo per tempo totale, del costo per tempo di percorrenza e del costo fisso di tutti i veicoli).
  • penali per la spedizione non eseguite.
  • il costo della durata globale delle spedizioni.
Campi
shipments[]

Shipment

Insieme di spedizioni che devono essere eseguite nel modello.

vehicles[]

Vehicle

Insieme di veicoli che possono essere utilizzati per effettuare visite.

global_start_time

Timestamp

Ora di inizio e di fine globali del modello: nessun orario al di fuori di questo intervallo può essere considerato valido.

L'intervallo di tempo del modello deve essere inferiore a un anno, vale a dire che global_end_time e global_start_time non devono superare i 31536000 secondi l'uno dall'altro.

Quando utilizzi i campi cost_per_*hour, è preferibile impostare questa finestra su un intervallo più ridotto per aumentare le prestazioni (ad esempio, se modelli un solo giorno, devi impostare i limiti di tempo globali su quel giorno). Se il criterio non viene configurato, per impostazione predefinita viene utilizzato il valore 00:00:00 UTC, 1° gennaio 1970 (ad es. secondi: 0, nano: 0).

global_end_time

Timestamp

Se il criterio non viene configurato, per impostazione predefinita viene utilizzato il valore 00:00:00 UTC, 1° gennaio 1971 (ad es. secondi: 31536000, nano: 0).

global_duration_cost_per_hour

double

La "durata globale" del piano generale è la differenza tra la prima ora di inizio effettiva e l'ultima ora di fine effettiva di tutti i veicoli. Gli utenti possono assegnare un costo orario a quella quantità per provare a ottimizzare per il primo completamento del job, ad esempio. Questo costo deve essere nella stessa unità di Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Specifica le matrici di durata e distanza utilizzate nel modello. Se questo campo è vuoto, verranno utilizzati Google Maps o le distanze geodetiche, a seconda del valore del campo use_geodesic_distances. Se non è vuoto, use_geodesic_distances non può essere true e né duration_distance_matrix_src_tagsduration_distance_matrix_dst_tags possono essere vuoti.

Esempi di utilizzo:

  • Esistono due posizioni: locA e locB.
  • 1 veicolo che inizia il percorso in locA e lo termina in locA.
  • 1 richiesta di visita di ritiro presso locB.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Esistono tre posizioni: locA, locB e locC.
  • 1 veicolo che inizia il percorso in locA e lo termina in locB, utilizzando la matrice "rapido".
  • 1 veicolo che inizia il percorso in locB e lo termina in locB, utilizzando la matrice "lenta".
  • 1 veicolo che inizia il percorso in locB e lo termina in locB, utilizzando la matrice "fast".
  • 1 richiesta di visita di ritiro presso locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

Tag che definiscono le origini delle matrici di durata e distanza; duration_distance_matrices(i).rows(j) definisce le durate e le distanze dalle visite con il tag duration_distance_matrix_src_tags(j) ad altre visite nella matrice i.

I tag corrispondono a VisitRequest.tags o Vehicle.start_tags. Un determinato VisitRequest o Vehicle deve corrispondere esattamente a un tag in questo campo. Tieni presente che i tag di origine, destinazione e matrice di Vehicle possono essere uguali; allo stesso modo, i tag source e destination di VisitRequest possono coincidere. Tutti i tag devono essere diversi e non possono essere stringhe vuote. Se questo campo non è vuoto, duration_distance_matrices non deve essere vuoto.

duration_distance_matrix_dst_tags[]

string

Tag che definiscono le destinazioni delle matrici di durata e distanza; duration_distance_matrices(i).rows(j).durations(k) (resp. duration_distance_matrices(i).rows(j).meters(k)) definisce la durata (ovvero la distanza) del viaggio dalle visite con il tag duration_distance_matrix_src_tags(j) alle visite con il tag duration_distance_matrix_dst_tags(k) nella matrice i.

I tag corrispondono a VisitRequest.tags o Vehicle.start_tags. Un determinato VisitRequest o Vehicle deve corrispondere esattamente a un tag in questo campo. Tieni presente che i tag di origine, destinazione e matrice di Vehicle possono essere uguali; allo stesso modo, i tag source e destination di VisitRequest possono coincidere. Tutti i tag devono essere diversi e non possono essere stringhe vuote. Se questo campo non è vuoto, duration_distance_matrices non deve essere vuoto.

transition_attributes[]

TransitionAttributes

Attributi di transizione aggiunti al modello.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Insiemi di billing_type incompatibili (vedi ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Insieme di shipment_type requisiti (vedi ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Set di regole di precedenza che deve essere applicato in modo forzato nel modello.

max_active_vehicles

int32

Limita il numero massimo di veicoli attivi. Un veicolo è attivo se il relativo percorso esegue almeno una spedizione. Ciò può essere utilizzato per limitare il numero di percorsi nel caso in cui ci siano meno conducenti che veicoli e il parco veicoli è eterogeneo. L'ottimizzazione selezionerà quindi il sottoinsieme migliore di veicoli da utilizzare. Deve essere rigorosamente positiva.

DurationDistanceMatrix

Specifica una matrice di durata e distanza dalle località di partenza della visita e dei veicoli da visitare e dai luoghi di arrivo dei veicoli.

Campi
rows[]

Row

Specifica le righe della matrice di durata e distanza. Deve avere un numero di elementi pari a ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

Tag che definisce i veicoli a cui si applica la durata e la matrice della distanza. Se vuoto, si applica a tutti i veicoli e può essere presente una sola matrice.

L'inizio di ogni veicolo deve corrispondere esattamente a una matrice, ovvero esattamente uno dei campi start_tags deve corrispondere al valore vehicle_start_tag di una matrice (e solo di quella matrice).

Tutte le matrici devono avere un valore vehicle_start_tag diverso.

Row

Specifica una riga della matrice di durata e distanza.

Campi
durations[]

Duration

Valori della durata di una determinata riga. Deve avere un numero di elementi pari a ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Valori di distanza per una determinata riga. Se nessun costo o vincolo si riferisce alle distanze nel modello, è possibile lasciare vuoto questo campo, altrimenti deve avere un numero di elementi pari a durations.

PrecedenceRule

Una regola di precedenza tra due eventi (ogni evento corrisponde al ritiro o alla consegna di una spedizione): il "secondo" evento deve iniziare almeno offset_duration dopo l'inizio del "primo" evento.

Diverse precedenza possono fare riferimento agli stessi eventi (o correlati), ad esempio "il ritiro di B avviene dopo la consegna di A" e il "ritiro di C avviene dopo il ritiro di B".

Inoltre, le precedenza si applicano solo quando vengono effettuate entrambe le spedizioni e vengono altrimenti ignorate.

Campi
first_is_delivery

bool

Indica se il "primo" evento è una pubblicazione.

second_is_delivery

bool

Indica se il "secondo" evento è una pubblicazione.

offset_duration

Duration

L'offset tra il "primo" e il "secondo" evento. Può essere negativa.

first_index

int32

Indice di spedizione del "primo" evento. È necessario specificare questo campo.

second_index

int32

Indice di spedizione del "secondo" evento. È necessario specificare questo campo.

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

int32

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

vehicle_label

string

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

vehicle_start_time

Timestamp

L'ora in cui il veicolo inizia il percorso.

vehicle_end_time

Timestamp

L'ora in cui il veicolo termina il percorso.

visits[]

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

Transition

Elenco ordinato di transizioni per il percorso.

has_traffic_infeasibilities

bool

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:

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

L'arrivo a next_visit avverrà probabilmente dopo l'attuale finestra temporale a causa dell'aumento della stima del tempo di percorrenza (travel_duration(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.

route_polyline

EncodedPolyline

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

breaks[]

Break

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

metrics

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.

route_costs

map<string, double>

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.

route_total_cost

double

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

Pausa

Dati che rappresentano l'esecuzione di un'interruzione.

Campi
start_time

Timestamp

Ora di inizio di una pausa.

duration

Duration

Durata di una pausa.

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.

Campi
points

string

Stringa che rappresenta i punti codificati della polilinea.

Transizioni

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

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

Campi
travel_duration

Duration

Durata del viaggio durante questa transizione.

travel_distance_meters

double

Distanza percorsa durante la transizione.

traffic_info_unavailable

bool

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à).

delay_duration

Duration

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

break_duration

Duration

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.

wait_duration

Duration

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.

total_duration

Duration

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

  • prossima visita start_time (o vehicle_end_time se si tratta dell'ultima transizione): le start_time di questa transizione;
  • Se ShipmentRoute.has_traffic_infeasibilities è falso, viene applicato anche quanto segue: "total_duration = viaggi_duration + ritardo_duration
  • break_duration + Wait_duration.
start_time

Timestamp

Ora di inizio di questa transizione.

route_polyline

EncodedPolyline

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

vehicle_loads

map<string, 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 load_demands della visita vengono aggiunti o sottratti per ottenere i caricamenti della transizione successiva, a seconda che la visita fosse un ritiro o una consegna.

VehicleLoad

Segnala il carico effettivo del veicolo a un certo punto del percorso, per un determinato tipo (vedi Transition.vehicle_loads).

Campi
amount

int64

La quantità di carico sul veicolo per un determinato tipo. L'unità di carico è solitamente indicata dal tipo. Leggi i Transition.vehicle_loads.

Visita

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

Campi
shipment_index

int32

Indice del campo shipments nell'origine ShipmentModel.

is_pickup

bool

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

visit_request_index

int32

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

start_time

Timestamp

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.

load_demands

map<string, Load>

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

detour

Duration

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:

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

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

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

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

visit_label

string

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

ShipmentTypeIncompatibility

Specifica le incompatibilità tra le spedizioni in base al loro tipo di spedizione. L'aspetto di spedizioni incompatibili sullo stesso percorso è limitato in base alla modalità di incompatibilità.

Campi
types[]

string

Elenco dei tipi non compatibili. Due spedizioni con shipment_types diversi tra quelli elencati sono "incompatibili".

incompatibility_mode

IncompatibilityMode

Modalità applicata all'incompatibilità.

IncompatibilityMode

Modalità che definiscono in che modo l'aspetto di spedizioni incompatibili è limitato sullo stesso percorso.

Enum
INCOMPATIBILITY_MODE_UNSPECIFIED Modalità di incompatibilità non specificata. Questo valore non deve mai essere utilizzato.
NOT_PERFORMED_BY_SAME_VEHICLE In questa modalità, due spedizioni con tipi incompatibili non possono mai condividere lo stesso veicolo.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

Per due spedizioni con tipi incompatibili con la modalità di incompatibilità NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Se entrambi si basano solo sul ritiro (senza consegne) o solo su consegne (senza ritiri), non possono condividere lo stesso veicolo.
  • Se una delle spedizioni prevede una consegna e l'altra un ritiro, le due spedizioni possono condividere lo stesso veicolo se la spedizione precedente viene consegnata prima del ritiro della seconda.

ShipmentTypeRequirement

Specifica i requisiti tra le spedizioni in base all'attributo shipping_type [spedizione_di_tipo]. Le specifiche del requisito sono definite dalla modalità dei requisiti.

Campi
required_shipment_type_alternatives[]

string

Elenco di tipi di spedizione alternativi richiesti da dependent_shipment_types.

dependent_shipment_types[]

string

Per tutte le spedizioni di tipo nel campo dependent_shipment_types è necessario visitare almeno una spedizione di tipo required_shipment_type_alternatives sullo stesso percorso.

NOTA: non sono consentite catene di requisiti in modo che un shipment_type dipenda da se stesso.

requirement_mode

RequirementMode

Modalità applicata al requisito.

RequirementMode

Modalità che definiscono l'aspetto delle spedizioni dipendenti su un percorso.

Enum
REQUIREMENT_MODE_UNSPECIFIED Modalità requisito non specificata. Questo valore non deve mai essere utilizzato.
PERFORMED_BY_SAME_VEHICLE In questa modalità, tutte le spedizioni "dipendenti" devono condividere lo stesso veicolo di almeno una delle spedizioni "obbligatorie".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Con la modalità IN_SAME_VEHICLE_AT_PICKUP_TIME, tutte le spedizioni "dipendenti" devono avere almeno una spedizione "obbligatoria" sul veicolo al momento del ritiro.

Pertanto, un ritiro con spedizione "dipendente" deve avere:

  • Una spedizione "obbligatoria" con solo la consegna consegnata lungo il percorso dopo oppure
  • Una spedizione "obbligatoria" ritirata lungo il percorso che lo precede e, se la spedizione "obbligatoria" ha una consegna, questa consegna deve essere effettuata dopo il ritiro della spedizione "dipendente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Come in precedenza, ad eccezione del fatto che le spedizioni "dipendenti" devono avere una spedizione "obbligatoria" sul veicolo al momento della consegna.

SkippedShipment

Specifica i dettagli delle spedizioni non eseguite in una soluzione. Per casi banali e/o se siamo in grado di identificare la causa dell'esclusione, segnaliamo il motivo qui.

Campi
index

int32

L'indice corrisponde all'indice della spedizione nell'origine ShipmentModel.

label

string

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

reasons[]

Reason

Un elenco di motivi che spiegano perché la spedizione è stata saltata. Vedi il commento sopra Reason.

Motivo

Se possiamo spiegare il motivo per cui la spedizione è stata saltata, i motivi saranno elencati qui. Se il motivo non è uguale per tutti i veicoli, reason includerà più di un elemento. Una spedizione saltata non può avere motivi duplicati, ovvero tutti i campi sono gli stessi ad eccezione di example_vehicle_index. Esempio:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

La spedizione saltata non è compatibile con tutti i veicoli. I motivi possono essere diversi per tutti i veicoli, ma la capacità di "Mele" di almeno un veicolo verrebbe superata (incluso il veicolo 1), la capacità di "Pere" di almeno un veicolo (incluso il veicolo 3) e il limite di distanza di almeno un veicolo (incluso il veicolo 1).

Campi
code

Code

Fai riferimento ai commenti di Code.

example_exceeded_capacity_type

string

Se il codice motivo è DEMAND_EXCEEDS_VEHICLE_CAPACITY, documenta un tipo di capacità che è stato superato.

example_vehicle_index

int32

Se il motivo è correlato a un'incompatibilità tra spedizione e veicolo, questo campo fornisce l'indice di un veicolo pertinente.

Codice

Codice che identifica il tipo di motivo. L'ordine qui è privo di significato. In particolare, non offre alcuna indicazione se un determinato motivo apparirà prima di un altro nella soluzione, nel caso in cui siano entrambi applicabili.

Enum
CODE_UNSPECIFIED Questa opzione non deve mai essere utilizzata. Se non riusciamo a capire perché una spedizione è stata saltata, restituiamo semplicemente una serie di motivi vuoti.
NO_VEHICLE Il modello non contiene nessun veicolo, pertanto non è possibile effettuare tutte le spedizioni.
DEMAND_EXCEEDS_VEHICLE_CAPACITY La domanda della spedizione supera la capacità di un veicolo per alcuni tipi di capacità, uno dei quali è example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

La distanza minima necessaria per eseguire questa spedizione, ovvero dal start_location del veicolo ai punti di ritiro e/o consegna della spedizione, e alla località di arrivo, supera i route_distance_limit del veicolo.

Tieni presente che per questo calcolo vengono utilizzate le distanze geodetiche.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

Il tempo minimo necessario per eseguire questa spedizione, inclusi il tempo di percorrenza, i tempi di attesa e i tempi di assistenza, supera le route_duration_limit del veicolo.

Nota: il tempo di percorrenza è calcolato nello scenario migliore, ovvero come distanza geodetica x 36 m/s (circa 130 km/ora).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Come sopra, ma confrontiamo solo il tempo di percorrenza minimo e i travel_duration_limit del veicolo.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Il veicolo non può effettuare questa spedizione nello scenario migliore (vedi CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT per il calcolo del tempo) se inizia alla prima ora di inizio: il tempo totale fa terminare il veicolo dopo l'ora di fine più recente.
VEHICLE_NOT_ALLOWED Il campo allowed_vehicle_indices della spedizione non è vuoto e questo veicolo non appartiene.

TimeWindow

Le finestre temporali limitano l'ora di un evento, ad esempio l'ora di arrivo a una visita o l'ora di inizio e di fine di un veicolo.

I limiti di finestra temporale rigida, start_time e end_time, forzano l'applicazione del primo e dell'ultimo orario dell'evento, in modo che start_time <= event_time <= end_time. Il limite inferiore della finestra di tempo soft, soft_start_time, esprime una preferenza affinché l'evento si verifichi il giorno soft_start_time o in una data successiva, in quanto incorre in un costo proporzionale al tempo che deve trascorrere prima che si verifichi l'evento soft_start_time. Il limite superiore della finestra temporale flessibile, soft_end_time, esprime una preferenza affinché l'evento si verifichi entro il giorno soft_end_time incorrere in un costo proporzionale al periodo di tempo successivo al giorno soft_end_time che si verifica l'evento. start_time, end_time, soft_start_time e soft_end_time devono rientrare nei limiti di tempo globali (vedi ShipmentModel.global_start_time e ShipmentModel.global_end_time) e rispettare:

  0 <= `start_time` <= `soft_start_time` <= `end_time` and
  0 <= `start_time` <= `soft_end_time` <= `end_time`.
Campi
start_time

Timestamp

L'ora di inizio della finestra temporale. Se non specificato, verrà impostato su ShipmentModel.global_start_time.

end_time

Timestamp

L'ora di fine della finestra temporale. Se non specificato, verrà impostato su ShipmentModel.global_end_time.

soft_start_time

Timestamp

L'ora di avvio graduale della finestra temporale.

soft_end_time

Timestamp

L'ora di fine temporanea della finestra temporale.

cost_per_hour_before_soft_start_time

double

Costo orario aggiunto ad altri costi nel modello se l'evento si verifica prima della data soft_start_time, calcolato come segue:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

Il costo deve essere positivo e il campo può essere impostato solo se è stato impostato soft_start_time.

cost_per_hour_after_soft_end_time

double

Un costo orario aggiunto ad altri costi nel modello se l'evento si verifica dopo il giorno soft_end_time, calcolato come:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

Questo costo deve essere positivo e il campo può essere impostato solo se è stato impostato soft_end_time.

TransitionAttributes

Specifica gli attributi delle transizioni tra due visite consecutive di un percorso. Diversi TransitionAttributes possono essere applicati alla stessa transizione: in questo caso, tutti i costi aggiuntivi vengono sommati e viene applicato il vincolo o il limite più rigido (seguendo la semantica "AND" naturale).

Campi
src_tag

string

Tag che definiscono l'insieme di transizioni (src->dst) a cui si applicano questi attributi.

Una visita di origine o un avvio del veicolo corrisponde se il relativo VisitRequest.tags o Vehicle.start_tags contiene src_tag o non contiene excluded_src_tag (a seconda di quale di questi due campi non è vuoto).

excluded_src_tag

string

Leggi i src_tag. I campi src_tag e excluded_src_tag non devono essere vuoti.

dst_tag

string

Una visita a destinazione o la fine di un veicolo corrisponde se il relativo VisitRequest.tags o Vehicle.end_tags contiene dst_tag o non contiene excluded_dst_tag (a seconda di quale di questi due campi non è vuoto).

excluded_dst_tag

string

Leggi i dst_tag. I campi dst_tag e excluded_dst_tag non devono essere vuoti.

cost

double

Specifica un costo per l'esecuzione di questa transizione. Si tratta della stessa unità di tutti gli altri costi nel modello e non deve essere negativo. Viene applicato in aggiunta a tutti gli altri costi esistenti.

cost_per_kilometer

double

Specifica un costo per chilometro applicato alla distanza percorsa durante l'esecuzione di questa transizione. Viene sommato il valore Vehicle.cost_per_kilometer specificato sui veicoli.

distance_limit

DistanceLimit

Specifica un limite alla distanza percorsa durante l'esecuzione di questa transizione.

A partire dal 6/2021, sono supportati solo i limiti flessibili.

delay

Duration

Specifica un ritardo riscontrato durante l'esecuzione di questa transizione.

Questo ritardo si verifica sempre dopo il termine della visita di origine e prima di iniziare la visita alla destinazione.

Veicolo

Crea modelli di un veicolo in un problema di spedizione. Se risolvi un problema di spedizione, per questo veicolo verrà creato un percorso a partire da start_location e fino al giorno end_location. Un percorso è una sequenza di visite (vedi ShipmentRoute).

Campi
display_name

string

Il nome visualizzato del veicolo definito dall'utente. Può contenere fino a 63 caratteri e può utilizzare caratteri UTF-8.

travel_mode

TravelMode

La modalità di viaggio che influisce sulle strade utilizzabili dal veicolo e sulla sua velocità. Vedi anche travel_duration_multiple.

start_location

LatLng

Posizione geografica da cui parte il veicolo prima di ritirare qualsiasi spedizione. Se non specificato, il veicolo parte al primo ritiro. Se il modello di spedizione ha matrici di durata e distanza, non è necessario specificare start_location.

start_waypoint

Waypoint

Waypoint che rappresenta una posizione geografica in cui il veicolo parte prima di ritirare qualsiasi spedizione. Se non è specificato né start_waypointstart_location, il veicolo parte al primo ritiro. Se il modello di spedizione ha matrici di durata e distanza, non è necessario specificare start_waypoint.

end_location

LatLng

Posizione geografica in cui il veicolo finisce dopo che ha completato l'ultimo periodo (VisitRequest). Se non specificato, il campo ShipmentRoute per il veicolo termina immediatamente quando ne completa gli ultimi VisitRequest. Se il modello di spedizione ha matrici di durata e distanza, non è necessario specificare end_location.

end_waypoint

Waypoint

Waypoint che rappresenta una posizione geografica in cui il veicolo finisce dopo che ha completato gli ultimi VisitRequest. Se non è specificato né end_waypointend_location, il ShipmentRoute del veicolo termina immediatamente quando completa l'ultimo VisitRequest. Se il modello di spedizione ha matrici di durata e distanza, non è necessario specificare end_waypoint.

start_tags[]

string

Specifica i tag attaccati all'inizio del percorso del veicolo.

Non sono consentite stringhe vuote o duplicate.

end_tags[]

string

Specifica i tag attaccati alla fine del percorso del veicolo.

Non sono consentite stringhe vuote o duplicate.

start_time_windows[]

TimeWindow

Finestre temporali durante le quali il veicolo può partire dal punto di partenza. Devono rientrare nei limiti di tempo globali (vedi i campi ShipmentModel.global_*). Se non specificati, non sono previsti limiti oltre a questi limiti di tempo globali.

Le finestre temporali appartenenti allo stesso campo ripetuto devono essere disgiunte, ovvero nessuna finestra temporale può sovrapporsi o essere adiacente a un'altra e devono essere in ordine cronologico.

cost_per_hour_after_soft_end_time e soft_end_time possono essere impostati solo se è presente un'unica finestra temporale.

end_time_windows[]

TimeWindow

Finestre temporali durante le quali il veicolo può arrivare al punto di arrivo. Devono rientrare nei limiti di tempo globali (vedi i campi ShipmentModel.global_*). Se non specificati, non sono previsti limiti oltre a questi limiti di tempo globali.

Le finestre temporali appartenenti allo stesso campo ripetuto devono essere disgiunte, ovvero nessuna finestra temporale può sovrapporsi o essere adiacente a un'altra e devono essere in ordine cronologico.

cost_per_hour_after_soft_end_time e soft_end_time possono essere impostati solo se è presente un'unica finestra temporale.

unloading_policy

UnloadingPolicy

Norme di scarico applicate al veicolo.

load_limits

map<string, LoadLimit>

Capacità del veicolo (ad esempio peso, volume, n. di pallet). Le chiavi nella mappa sono gli identificatori del tipo di caricamento, in linea con le chiavi del campo Shipment.load_demands. Se una determinata chiave non è presente in questa mappa, la capacità corrispondente è considerata illimitata.

cost_per_hour

double

Costi del veicolo: tutti i costi vengono sommati e devono essere nella stessa unità di Shipment.penalty_cost.

Costo per ora del percorso del veicolo. Questo costo viene applicato al tempo totale impiegato per il percorso e include il tempo di percorrenza, il tempo di attesa e il tempo di visita. L'utilizzo di cost_per_hour anziché solo di cost_per_traveled_hour può comportare una latenza aggiuntiva.

cost_per_traveled_hour

double

Costo per ora di percorrenza del percorso del veicolo. Questo costo viene applicato solo al tempo di percorrenza per il percorso (ad es. quello riportato nel mese di ShipmentRoute.transitions) ed esclude il tempo di attesa e quello della visita.

cost_per_kilometer

double

Costo per chilometro del percorso veicolare. Questo costo viene applicato alla distanza riportata nel ShipmentRoute.transitions e non si applica a nessuna distanza percorsa implicitamente dal arrival_location al departure_location di una singola VisitRequest.

fixed_cost

double

Se questo veicolo viene utilizzato per gestire una spedizione, viene applicato un costo fisso.

used_if_route_is_empty

bool

Questo campo si applica solo ai veicoli quando il loro percorso non prevede spedizioni. Indica se il veicolo deve essere considerato usato o meno in questo caso.

Se il valore è true, il veicolo passa dalla posizione di partenza a quella di arrivo anche se non serve alcuna spedizione e vengono presi in considerazione i costi di tempo e distanza derivanti dalla corsa di inizio --> di fine viaggio.

In caso contrario, non si sposta dal punto di partenza a quello di arrivo e per questo veicolo non sono programmati break_rule o ritardi (da TransitionAttributes). In questo caso, il codice ShipmentRoute del veicolo non contiene alcuna informazione ad eccezione dell'indice e dell'etichetta del veicolo.

route_duration_limit

DurationLimit

Limite applicato alla durata totale del percorso del veicolo. In un determinato OptimizeToursResponse, la durata del percorso di un veicolo è la differenza tra i suoi vehicle_end_time e vehicle_start_time.

travel_duration_limit

DurationLimit

Limite applicato alla durata del percorso del veicolo. In un determinato OptimizeToursResponse, la durata del percorso del percorso è la somma di tutti i suoi transitions.travel_duration.

route_distance_limit

DistanceLimit

Limite applicato alla distanza totale del percorso del veicolo. In un determinato OptimizeToursResponse, la distanza del percorso è la somma di tutti i suoi transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Specifica una mappa dalle stringhe visit_types alle durate. La durata è tempo oltre a VisitRequest.duration da considerare per le visite con il visit_types specificato. Questa durata extra della visita comporta un aumento dei costi se cost_per_hour è specificato. Le chiavi (ad es. visit_types) non possono essere stringhe vuote.

Se una richiesta di visita presenta più tipi, verrà aggiunta una durata per ogni tipo nella mappa.

break_rule

BreakRule

Descrive il programma delle pause da applicare su questo veicolo. Se vuoto, non saranno programmate pause per questo veicolo.

label

string

Specifica un'etichetta per questo veicolo. Questa etichetta viene riportata nella risposta come vehicle_label dell'elemento ShipmentRoute corrispondente.

ignore

bool

Se il valore è true, used_if_route_is_empty deve essere false e questo veicolo rimarrà inutilizzato.

Se una spedizione viene eseguita da un veicolo ignorato in injected_first_solution_routes, viene saltata nella prima soluzione, ma può essere eseguita senza costi nella risposta.

Se una spedizione viene eseguita da un veicolo ignorato in injected_solution_constraint e l'eventuale ritiro/consegna correlato è vincolato a rimanere sul veicolo (ovvero non è rilassato al livello RELAX_ALL_AFTER_THRESHOLD), l'azione viene saltata nella risposta. Se una spedizione ha un campo allowed_vehicle_indices non vuoto e tutti i veicoli consentiti vengono ignorati, l'ordine viene ignorato nella risposta.

travel_duration_multiple

double

Specifica un fattore moltiplicativo che può essere utilizzato per aumentare o diminuire i tempi di percorrenza di questo veicolo. Ad esempio, impostare questo valore su 2,0 significa che il veicolo è più lento e ha tempi di percorrenza doppi rispetto a quelli dei veicoli standard. Questo multiplo non influisce sulla durata delle visite. Influisce sui costi se vengono specificati cost_per_hour o cost_per_traveled_hour. Deve essere compreso nell'intervallo [0,001, 1000,0]. Se non viene configurato, il veicolo è standard, e questo multiplo è considerato pari a 1,0.

ATTENZIONE: i tempi di percorrenza saranno arrotondati al secondo più vicino dopo l'applicazione di questo multiplo, ma prima di eseguire operazioni numeriche, pertanto un piccolo multiplo può comportare una perdita di precisione.

Vedi anche extra_visit_duration_for_visit_type di seguito.

DurationLimit

Un limite che definisce la durata massima del percorso di un veicolo. Può essere duro o morbido.

Quando viene definito un campo di limite flessibile, sia la soglia minima che il costo associato devono essere definiti insieme.

Campi
max_duration

Duration

Un limite fisso che limita la durata al massimo a max_duration.

soft_max_duration

Duration

Un limite flessibile non applica un limite di durata massima, ma se viene violato, la route comporta un costo. Questo costo viene sommato agli altri costi definiti nel modello, con la stessa unità.

Se definito, soft_max_duration non deve essere un numero negativo. Se è definito anche max_duration, il valore soft_max_duration deve essere inferiore a max_duration.

quadratic_soft_max_duration

Duration

Un limite flessibile non applica un limite di durata massima, ma se viene violato, la route è soggetta a un costo quadratico nella durata. Questo costo viene sommato agli altri costi definiti nel modello, con la stessa unità.

Se definito, quadratic_soft_max_duration non deve essere un numero negativo. Se è definito anche max_duration, quadratic_soft_max_duration deve essere inferiore a max_duration e la differenza non deve essere superiore a un giorno:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Costo per ora sostenuto in caso di violazione della soglia di soft_max_duration. Il costo aggiuntivo è pari a 0 se la durata è inferiore alla soglia, altrimenti dipende dalla durata come segue:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Il costo deve essere un numero non negativo.

cost_per_square_hour_after_quadratic_soft_max

double

Costo per ora quadrata sostenuto in caso di violazione della soglia di quadratic_soft_max_duration.

Il costo aggiuntivo è pari a 0 se la durata è inferiore alla soglia, altrimenti dipende dalla durata come segue:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Il costo deve essere un numero non negativo.

LoadLimit

Definisce un limite di carico applicabile a un veicolo, ad esempio "questo camion può trasportare al massimo 3500 kg". Leggi i load_limits.

Campi
soft_max_load

int64

Un limite flessibile del carico. Leggi i cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Se il carico supera soft_max_load lungo il percorso di questo veicolo, si applica la seguente penalità (solo una volta per veicolo): (carico - soft_max_load) * cost_per_unit_above_soft_max. Tutti i costi vengono sommati e devono essere nella stessa unità di Shipment.penalty_cost.

start_load_interval

Interval

L'intervallo di carico accettabile del veicolo all'inizio del percorso.

end_load_interval

Interval

L'intervallo di carico accettabile del veicolo alla fine del percorso.

max_load

int64

La quantità massima accettabile di carico.

Intervallo

Intervallo degli importi di carico accettabili.

Campi
min

int64

Un carico minimo accettabile. Deve essere ≥ 0. Se sono specificati entrambi, il valore del campo min deve essere ≤ max.

max

int64

Un carico massimo accettabile. Deve essere ≥ 0. Se non specificato, il carico massimo non viene limitato da questo messaggio. Se sono specificati entrambi, il valore del campo min deve essere ≤ max.

TravelMode

Modalità di viaggio utilizzabili dai veicoli.

Dovrebbero essere un sottoinsieme delle modalità di viaggio preferite dell'API Routes di Google Maps Platform. Consulta: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Enum
TRAVEL_MODE_UNSPECIFIED Modalità di viaggio non specificata, equivalente a DRIVING.
DRIVING Modalità di viaggio corrispondente alle indicazioni stradali (auto, ...).
WALKING Modalità di viaggio corrispondente alle indicazioni a piedi.

UnloadingPolicy

Norme sulla modalità di scarico di un veicolo. Si applica solo alle spedizioni con servizio di ritiro e consegna.

Altre spedizioni possono essere effettuate senza costi aggiuntivi lungo il percorso, indipendentemente da unloading_policy.

Enum
UNLOADING_POLICY_UNSPECIFIED Norme di scaricamento non specificate; le consegne devono avvenire solo dopo i ritiri corrispondenti.
LAST_IN_FIRST_OUT Le consegne devono avvenire in ordine inverso rispetto ai ritiri
FIRST_IN_FIRST_OUT Le consegne devono avvenire nello stesso ordine dei ritiri

Waypoint

Incapsula un waypoint. I Waypoint contrassegnano i luoghi di arrivo e di partenza di VisitRequests, nonché le posizioni di partenza e di arrivo dei veicoli.

Campi
side_of_road

bool

Campo facoltativo. Indica che la posizione di questo waypoint è preferita in modo che il veicolo si fermi su un determinato lato della strada. Quando imposti questo valore, il percorso attraverserà la località in modo che il veicolo possa fermarsi sul lato della strada verso il quale la posizione è orientata rispetto al centro della strada. Questa opzione non funziona per la modalità di viaggio "WALKING".

Campo di unione location_type. Diversi modi per rappresentare un luogo. location_type può essere solo uno dei seguenti:
location

Location

Un punto specificato utilizzando le coordinate geografiche, inclusa un'intestazione facoltativa.

place_id

string

L'ID luogo del PDI associato al waypoint.