Package google.maps.routeoptimization.v1

Indice

RouteOptimization

Un servizio per ottimizzare i percorsi dei veicoli.

Validità di determinati tipi di campi:

  • google.protobuf.Timestamp
    • Gli orari sono espressi in tempo Unix: secondi dal 1970-01-01T00:00:00+00:00.
    • seconds deve essere compreso tra [0, 253402300799], ovvero tra [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nanos deve essere non impostato o impostato su 0.
  • google.protobuf.Duration
    • seconds deve essere compreso tra [0, 253402300799], ovvero tra [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • nanos deve essere non impostato o impostato su 0.
  • google.type.LatLng
    • La latitudine deve essere compresa tra -90,0 e 90,0.
    • La longitudine deve essere compresa tra -180,0 e 180,0.
    • Almeno uno dei valori di latitudine e longitudine deve essere diverso da zero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Ottimizza i percorsi dei veicoli per uno o più messaggi OptimizeToursRequest in batch.

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

L'utente può eseguire il polling di operations.get per controllare lo stato dell'LRO:

Se il campo LRO done è false, significa che almeno una richiesta è ancora in fase di elaborazione. Altre richieste potrebbero essere state completate correttamente e i relativi risultati sono disponibili in Cloud Storage.

Se il campo done dell'LRO è true, significa che tutte le richieste sono state elaborate. I risultati di tutte le richieste elaborate correttamente saranno disponibili in Cloud Storage. I risultati delle richieste non riuscite non saranno disponibili in Cloud Storage. Se il campo error dell'LRO è impostato, contiene l'errore di una delle richieste non riuscite.

Ambiti di autorizzazione

Richiede il seguente ambito OAuth:

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

Richiede la seguente autorizzazione IAM per la risorsa parent:

  • routeoptimization.operations.create

Per saperne di più, consulta la documentazione di IAM.

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Invia un OptimizeToursRequest contenente un ShipmentModel e restituisce un OptimizeToursResponse contenente ShipmentRoute, ovvero un insieme di percorsi che i veicoli devono eseguire riducendo al minimo il costo complessivo.

Un modello ShipmentModel è costituito principalmente da Shipment da eseguire e Vehicle che possono essere utilizzati per trasportare i Shipment. I ShipmentRoute assegnano Shipment a Vehicle. Più nello specifico, assegnano una serie di Visit a ogni veicolo, dove un Visit corrisponde a un VisitRequest, ovvero un ritiro o una consegna per un Shipment.

L'obiettivo è fornire un'assegnazione di ShipmentRoute a Vehicle che riduca al minimo il costo totale, dove il costo ha molti componenti definiti in ShipmentModel.

Ambiti di autorizzazione

Richiede il seguente ambito OAuth:

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

Richiede la seguente autorizzazione IAM per la risorsa parent:

  • routeoptimization.locations.use

Per saperne di più, consulta la documentazione di IAM.

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

Questa è una variante del metodo OptimizeTours progettata per le ottimizzazioni con valori di timeout elevati. Dovrebbe essere preferito al metodo OptimizeTours per le ottimizzazioni che richiedono più di qualche minuto.

L'oggetto long-running operation (LRO) restituito avrà un nome nel formato <parent>/operations/<operation_id> e può essere utilizzato per monitorare l'avanzamento del calcolo. Il tipo di campo metadata è OptimizeToursLongRunningMetadata. In caso di esito positivo, il tipo di campo response è OptimizeToursResponse.

Ambiti di autorizzazione

Richiede il seguente ambito OAuth:

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

Richiede la seguente autorizzazione IAM per la risorsa parent:

  • routeoptimization.operations.create

Per saperne di più, consulta la documentazione di IAM.

OptimizeToursUri

rpc OptimizeToursUri(OptimizeToursUriRequest) returns (Operation)

Questa è una variante del metodo OptimizeToursLongRunning progettata per ottimizzazioni con valori di timeout elevati e dimensioni di input/output elevate.

Il client specifica l'URI Cloud Storage del OptimizeToursRequest archiviato in Google Cloud Storage e il server scrive il OptimizeToursResponse in un URI Cloud Storage specificato dal client.

Questo metodo deve essere preferito al metodo OptimizeTours per le ottimizzazioni che richiedono più di qualche minuto e per le dimensioni di input/output superiori a 8 MB, anche se può essere utilizzato anche per ottimizzazioni più brevi e di dimensioni inferiori.

L'oggetto long-running operation (LRO) restituito avrà un nome nel formato <parent>/operations/<operation_id> e può essere utilizzato per monitorare l'avanzamento del calcolo. Il tipo di campo metadata è OptimizeToursUriMetadata. In caso di esito positivo, il tipo di campo response è OptimizeToursUriResponse.

Ambiti di autorizzazione

Richiede il seguente ambito OAuth:

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

Richiede la seguente autorizzazione IAM per la risorsa parent:

  • routeoptimization.operations.create

Per saperne di più, consulta la documentazione di IAM.

AggregatedMetrics

Metriche aggregate per ShipmentRoute (risp. per OptimizeToursResponse) su tutti gli elementi Transition e/o Visit (risp. su tutti gli elementi 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

La durata totale del viaggio per un percorso o una soluzione.

wait_duration

Duration

La durata totale dell'attesa per un percorso o una soluzione.

delay_duration

Duration

La durata totale del ritardo per un percorso o una soluzione.

break_duration

Duration

La durata totale delle pause per un percorso o una soluzione.

visit_duration

Duration

La durata totale delle visite per un percorso o una soluzione.

total_duration

Duration

La durata totale deve essere uguale alla somma di tutte le durate sopra indicate. Per i percorsi, 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 totale di viaggio per un percorso o una soluzione.

max_loads

map<string, VehicleLoad>

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

performed_mandatory_shipment_count

int32

Numero di spedizioni obbligatorie eseguite.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

performed_shipment_penalty_cost_sum

double

La somma dei Shipment.penalty_cost delle spedizioni eseguite.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

BatchOptimizeToursMetadata

Questo tipo non ha campi.

Metadati delle operazioni per le chiamate BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Richiedi l'ottimizzazione in batch dei tour come operazione asincrona. Ogni file di input deve contenere un OptimizeToursRequest e ogni file di output conterrà un OptimizeToursResponse. La richiesta contiene informazioni per leggere/scrivere e analizzare i file. Tutti i file di input e output devono trovarsi nello stesso progetto.

Campi
parent

string

Obbligatorio. Progetto e località di destinazione per effettuare una chiamata.

Formato:

  • projects/{project-id}
  • projects/{project-id}/locations/-

I valori {location-id} regionali non sono supportati.

model_configs[]

AsyncModelConfig

Obbligatorio. Informazioni di input/output per ogni modello di acquisto, come percorsi dei file e formati dei dati.

AsyncModelConfig

Informazioni per risolvere un modello di ottimizzazione in modo asincrono.

Campi
display_name

string

Facoltativo. Nome del modello definito dall'utente, che 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 sulla posizione di output desiderata.

BatchOptimizeToursResponse

Questo tipo non ha campi.

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

BreakRule

Regole per generare 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ò eseguire alcuna visita. Un'interruzione può verificarsi:

  • durante il viaggio tra due visite (che include il tempo immediatamente prima o immediatamente dopo una visita, ma non nel mezzo di una visita), nel qual caso estende il tempo di transito corrispondente tra le visite,
  • o prima dell'ora di inizio del veicolo (il veicolo non può partire nel mezzo di una pausa), nel qual caso non influisce sull'ora di inizio del veicolo.
  • o dopo la fine del veicolo (idem, con l'ora di fine del veicolo).
Campi
break_requests[]

BreakRequest

Sequenza di interruzioni. Consulta il messaggio BreakRequest.

frequency_constraints[]

FrequencyConstraint

Potrebbero essere applicati diversi FrequencyConstraint. Devono essere tutte soddisfatte dai BreakRequest di questo BreakRule. Vedi FrequencyConstraint.

BreakRequest

La sequenza delle pause (ovvero il loro numero e ordine) che si applicano a ogni veicolo deve essere nota in anticipo. I BreakRequest ripetuti definiscono la sequenza, nell'ordine in cui devono verificarsi. Le finestre temporali (earliest_start_time / latest_start_time) possono sovrapporsi, ma devono essere compatibili con l'ordine (questo viene verificato).

Campi
earliest_start_time

Timestamp

Obbligatorio. Limite inferiore (incluso) all'inizio della pausa.

latest_start_time

Timestamp

Obbligatorio. Limite superiore (incluso) per l'inizio della pausa.

min_duration

Duration

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

FrequencyConstraint

È possibile limitare ulteriormente la frequenza e la durata delle pause specificate sopra applicando una frequenza minima delle pause, ad esempio "Deve esserci una pausa di almeno 1 ora ogni 12 ore". Supponendo che ciò possa essere interpretato come "All'interno di qualsiasi finestra temporale scorrevole di 12 ore, deve esserci almeno una pausa di almeno un'ora", l'esempio si tradurrebbe 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 pause nella soluzione rispetteranno tutti questi vincoli, oltre alle finestre temporali e alle durate minime già specificate in BreakRequest.

In pratica, un FrequencyConstraint può essere applicato a pause non consecutive. Ad esempio, la seguente pianificazione rispetta l'esempio "1 ora ogni 12 ore":

  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. Visualizza la descrizione di FrequencyConstraint.

max_inter_break_duration

Duration

Obbligatorio. Durata massima consentita di qualsiasi intervallo di tempo nel percorso che non includa, almeno parzialmente, una pausa di duration >= min_break_duration. Deve essere positivo.

DataFormat

Formati dei dati per i file di input e 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 https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Un limite che definisce una distanza massima che può essere percorsa. Può essere rigido o morbido.

Se viene definito un limite flessibile, devono essere definiti sia soft_max_meters che cost_per_kilometer_above_soft_max e devono essere non negativi.

Campi
max_meters

int64

Un limite rigido che vincola la distanza a un massimo di max_meters. Il limite deve essere non negativo.

soft_max_meters

int64

Un limite flessibile non impone un limite di distanza massima, ma se viene violato comporta un costo che si aggiunge ad altri costi definiti nel modello, con la stessa unità.

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

cost_per_kilometer_below_soft_max

double

Costo per chilometro sostenuto, fino a soft_max_meters, con la formula:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Questo costo non è supportato in route_distance_limit.

cost_per_kilometer_above_soft_max

double

Costo per chilometro sostenuto se la distanza supera il 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 non negativo.

GcsDestination

La località di Google Cloud Storage in cui verranno scritti i file di output.

Campi
uri

string

Obbligatorio. URI Google Cloud Storage.

GcsSource

La località 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, incluse le informazioni su quali visite devono essere vincolate e come.

Campi
routes[]

ShipmentRoute

Route della soluzione da inserire. Alcuni percorsi potrebbero essere omessi 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

Spedizioni ignorate della soluzione da inserire. Alcuni potrebbero essere omessi dalla soluzione originale. Consulta 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 vincolati.

ConstraintRelaxation

Per un gruppo di veicoli, specifica le soglie in base alle quali i vincoli sulle visite verranno allentati e a quale livello. Le spedizioni elencate nel campo skipped_shipment devono essere saltate, ovvero non possono essere eseguite.

Campi
relaxations[]

Relaxation

Tutti i rilassamenti dei vincoli di visita che verranno applicati alle visite sui percorsi con veicoli in vehicle_indices.

vehicle_indices[]

int32

Specifica gli indici dei veicoli a cui si applica il vincolo di visita relaxations. Se non viene specificato, questo viene considerato il valore predefinito e i relaxations si applicano a tutti i veicoli non specificati in altri constraint_relaxations. Può esserci al massimo un valore predefinito, ovvero è consentito al massimo un campo di rilassamento dei vincoli vuoto vehicle_indices. Un indice dei veicoli può essere elencato una sola volta, anche all'interno di più constraint_relaxations.

Un indice del veicolo viene mappato allo stesso modo di ShipmentRoute.vehicle_index, se interpret_injected_solutions_using_labels è true (vedi il commento fields).

Relax

Se relaxations è vuoto, l'ora di inizio e la sequenza di tutte le visite su routes sono completamente vincolate 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 used_if_route_is_empty sia impostato su false nel modello).

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

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

Analogamente, l'inizio del percorso del veicolo viene posticipato a relaxations(i).level se soddisfa:

  • vehicle_start_time >= relaxations(i).threshold_time AND
  • relaxations(i).threshold_visit_count == 0 e la fine del veicolo viene impostata su relaxations(i).level se soddisfa:
  • vehicle_end_time >= relaxations(i).threshold_time AND
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Per applicare un livello di rilassamento se una visita soddisfa threshold_visit_count O 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, viene applicato il livello più permissivo. Di conseguenza, dalla partenza del veicolo alle visite del percorso in ordine fino alla fine del veicolo, il livello di rilassamento diventa più rilassato, ovvero il livello di rilassamento non diminuisce man mano che il percorso procede.

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

Campi
level

Level

Il livello di rilassamento dei vincoli che si applica quando vengono soddisfatte le condizioni a partire da threshold_time E almeno threshold_visit_count.

threshold_time

Timestamp

L'ora in cui o dopo la quale è possibile applicare l'allentamento level.

threshold_visit_count

int32

Il numero di visite in corrispondenza o dopo le quali è possibile applicare l'allentamento level. Se threshold_visit_count è 0 (o non è impostato), level potrebbe essere applicato direttamente all'inizio 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 dei vincoli, che vengono applicati per una visita e per quelle successive quando soddisfano le condizioni di soglia.

L'enumerazione riportata di seguito è in ordine di rilassamento crescente.

Enum
LEVEL_UNSPECIFIED

Livello di rilassamento predefinito implicito: non viene rilassato alcun vincolo, ovvero tutte le visite sono completamente vincolate.

Questo valore non deve essere utilizzato esplicitamente in level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Gli orari di inizio delle visite e gli orari di inizio/fine dei veicoli verranno rilassati, ma ogni visita rimane associata allo stesso veicolo e la sequenza delle visite deve essere rispettata: non è possibile inserire visite tra di loro o prima di loro.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Come RELAX_VISIT_TIMES_AFTER_THRESHOLD, ma anche la sequenza di visite è meno rigida: le visite possono essere eseguite solo da questo veicolo, ma potrebbero non essere eseguite.
RELAX_ALL_AFTER_THRESHOLD Come RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, ma anche il veicolo è rilassato: le visite sono completamente senza costi al momento o dopo l'orario di soglia e possono potenzialmente non essere eseguite.

InputConfig

Specifica un input per [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Campi
data_format

DataFormat

Obbligatorio. Il formato dei dati di input.

Campo unione source. Obbligatorio. source può essere solo uno dei seguenti tipi:
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

La direzione della bussola associata alla direzione del flusso del traffico. Questo valore viene utilizzato per specificare il lato della strada da utilizzare per il ritiro e la consegna. I valori della direzione possono essere compresi tra 0 e 360, dove 0 indica una direzione verso nord, 90 indica una direzione verso est e così via.

OptimizeToursLongRunningMetadata

Questo tipo non ha campi.

Metadati delle operazioni per le chiamate OptimizeToursLongRunning.

OptimizeToursRequest

Richiesta da inviare a un risolutore di ottimizzazione dei tour che definisce il modello di spedizione da risolvere e i parametri di ottimizzazione.

Campi
parent

string

Obbligatorio. Progetto o località di destinazione per effettuare una chiamata.

Formato:

  • projects/{project-id}
  • projects/{project-id}/locations/-

I valori {location-id} regionali non sono supportati.

timeout

Duration

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

Per le richieste asincrone, il server genererà una soluzione (se possibile) prima della scadenza del timeout.

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

Guida l'algoritmo di ottimizzazione nella ricerca di una prima soluzione simile a una soluzione precedente.

Il modello viene vincolato quando viene creata la prima soluzione. Tutte le spedizioni non eseguite su un percorso vengono implicitamente ignorate nella prima soluzione, ma possono essere eseguite nelle soluzioni successive.

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

  • per tutte le route, vehicle_index deve essere compreso nell'intervallo e non deve essere duplicato.
  • Per tutte le visite, shipment_index e visit_request_index devono essere compresi nell'intervallo.
  • una spedizione può essere indicata in un solo percorso.
  • Il ritiro di una spedizione di ritiro e consegna deve essere eseguito prima della consegna.
  • non è possibile eseguire più di un'alternativa di ritiro o di consegna di una spedizione.
  • per tutti i percorsi, i tempi aumentano (ovvero, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • una spedizione può essere eseguita solo su un veicolo consentito. Un veicolo è consentito se Shipment.allowed_vehicle_indices è vuoto o se il relativo 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 percorsi già completati o che devono essere completati, ma non devono essere modificati.

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 non è vuoto, i percorsi specificati verranno aggiornati senza modificare la sequenza di visite o i tempi di percorrenza sottostanti: verranno aggiornati solo gli altri dettagli. Questo non risolve il modello.

A partire da novembre 2020, questo campo compila solo le polilinee dei percorsi non vuoti e richiede che populate_polylines sia true.

I campi route_polyline dei percorsi trasmessi 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 sul 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 true:

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 veicolo nella richiesta sono cambiati dalla creazione della soluzione, ad esempio perché le spedizioni o i veicoli sono stati rimossi o aggiunti alla richiesta.

Se true, le etichette nelle seguenti categorie devono essere visualizzate al massimo una volta nella loro categoria:

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

La rimozione di visite di un percorso o di interi percorsi da una soluzione inserita potrebbe avere un effetto sui vincoli impliciti, il che potrebbe portare a una modifica della soluzione, a errori di convalida o all'impossibilità di esecuzione.

NOTA: il chiamante deve assicurarsi che ogni Vehicle.label (risp. Shipment.label) identifica in modo univoco un'entità veicolo (risp. spedizione) utilizzata nelle due richieste pertinenti: la richiesta passata che ha generato il OptimizeToursResponse utilizzato nella soluzione inserita e la richiesta corrente che include la soluzione inserita. I controlli di unicità 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 impostato su true, le polilinee verranno inserite negli elementi ShipmentRoute della risposta.

populate_transition_polylines

bool

Se true, le polilinee e i token di percorso verranno compilati nella risposta ShipmentRoute.transitions.

allow_large_deadline_despite_interruption_risk

bool

Se questo campo è impostato, la richiesta può avere una scadenza (vedi https://grpc.io/blog/deadlines) fino a 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 comunque ridotto).

use_geodesic_distances

bool

Se true, le distanze di viaggio verranno calcolate utilizzando le distanze geodetiche anziché quelle di Google Maps e i tempi di percorrenza verranno calcolati utilizzando le distanze geodetiche con una velocità definita da geodesic_meters_per_second.

label

string

Etichetta che può essere utilizzata per identificare questa richiesta, riportata in OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

Quando use_geodesic_distances è true, questo campo deve essere impostato e definisce la velocità applicata per calcolare i tempi di percorrenza. Il valore deve essere almeno pari a 1,0 metri/secondi.

max_validation_errors

int32

Tronca il numero di errori di convalida restituiti. Questi errori sono in genere allegati a un payload di errore INVALID_ARGUMENT come dettaglio dell'errore BadRequest (https://cloud.google.com/apis/design/errors#error_details), a meno che solving_mode=VALIDATE_ONLY: consulta il campo OptimizeToursResponse.validation_errors. Il valore predefinito è 100 e il limite massimo è 10.000.

SearchMode

Modalità che definisce il comportamento della ricerca, bilanciando la latenza con la qualità della soluzione. In tutte le modalità, viene applicata la scadenza della richiesta globale.

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

SolvingMode

Definisce il modo in cui 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. Gli avvisi possono essere emessi in [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Convalida solo il modello 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 infattibilità nei percorsi injected_solution_constraint, queste vengono inserite nel campo OptimizeToursResponse.validation_errors e OptimizeToursResponse.skipped_shipments viene lasciato vuoto.

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

TRANSFORM_AND_RETURN_REQUEST

Questa modalità funziona solo se ShipmentModel.objectives non è vuoto. La richiesta non è stata risolta. Viene convalidato e compilato solo con i costi corrispondenti agli obiettivi indicati. Consulta anche la documentazione di ShipmentModel.objectives. La richiesta risultante viene restituita come OptimizeToursResponse.processed_request.

Sperimentale: per ulteriori dettagli, consulta la pagina https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

OptimizeToursResponse

Risposta dopo aver risolto un problema di ottimizzazione del percorso contenente i percorsi seguiti da ogni veicolo, le spedizioni che sono state saltate e il costo complessivo della soluzione.

Campi
routes[]

ShipmentRoute

Percorsi calcolati per ogni veicolo; l'i-esimo percorso corrisponde all'i-esimo veicolo nel modello.

request_label

string

Copia di 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. Consulta la spiegazione "MULTIPLE ERRORS" per il messaggio OptimizeToursValidationError. Invece degli errori, verranno inclusi gli avvisi nel caso in cui solving_mode sia DEFAULT_SOLVE.

processed_request

OptimizeToursRequest

In alcuni casi, modifichiamo la richiesta in entrata prima di risolverla, ad esempio aggiungendo i costi. Se solving_mode == TRANSFORM_AND_RETURN_REQUEST, la richiesta modificata viene restituita qui.

Sperimentale: per ulteriori dettagli, consulta la pagina https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

metrics

Metrics

Metriche di durata, distanza e utilizzo per questa soluzione.

Metriche

Metriche complessive, aggregate per tutti i percorsi.

Campi
aggregated_route_metrics

AggregatedMetrics

Aggregati in base ai percorsi. Ogni metrica è la somma (o il valore massimo, per i carichi) 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 un percorso del veicolo è vuoto e Vehicle.used_if_route_is_empty è true, il veicolo viene considerato utilizzato.

earliest_vehicle_start_time

Timestamp

L'ora di inizio più remota per un veicolo utilizzato, calcolata come il valore minimo di ShipmentRoute.vehicle_start_time per tutti i veicoli utilizzati.

latest_vehicle_end_time

Timestamp

L'ora di fine più recente per un veicolo utilizzato, calcolata come il valore massimo di ShipmentRoute.vehicle_end_time per tutti i veicoli utilizzati.

costs

map<string, double>

Costo della soluzione, suddiviso per campi di richiesta relativi ai costi. Le chiavi sono percorsi proto, relativi alla richiesta OptimizeToursRequest di input, ad esempio "model.shipments.pickups.cost", e i valori sono il costo totale generato dal campo di costo corrispondente, aggregato per l'intera soluzione. In altre parole, costs["model.shipments.pickups.cost"] è la somma di tutti i costi dei ritiri nella soluzione. Tutti i costi definiti nel modello sono riportati in dettaglio qui, ad eccezione dei costi relativi a TransitionAttributes, che sono riportati solo in modo aggregato a partire da gennaio 2022.

total_cost

double

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

OptimizeToursUriMetadata

Questo tipo non ha campi.

Metadati delle operazioni per le chiamate OptimizeToursUri.

OptimizeToursUriRequest

Una richiesta utilizzata dal metodo OptimizeToursUri.

Campi
parent

string

Obbligatorio. Progetto o località di destinazione per effettuare una chiamata.

Formato:

  • projects/{project-id}
  • projects/{project-id}/locations/-

I valori {location-id} regionali non sono supportati.

input

Uri

Obbligatorio. L'URI dell'oggetto Cloud Storage contenente OptimizeToursRequest.

output

Uri

Obbligatorio. L'URI dell'oggetto Cloud Storage che conterrà OptimizeToursResponse.

OptimizeToursUriResponse

Una risposta restituita dal metodo OptimizeToursUri.

Campi
output

Uri

Facoltativo. L'URI dell'oggetto Cloud Storage contenente OptimizeToursResponse codificato come JSON o textproto. Se l'oggetto è stato codificato come JSON, l'estensione del nome dell'oggetto sarà .json. Se l'oggetto è stato codificato come textproto, l'estensione del nome dell'oggetto sarà .txtpb.

Il crc32_checksum della risorsa può essere utilizzato per verificare che i contenuti della risorsa non siano stati modificati.

OptimizeToursValidationError

Descrive un errore o un avviso riscontrato durante la convalida di un OptimizeToursRequest.

Campi
code

int32

Un errore di convalida è definito dalla coppia (code, display_name), che è sempre presente.

I campi che seguono questa sezione forniscono ulteriori informazioni sull'errore.

ERRORI MULTIPLI: quando sono presenti più errori, il processo di convalida tenta di restituirne diversi. Proprio come un compilatore, questo è un processo imperfetto. Alcuni errori di convalida saranno "fatali", ovvero interromperanno l'intero processo di convalida. Questo è il caso, tra gli altri, degli errori display_name="UNSPECIFIED". Alcuni errori potrebbero causare l'omissione di altri errori durante il processo di convalida.

STABILITÀ: code e display_name devono essere molto stabili. Tuttavia, nel tempo potrebbero essere visualizzati nuovi codici e nomi visualizzati, il che potrebbe far sì che una determinata richiesta (non valida) produca una coppia (code, display_name) diversa perché il nuovo errore ha nascosto quello precedente. Ad esempio, vedi "MULTIPLE ERRORS".

display_name

string

Il nome visualizzato dell'errore.

fields[]

FieldReference

Un contesto di errore può coinvolgere 0, 1 (nella maggior parte dei casi) o più campi. Ad esempio, per fare riferimento al veicolo n. 4 e al primo ritiro della spedizione n. 2, puoi procedere come segue:

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

Tieni presente, tuttavia, 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 code != "UNSPECIFIED").

STABILITÀ: non stabile. Il messaggio di errore associato a un determinato code potrebbe cambiare (si spera per chiarirlo) nel tempo. Fai invece affidamento su display_name e code.

offending_values

string

Può contenere i valori dei campi. Questa opzione non è sempre disponibile. Non devi assolutamente fare affidamento su questo valore e utilizzarlo solo per il debug manuale del modello.

FieldReference

Specifica un contesto per l'errore di convalida. Un FieldReference fa sempre riferimento a un determinato campo in questo file e segue la stessa struttura gerarchica. Ad esempio, possiamo 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 le entità di primo livello come OptimizeToursRequest o ShipmentModel per evitare di affollare il messaggio.

Campi
name

string

Nome del campo, ad esempio "vehicles".

sub_field

FieldReference

Campo secondario nidificato in modo ricorsivo, se necessario.

Campo unione index_or_key.

index_or_key può essere solo uno dei seguenti tipi:

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.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Campi
data_format

DataFormat

Obbligatorio. Il formato dei dati di output.

Campo unione destination. Obbligatorio. destination può essere solo uno dei seguenti tipi:
gcs_destination

GcsDestination

La località di Google Cloud Storage in cui scrivere l'output.

RouteModifiers

Incapsula un insieme di condizioni facoltative da soddisfare durante il calcolo dei percorsi dei veicoli. Questo è simile a RouteModifiers nell'API Routes Preferred di Google Maps Platform; consulta: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Campi
avoid_tolls

bool

Specifica se evitare le strade a pedaggio, se possibile. Verrà data la preferenza ai percorsi che non contengono strade a pedaggio. Si applica solo alle modalità di viaggio motorizzate.

avoid_highways

bool

Specifica se evitare le autostrade, se possibile. Verrà data la preferenza ai percorsi che non contengono autostrade. Si applica solo alle modalità di viaggio motorizzate.

avoid_ferries

bool

Specifica se evitare i traghetti, se ragionevole. Verrà data la preferenza ai percorsi che non prevedono l'utilizzo di traghetti. Si applica solo alle modalità di viaggio motorizzate.

avoid_indoor

bool

Facoltativo. Specifica se evitare la navigazione in ambienti chiusi, se possibile. Verrà data la preferenza ai percorsi che non contengono la navigazione interna. Si applica solo alla modalità di viaggio WALKING.

Spedizione

La spedizione di un singolo articolo, da uno dei suoi ritiri a una delle sue consegne. Affinché la spedizione venga considerata come eseguita, un veicolo univoco deve visitare una delle sue località di ritiro (e ridurre di conseguenza le sue capacità residue), quindi visitare una delle sue località di consegna in un secondo momento (e quindi aumentare di nuovo le sue capacità residue di conseguenza).

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 località corrispondente alle consegne.

deliveries[]

VisitRequest

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

load_demands

map<string, Load>

Requisiti 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 di carico corrispondente, idealmente 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 nullo.

allowed_vehicle_indices[]

int32

L'insieme di veicoli che possono eseguire questa spedizione. Se il campo è vuoto, tutti i veicoli possono eseguirla. I veicoli sono indicati dal loro indice nell'elenco vehicles di ShipmentModel.

costs_per_vehicle[]

double

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

  • 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'i-esimo elemento corrisponde al veicolo #i del modello.

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

costs_per_vehicle_indices[]

int32

Indici dei veicoli a cui si applica costs_per_vehicle. Se non è vuoto, deve contenere lo stesso numero di elementi di costs_per_vehicle. Un indice del veicolo non può essere specificato più di una volta. Se un veicolo è 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 valore non negativo e la spedizione deve contenere almeno un ritiro e una consegna.

Ad esempio, supponiamo che t sia il tempo più breve impiegato per andare dall'alternativa di ritiro selezionata direttamente all'alternativa di consegna selezionata. In questo caso, l'impostazione pickup_to_delivery_absolute_detour_limit applica:

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

Se per la stessa spedizione vengono specificati sia limiti relativi che assoluti, per ogni possibile coppia di ritiro/consegna viene utilizzato il limite più restrittivo. A partire da ottobre 2017, le deviazioni sono supportate solo quando le durate dei viaggi non dipendono 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 non negativo e la spedizione deve contenere almeno un ritiro e una consegna. Questo non dipende dalle alternative selezionate per il ritiro e la consegna, né dalla velocità del veicolo. Questo valore può essere specificato insieme ai vincoli di deviazione massima: la soluzione rispetterà entrambe le specifiche.

shipment_type

string

Stringa non vuota che specifica un "tipo" 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 da visit_types, che viene specificato per una singola visita: tutti i ritiri/consegne appartenenti alla stessa spedizione condividono lo stesso shipment_type.

label

string

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

ignore

bool

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

Se ignori una spedizione, si verifica 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 visite di ritiro/consegna correlate dal percorso di esecuzione. precedence_rules che fanno riferimento a spedizioni ignorate verranno ignorati.

penalty_cost

double

Se la spedizione non viene completata, questa penalità 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 penalità non viene specificata, viene considerata infinita, ovvero 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 valore non negativo e la spedizione deve contenere almeno un ritiro e una consegna.

Ad esempio, supponiamo che t sia il tempo più breve impiegato per andare dall'alternativa di ritiro selezionata direttamente all'alternativa di consegna selezionata. In questo caso, l'impostazione pickup_to_delivery_relative_detour_limit applica:

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 limiti relativi che assoluti, per ogni possibile coppia di ritiro/consegna viene utilizzato il limite più restrittivo. A partire da ottobre 2017, le deviazioni sono supportate solo quando le durate dei viaggi non dipendono dai veicoli.

Carica

Quando si esegue una visita, un importo predefinito può essere aggiunto al carico del veicolo se si tratta di un ritiro o sottratto se si tratta di una consegna. Questo messaggio definisce questo importo. Leggi i load_demands.

Campi
amount

int64

La quantità di variazione del carico del veicolo che esegue la visita corrispondente. Poiché si tratta di un numero intero, consigliamo agli utenti di scegliere un'unità appropriata per evitare la perdita di precisione. Deve essere ≥ 0.

VisitRequest

Richiesta di una visita che può essere eseguita da un veicolo: ha una posizione geografica (o due, vedi sotto), orari di apertura e chiusura rappresentati da finestre temporali e una durata del servizio (tempo trascorso dal veicolo una volta arrivato per il ritiro o la consegna delle merci).

Campi
arrival_location

LatLng

La posizione geografica in cui arriva il veicolo quando esegue questa VisitRequest. Se il modello di spedizione ha matrici di distanza della durata, arrival_location non deve essere specificato.

arrival_waypoint

Waypoint

Il waypoint in cui arriva il veicolo quando esegue questa VisitRequest. Se il modello di spedizione ha matrici di distanza della durata, arrival_waypoint non deve essere specificato.

departure_location

LatLng

La posizione geografica 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 distanza della durata, departure_location non deve essere specificato.

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 distanza della durata, departure_waypoint non deve essere specificato.

tags[]

string

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

time_windows[]

TimeWindow

Finestre temporali che limitano l'ora di arrivo di una visita. Tieni presente che un veicolo può partire al di fuori della finestra temporale di arrivo, ovvero l'ora di arrivo + la durata non devono necessariamente rientrare in una finestra temporale. Ciò può comportare un tempo di attesa se il veicolo arriva prima di TimeWindow.start_time.

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

Le finestre temporali devono essere disgiunte, 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 esiste una singola finestra temporale.

duration

Duration

Durata della visita, ovvero il tempo trascorso dal veicolo tra l'arrivo e la partenza (da aggiungere all'eventuale tempo di attesa; vedi time_windows).

cost

double

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

load_demands

map<string, Load>

Requisiti di carico di questa richiesta di visita. Questo campo è simile al campo Shipment.load_demands, ma si applica solo a questo VisitRequest anziché all'intero Shipment. Le domande elencate qui vengono aggiunte a quelle elencate in Shipment.load_demands.

visit_types[]

string

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

Un tipo può essere visualizzato una sola volta.

label

string

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

avoid_u_turns

bool

Specifica se evitare le inversioni a U nei percorsi in auto in questa località. L'evitamento delle inversioni a U è un'operazione "best effort" e l'evitamento completo non è garantito. Questa è una funzionalità sperimentale e il comportamento è soggetto a modifiche.

Sperimentale: per maggiori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

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, che è la somma di:

  • il costo del routing dei veicoli (somma del costo per tempo totale, del costo per tempo di percorrenza e del costo fisso per tutti i veicoli).
  • le penali per la mancata spedizione.
  • il costo della durata complessiva delle spedizioni
Campi
shipments[]

Shipment

Insieme di spedizioni che devono essere eseguite nel modello.

vehicles[]

Vehicle

Insieme di veicoli che possono essere utilizzati per eseguire le visite.

objectives[]

Objective

L'insieme di obiettivi per questo modello, che trasformeremo in costi. Se non è vuoto, il modello di input deve essere senza costi. Per ottenere la richiesta modificata, utilizza solving_mode = TRANSFORM_AND_RETURN_REQUEST. Tieni presente che in questo caso la richiesta non verrà risolta. Consulta la documentazione corrispondente.

Sperimentale: per ulteriori dettagli, consulta la pagina https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

global_start_time

Timestamp

Ora di inizio e di fine globale del modello: non possono essere considerate valide ore al di fuori di questo intervallo.

L'intervallo di tempo del modello deve essere inferiore a un anno, ovvero global_end_time e global_start_time devono essere entro 31.536. 000 secondi l'uno dall'altro.

Quando utilizzi i campi cost_per_*hour, ti consigliamo di impostare questa finestra su un intervallo più piccolo per aumentare le prestazioni (ad es. se modelli un singolo giorno, devi impostare i limiti di tempo globali su quel giorno). Se non impostato, viene utilizzato il valore predefinito 00:00:00 UTC, 1° gennaio 1970 (ovvero secondi: 0, nanos: 0).

global_end_time

Timestamp

Se non impostato, viene utilizzato il valore predefinito 00:00:00 UTC, 1° gennaio 1971 (ovvero secondi: 31536000, nanos: 0).

global_duration_cost_per_hour

double

La "durata globale" del piano complessivo è la differenza tra l'ora di inizio effettiva più remota e l'ora di fine effettiva più recente di tutti i veicoli. Gli utenti possono assegnare un costo orario a questa quantità per cercare di ottimizzare, ad esempio, il completamento più rapido del job. Questo costo deve essere nella stessa unità di Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Specifica le matrici di durata e Distance Matrix utilizzate nel modello. Se questo campo è vuoto, verranno utilizzate le distanze di Google Maps o 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_tags né duration_distance_matrix_dst_tags possono essere vuoti.

Esempi di utilizzo:

  • Esistono due località: locA e locB.
  • 1 veicolo che inizia il percorso in locA e lo termina in locA.
  • 1 richiesta di visita per il 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 località: locA, locB e locC.
  • 1 veicolo che inizia il percorso in locA e lo termina in locB, utilizzando la matrice "fast".
  • 1 veicolo che inizia il percorso in locB e lo termina in locB, utilizzando la matrice "slow".
  • 1 veicolo che inizia il percorso in locB e lo termina in locB, utilizzando la matrice "fast".
  • 1 richiesta di visita per il 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 Distance Matrix; duration_distance_matrices(i).rows(j) definisce le durate e le distanze dalle visite con 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 un Vehicle possono essere uguali; allo stesso modo, i tag di origine e destinazione di un VisitRequest possono essere uguali. 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 Distance Matrix; duration_distance_matrices(i).rows(j).durations(k) (risp. duration_distance_matrices(i).rows(j).meters(k)) definisce la durata (risp. la distanza) del viaggio dalle visite con tag duration_distance_matrix_src_tags(j) alle visite con 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 un Vehicle possono essere uguali; allo stesso modo, i tag di origine e destinazione di un VisitRequest possono essere uguali. 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 shipment_type incompatibili (vedi ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Insiemi di requisiti shipment_type (vedi ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Insieme di regole di precedenza che devono essere applicate nel modello.

IMPORTANTE: l'utilizzo delle regole di precedenza limita le dimensioni del problema che può essere ottimizzato. Le richieste che utilizzano regole di precedenza che includono molte spedizioni potrebbero essere rifiutate.

max_active_vehicles

int32

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

DurationDistanceMatrix

Specifica una matrice di durata e Distance Matrix dalle località di partenza delle visite e dei veicoli alle località di arrivo delle visite e dei veicoli.

Campi
rows[]

Row

Specifica le righe della matrice di durata e distanza. Deve contenere lo stesso numero di elementi di ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

Tag che definisce i veicoli a cui si applica questa Distance Matrix di durata e distanza. Se non viene specificato, si applica a tutti i veicoli e può esistere una sola matrice.

Ogni partenza del veicolo deve corrispondere esattamente a una matrice, ovvero esattamente uno dei campi start_tags deve corrispondere a vehicle_start_tag di una matrice (e solo di quella matrice).

Tutte le matrici devono avere un vehicle_start_tag diverso.

Riga

Specifica una riga della matrice di durata e distanza.

Campi
durations[]

Duration

Valori di durata per una determinata riga. Deve contenere lo stesso numero di elementi di ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Valori di distanza per una determinata riga. Se nessun costo o vincolo fa riferimento alle distanze nel modello, questo campo può essere lasciato vuoto; in caso contrario, deve contenere lo stesso numero di elementi di durations.

Obiettivo

Gli obiettivi sostituiscono completamente il modello di costo e, pertanto, non sono compatibili con i costi preesistenti. Ogni obiettivo corrisponde a un numero di costi predefiniti, ad esempio per veicoli, spedizioni o attributi di transizione.

Sperimentale: per ulteriori dettagli, consulta la pagina https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

Campi
type

Type

Il tipo di obiettivo.

weight

double

Quanto deve contare questo obiettivo rispetto agli altri. Può essere qualsiasi numero non negativo; la somma dei pesi non deve essere necessariamente pari a 1. Il valore predefinito dei pesi è 1,0.

Tipo

Il tipo di obiettivo che verrà mappato a un insieme di costi.

Enum
DEFAULT Verrà utilizzato un insieme di costi predefinito per garantire una soluzione ragionevole. Nota: questo obiettivo può essere utilizzato da solo, ma verrà sempre aggiunto con un peso di 1,0, come base di riferimento, agli obiettivi specificati dall'utente, se non è già presente.
MIN_DISTANCE "MIN". Ridurre al minimo la distanza totale percorsa.
MIN_WORKING_TIME Ridurre al minimo il tempo di lavoro totale, sommato per tutti i veicoli.
MIN_TRAVEL_TIME Come sopra, ma concentrandosi solo sul tempo di percorrenza.
MIN_NUM_VEHICLES Ridurre al minimo il numero di veicoli utilizzati.

PrecedenceRule

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

Più precedenze possono fare riferimento agli stessi eventi (o a eventi 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 precedenze si applicano solo quando vengono eseguite entrambe le spedizioni, altrimenti vengono ignorate.

Campi
first_is_delivery

bool

Indica se il "primo" evento è una consegna.

second_is_delivery

bool

Indica se il "secondo" evento è una consegna.

offset_duration

Duration

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

first_index

int32

Indice della spedizione del "primo" evento. Questo campo deve essere specificato.

second_index

int32

Indice della spedizione del "secondo" evento. Questo campo deve essere specificato.

ShipmentRoute

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

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

Tieni presente che facciamo una distinzione tra:

  • "Eventi puntuali", come l'inizio e la fine del veicolo e l'inizio e la fine di ogni visita (ovvero l'arrivo e la partenza). Si verificano in un secondo specifico.
  • "intervalli di tempo", come le visite stesse e la transizione tra le visite. Sebbene gli intervalli di tempo possano talvolta avere una durata pari a zero, ovvero iniziare e terminare nello stesso secondo, spesso hanno una durata positiva.

Invarianti:

  • Se ci sono n visite, ci sono n+1 transizioni.
  • Una visita è sempre preceduta da una transizione (stesso indice) e seguita da una transizione (indice + 1).
  • La partenza del veicolo è sempre seguita dalla transizione n. 0.
  • La fine del veicolo è sempre preceduta dalla transizione #n.

Ecco cosa succede durante un Transition e un Visit:

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

Infine, ecco come possono essere organizzati i tempi di VIAGGIO, PAUSA, RITARDO e ATTESA durante una transizione.

  • Non si sovrappongono.
  • Il DELAY è univoco e deve essere un periodo di tempo contiguo immediatamente precedente alla visita successiva (o alla fine del veicolo). Pertanto, è sufficiente conoscere la durata del ritardo per conoscerne l'ora di inizio e di fine.
  • Le PAUSE sono periodi di tempo contigui e non sovrapposti. La risposta specifica l'ora di inizio e la durata di ogni interruzione.
  • TRAVEL e WAIT sono "preemptable": possono essere interrotti più volte durante questa transizione. I client possono presumere che il viaggio avvenga "il prima possibile" e che l'attesa riempia il tempo rimanente.

Un esempio (complesso):

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Campi
vehicle_index

int32

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

vehicle_label

string

Etichetta del veicolo che esegue 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 suo percorso.

visits[]

Visit

Sequenza ordinata di visite che rappresentano un percorso. visits[i] è la i-esima visita nel percorso. Se questo campo è vuoto, il veicolo è considerato non utilizzato.

transitions[]

Transition

Elenco ordinato delle transizioni per il percorso.

has_traffic_infeasibilities

bool

Quando OptimizeToursRequest.consider_road_traffic è impostato su true, questo campo indica che le incoerenze nei tempi dei percorsi vengono previste utilizzando le stime della durata del viaggio basate sul traffico. Potrebbe non esserci tempo sufficiente per completare il viaggio con traffico regolato, i ritardi e le pause tra le visite, prima della prima visita o dopo l'ultima visita, pur rispettando le finestre temporali della visita e del veicolo. Ad esempio,

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

L'arrivo alla prossima visita avverrà probabilmente più tardi rispetto alla finestra temporale attuale a causa dell'aumento del tempo di percorrenza stimato travel_duration(previous_visit, next_visit) dovuto al traffico. Inoltre, una pausa potrebbe essere costretta a sovrapporsi a una visita a causa di un aumento delle stime del tempo di percorrenza e delle limitazioni della finestra temporale della visita o della pausa.

route_polyline

EncodedPolyline

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

breaks[]

Break

Pause programmate per il veicolo che esegue questo percorso. La sequenza breaks rappresenta gli intervalli di tempo, ciascuno dei quali inizia in corrispondenza del valore start_time corrispondente e dura duration secondi.

metrics

AggregatedMetrics

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

vehicle_fullness

VehicleFullness

Campo VehicleFullness per calcolare quanto le metriche con limite sono vicine ai rispettivi limiti del veicolo. I suoi campi sono rapporti tra un campo di metrica con limite (ad es. AggregatedMetrics.travel_distance_meters) e il limite del veicolo correlato (ad es. Vehicle.route_distance_limit).

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

route_costs

map<string, double>

Costo del percorso, suddiviso per campi di richiesta relativi ai costi. Le chiavi sono percorsi proto, relativi all'input OptimizeToursRequest, ad esempio "model.shipments.pickups.cost", e i valori sono il costo totale generato dal campo di costo corrispondente, aggregato per l'intero percorso. In altre parole, costs["model.shipments.pickups.cost"] è la somma di tutti i costi del ritiro lungo il percorso. Tutti i costi definiti nel modello sono riportati in dettaglio qui, ad eccezione dei costi relativi a TransitionAttributes, che sono riportati solo in modo aggregato a partire da 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 un'interruzione.

duration

Duration

Durata di una pausa.

EncodedPolyline

La rappresentazione codificata di una polilinea. Per saperne di più sulla codifica delle polilinee, consulta queste pagine: 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.

Transizione

Transizione tra due eventi sul percorso. Consulta la descrizione di ShipmentRoute.

Se il veicolo non ha un start_location e/o un end_location, le metriche di viaggio corrispondenti sono pari a 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 viene impostato su true. Questo problema potrebbe essere temporaneo (un raro problema nei server del traffico in tempo reale) o permanente (nessun dato per questa località).

delay_duration

Duration

Somma delle durate dei ritardi applicati 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 della durata delle pause che si verificano durante questa transizione, se presenti. I dettagli sull'ora di inizio e sulla durata di ogni interruzione sono memorizzati in ShipmentRoute.breaks.

wait_duration

Duration

Tempo trascorso in attesa durante questa transizione. La durata dell'attesa corrisponde al tempo di inattività e non include il tempo di pausa. Tieni presente inoltre che questo tempo di attesa potrebbe essere suddiviso in diversi intervalli non contigui.

total_duration

Duration

Durata totale della transizione, fornita per praticità. È uguale a:

  • visita successiva start_time (o vehicle_end_time se si tratta dell'ultima transizione) - start_time di questa transizione;
  • Se ShipmentRoute.has_traffic_infeasibilities è false, vale anche quanto segue: `total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

Ora di inizio di questa transizione.

route_polyline

EncodedPolyline

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

route_token

string

Solo output. Un token opaco che può essere passato all'SDK di navigazione per ricostruire il percorso durante la navigazione e, in caso di cambio percorso, rispettare l'intenzione originale al momento della creazione del percorso. Tratta questo token come un blob opaco. Non confrontare il suo valore tra le richieste, poiché potrebbe cambiare anche se il servizio restituisce lo stesso percorso. Questo campo viene compilato solo se populate_transition_polylines è impostato su true.

vehicle_loads

map<string, VehicleLoad>

Carichi del veicolo durante questa transizione, per ogni tipo che appare nel Vehicle.load_limits di questo veicolo o che ha un Shipment.load_demands diverso da zero in alcune spedizioni eseguite su questo percorso.

I carichi durante la prima transizione sono i carichi iniziali del percorso del veicolo. Poi, dopo ogni visita, i load_demands della visita vengono aggiunti o sottratti per ottenere i carichi della transizione successiva, a seconda che la visita sia stata un ritiro o una consegna.

VehicleLoad

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

Campi
amount

int64

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

Visita

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

Campi
shipment_index

int32

Indice del campo shipments nell'origine ShipmentModel.

is_pickup

bool

Se 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

L'ora di inizio della visita. Tieni presente che il veicolo potrebbe arrivare prima di questo orario nel luogo della visita. Gli orari sono coerenti con il ShipmentModel.

load_demands

map<string, Load>

Domanda di carico totale della visita 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 sul percorso prima della visita e al potenziale tempo di attesa indotto dalle finestre temporali. Se la visita è una consegna, la deviazione viene calcolata dalla visita di ritiro corrispondente ed è 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 a partire dal start_location del veicolo ed è uguale a:

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

string

Copia del Shipment.label corrispondente, se specificato nel Shipment.

visit_label

string

Copia del VisitRequest.label corrispondente, se specificato nel VisitRequest.

visit_type

VisitType

Facoltativo. Specifica il tipo di visita. Esegue l'override del campo Visit.is_pickup.

injected_solution_location_token

int32

Un token opaco che rappresenta le informazioni su una località visitata.

Questo campo può essere compilato nelle visite dei percorsi dei risultati quando VisitRequest.avoid_u_turns è stato impostato su true per questa visita o se ShipmentModel.avoid_u_turns è stato impostato su true nella richiesta OptimizeToursRequest.

Sperimentale: per maggiori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

VisitType

Indica se la visita è un ritiro, una consegna o una visita a un Stop. Le visite a una fermata vengono utilizzate solo quando è attiva l'ottimizzazione multimodale.

Enum
VISIT_TYPE_UNSPECIFIED Tipo di visita non specificato.
PICKUP_SHIPMENT La visita corrisponde al ritiro di una spedizione.
DELIVER_SHIPMENT La visita corrisponde alla consegna di una spedizione.

ShipmentTypeIncompatibility

Specifica le incompatibilità tra le spedizioni in base al relativo shipment_type. La presenza di spedizioni incompatibili sullo stesso percorso è limitata 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 il modo in cui l'aspetto delle 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

In questa modalità, due spedizioni con tipi incompatibili non possono mai trovarsi sullo stesso veicolo contemporaneamente:

  • Possono condividere lo stesso veicolo solo se uno viene consegnato prima che l'altro venga ritirato.
  • Quando entrambe le spedizioni sono solo ritiri (nessuna consegna) o solo consegne (nessun ritiro), non possono condividere lo stesso veicolo.

ShipmentTypeRequirement

Specifica i requisiti tra le spedizioni in base al relativo shipment_type. Le specifiche del requisito sono definite dalla modalità del requisito.

Campi
required_shipment_type_alternatives[]

string

Elenco dei tipi di spedizione alternativi richiesti da dependent_shipment_types.

dependent_shipment_types[]

string

Tutte le spedizioni con un tipo nel campo dependent_shipment_types richiedono che almeno una spedizione di tipo required_shipment_type_alternatives venga visitata sullo stesso percorso.

NOTA: non sono consentite catene di requisiti in cui un shipment_type dipende 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à di 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 "richieste".
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.

Un ritiro della spedizione "dipendente" deve quindi avere:

  • Una spedizione "obbligatoria" di sola consegna consegnata lungo il percorso dopo, o
  • Una spedizione "obbligatoria" ritirata sul percorso prima di questa e, se la spedizione "obbligatoria" ha una consegna, questa deve essere eseguita dopo il ritiro della spedizione "dipendente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Come prima, con la differenza 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 i casi banali e/o se siamo in grado di identificare la causa del salto, riportiamo il motivo qui.

Campi
index

int32

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

label

string

Copia del Shipment.label corrispondente, se specificato nel Shipment.

reasons[]

Reason

Un elenco di motivi che spiegano perché la spedizione è stata saltata. Vedi il commento sopra Reason. Se non riusciamo a capire perché una spedizione è stata saltata, i motivi non verranno impostati.

penalty_cost

double

Questa è una copia di Shipment.penalty_cost, inclusa qui per semplificare la visualizzazione della gravità di una spedizione saltata.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

estimated_incompatible_vehicle_ratio

double

Rapporto stimato di veicoli che non possono eseguire questa spedizione per almeno uno dei motivi indicati di seguito. Nota: questo campo viene compilato solo quando i motivi riguardano un veicolo.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

Motivo

Se possiamo spiegare perché la spedizione è stata saltata, i motivi verranno elencati qui. Se il motivo non è uguale per tutti i veicoli, reason avrà più di un elemento. Una spedizione saltata non può avere motivi duplicati, ovvero in cui tutti i campi sono uguali 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à "Mele" di almeno un veicolo verrebbe superata (incluso il veicolo 1), la capacità "Pere" di almeno un veicolo verrebbe superata (incluso il veicolo 3) e il limite di distanza di almeno un veicolo verrebbe superato (incluso il veicolo 1).

Campi
code

Code

Fai riferimento ai commenti di Code.

example_vehicle_indices[]

int32

Come example_vehicle_index, ma forniamo l'elenco di più veicoli identificati. Questo elenco non è necessariamente esaustivo. Questo campo viene compilato solo se [fill_example_vehicle_indices_in_skipped_reasons][] è true.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

example_exceeded_capacity_type

string

Se il codice motivo è DEMAND_EXCEEDS_VEHICLE_CAPACITY, documenta un tipo di capacità 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 non ha importanza. In particolare, non indica se un determinato motivo verrà visualizzato prima di un altro nella soluzione, se entrambi sono applicabili.

Enum
CODE_UNSPECIFIED Non deve mai essere utilizzato.
NO_VEHICLE Nel modello non è presente alcun veicolo, il che rende tutte le spedizioni non fattibili.
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 alle località di ritiro e/o consegna della spedizione e alla località di arrivo del veicolo, supera il route_distance_limit del veicolo.

Tieni presente che per questo calcolo utilizziamo le distanze geodetiche.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

Il tempo minimo necessario per eseguire questa spedizione, inclusi il tempo di percorrenza, il tempo di attesa e il tempo di servizio, supera il valore route_duration_limit del veicolo.

Nota: il tempo di percorrenza viene 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 il travel_duration_limit del veicolo.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Il veicolo non può eseguire questa spedizione nello scenario migliore (consulta CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT per il calcolo del tempo) se inizia alla prima ora di inizio: il tempo totale farebbe terminare il veicolo dopo l'ultima ora di fine.
VEHICLE_NOT_ALLOWED Il campo allowed_vehicle_indices della spedizione non è vuoto e questo veicolo non appartiene alla spedizione.
VEHICLE_IGNORED

Il campo ignore del veicolo è impostato su true.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

SHIPMENT_IGNORED

Il campo ignore della spedizione è impostato su true.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT

La spedizione viene saltata nel injected_solution_constraint.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED

L'allentamento del percorso del veicolo specificato in injected_solution_constraint non consente l'inserimento di visite.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

ZERO_PENALTY_COST

La spedizione ha un costo di penalità pari a zero. Sebbene questa possa essere utile come scelta di modellazione avanzata, può anche spiegare a posteriori perché una spedizione è stata saltata.

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

TimeWindow

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

I limiti rigidi della finestra temporale, start_time e end_time, applicano l'ora più recente e più remota dell'evento, in modo che start_time <= event_time <= end_time. Il limite inferiore della finestra temporale flessibile, soft_start_time, esprime una preferenza per l'evento che si verifica in corrispondenza o dopo soft_start_time, sostenendo un costo proporzionale al tempo trascorso prima dell'ora di inizio flessibile. Il limite superiore della finestra temporale flessibile, soft_end_time, esprime una preferenza per l'evento che si verifica entro o prima di soft_end_time, sostenendo un costo proporzionale al tempo trascorso dopo soft_end_time. 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 devono rispettare:

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

Timestamp

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

end_time

Timestamp

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

soft_start_time

Timestamp

L'ora di inizio graduale della finestra temporale.

soft_end_time

Timestamp

L'ora di fine flessibile della finestra temporale.

cost_per_hour_before_soft_start_time

double

Un costo orario aggiunto ad altri costi nel modello se l'evento si verifica prima di soft_start_time, calcolato come:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_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_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 segue:

   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 su un percorso. A una stessa transizione possono essere applicati più TransitionAttributes: in questo caso, tutti i costi aggiuntivi vengono sommati e viene applicato il vincolo o il limite più restrittivo (seguendo la semantica naturale "AND").

Campi
src_tag

string

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

Una visita di origine o una partenza del veicolo corrisponde se e solo 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. Esattamente uno tra src_tag e excluded_src_tag non deve essere vuoto.

dst_tag

string

Una visita alla destinazione o una fine del veicolo corrisponde se e solo 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. Esattamente uno tra dst_tag e excluded_dst_tag non deve essere vuoto.

cost

double

Specifica un costo per l'esecuzione di questa transizione. Questa unità è la stessa di tutti gli altri costi del modello e non deve essere negativa. Viene applicata 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. Si somma a qualsiasi Vehicle.cost_per_kilometer specificato sui veicoli.

distance_limit

DistanceLimit

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

A partire da giugno 2021, sono supportati solo i limiti flessibili.

delay

Duration

Specifica un ritardo che si verifica durante l'esecuzione di questa transizione.

Questo ritardo si verifica sempre dopo il completamento della visita di origine e prima dell'inizio della visita di destinazione.

Uri

Un URI (Universal Resource Identifier) che punta a una risorsa che può essere letta e scritta dall'API Route Optimization.

Campi
uri

string

L'URI della risorsa. La risorsa potrebbe non esistere ancora.

I contenuti della risorsa sono codificati come JSON o textproto. Sono supportate solo le risorse Google Cloud Storage. Se la risorsa è codificata come JSON, il nome della risorsa deve avere il suffisso .json. Se la risorsa è codificata come textproto, il nome della risorsa deve avere il suffisso .txtpb. Ad esempio, un URI Google Cloud Storage di un file con codifica JSON potrebbe essere simile a: gs://bucket/path/input/object.json.

Veicolo

Modella un veicolo in un problema di spedizione. La risoluzione di un problema di spedizione creerà un percorso che inizia da start_location e termina in end_location per questo veicolo. 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.

route_modifiers

RouteModifiers

Un insieme di condizioni da soddisfare che influiscono sul modo in cui vengono calcolati i percorsi per il veicolo specificato.

start_location

LatLng

Posizione geografica in cui il veicolo inizia il percorso prima di ritirare le spedizioni. Se non specificato, il veicolo parte dal primo ritiro. Se il modello di spedizione ha matrici di durata e Distance Matrix, start_location non deve essere specificato.

start_waypoint

Waypoint

Waypoint che rappresenta una posizione geografica in cui il veicolo parte prima di ritirare le spedizioni. Se non viene specificato né start_waypoint né start_location, il veicolo parte dal primo ritiro. Se il modello di spedizione ha matrici di durata e Distance Matrix, start_waypoint non deve essere specificato.

end_location

LatLng

Posizione geografica in cui si trova il veicolo dopo aver completato l'ultimo VisitRequest. Se non specificato, il ShipmentRoute del veicolo termina immediatamente quando completa l'ultimo VisitRequest. Se il modello di spedizione ha matrici di durata e Distance Matrix, end_location non deve essere specificato.

end_waypoint

Waypoint

Waypoint che rappresenta una posizione geografica in cui il veicolo si ferma dopo aver completato l'ultima VisitRequest. Se non viene specificato né end_waypoint né end_location, il ShipmentRoute del veicolo termina immediatamente quando completa l'ultimo VisitRequest. Se il modello di spedizione contiene matrici di durata e Distance Matrix, end_waypoint non deve essere specificato.

start_tags[]

string

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

Non sono consentite stringhe vuote o duplicate.

end_tags[]

string

Specifica i tag associati 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 dalla località di partenza. Devono rientrare nei limiti di tempo globali (vedi i campi ShipmentModel.global_*). Se non specificato, non esiste alcuna limitazione oltre ai 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 esiste una singola finestra temporale.

end_time_windows[]

TimeWindow

Finestre temporali durante le quali il veicolo può arrivare alla località di arrivo. Devono rientrare nei limiti di tempo globali (vedi i campi ShipmentModel.global_*). Se non specificato, non esiste alcuna limitazione oltre ai 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 esiste una singola finestra temporale.

unloading_policy

UnloadingPolicy

Policy di scarico applicata al veicolo.

load_limits

map<string, LoadLimit>

Capacità del veicolo (ad esempio peso, volume, numero di pallet). Le chiavi nella mappa sono gli identificatori del tipo di carico, coerenti 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 dei veicoli: tutti i costi si sommano e devono essere espressi nella stessa unità di Shipment.penalty_cost.

Costo per ora del percorso del veicolo. Questo costo viene applicato al tempo totale impiegato dal 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 potrebbe comportare una latenza aggiuntiva.

cost_per_traveled_hour

double

Costo per ora di viaggio del percorso del veicolo. Questo costo viene applicato solo al tempo di percorrenza impiegato dal percorso (ovvero quello indicato in ShipmentRoute.transitions) ed esclude il tempo di attesa e il tempo di visita.

cost_per_kilometer

double

Costo per chilometro del percorso del veicolo. Questo costo viene applicato alla distanza indicata in ShipmentRoute.transitions e non si applica alla distanza percorsa implicitamente da arrival_location a departure_location di un singolo VisitRequest.

fixed_cost

double

Costo fisso applicato se questo veicolo viene utilizzato per gestire una spedizione.

used_if_route_is_empty

bool

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

Se true, il veicolo si sposta dalla località di partenza a quella di arrivo anche se non effettua spedizioni e vengono presi in considerazione i costi di tempo e distanza derivanti dal viaggio dalla località di partenza a quella di arrivo.

In caso contrario, non viaggia dalla località di partenza a quella di arrivo e non sono previsti break_rule o ritardi (da TransitionAttributes) per questo veicolo. In questo caso, l'entità ShipmentRoute del veicolo non contiene informazioni, 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 vehicle_end_time e vehicle_start_time.

travel_duration_limit

DurationLimit

Limite applicato alla durata del viaggio del percorso del veicolo. In un determinato OptimizeToursResponse, la durata del viaggio lungo il percorso è la somma di tutte le 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 è il tempo aggiuntivo rispetto a VisitRequest.duration da dedicare alle visite con il visit_types specificato. Questa durata aggiuntiva della visita comporta un costo se viene specificato cost_per_hour. Le chiavi (ad es. visit_types) non possono essere stringhe vuote.

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

break_rule

BreakRule

Descrive la pianificazione delle pause da applicare a questo veicolo. Se il campo è vuoto, non verranno programmate pause per questo veicolo.

label

string

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

ignore

bool

Se 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 nella risposta.

Se una spedizione viene eseguita da un veicolo ignorato in injected_solution_constraint e un ritiro/consegna correlato è vincolato a rimanere sul veicolo (ovvero non è stato ridotto al livello RELAX_ALL_AFTER_THRESHOLD), viene ignorato nella risposta. Se una spedizione ha un campo allowed_vehicle_indices non vuoto e tutti i veicoli consentiti vengono ignorati, la spedizione viene saltata 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, se imposti questo valore su 2,0, significa che il veicolo è più lento e ha tempi di percorrenza doppi rispetto ai veicoli standard. Questo multiplo non influisce sulla durata delle visite. Influisce sul costo se vengono specificati cost_per_hour o cost_per_traveled_hour. Deve essere compreso nell'intervallo [0,001, 1000,0]. Se non viene impostato, il veicolo è standard e questo multiplo viene considerato pari a 1, 0.

ATTENZIONE: i tempi di percorrenza verranno arrotondati al secondo più vicino dopo l'applicazione di questo multiplo, ma prima di eseguire qualsiasi operazione numerica. Pertanto, un multiplo piccolo potrebbe 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 rigido o morbido.

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

Campi
max_duration

Duration

Un limite rigido che limita la durata a un massimo di max_duration.

soft_max_duration

Duration

Un limite flessibile che non impone un limite di durata massima, ma che, se violato, comporta un costo per il percorso. Questo costo si aggiunge ad altri costi definiti nel modello, con la stessa unità.

Se definito, soft_max_duration deve essere non negativo. Se è definito anche max_duration, soft_max_duration deve essere inferiore a max_duration.

quadratic_soft_max_duration

Duration

Un limite flessibile che non impone un limite di durata massima, ma che, se violato, comporta un costo per il percorso, quadratico nella durata. Questo costo si aggiunge ad altri costi definiti nel modello, con la stessa unità.

Se quadratic_soft_max_duration è impostato, devono essere soddisfatte le seguenti condizioni:

  • Deve essere un valore non negativo.
  • max_duration deve essere definito.
  • quadratic_soft_max_duration deve essere inferiore a max_duration.
  • 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 orario sostenuto se la soglia soft_max_duration viene violata. Il costo aggiuntivo è pari a 0 se la durata è inferiore alla soglia, altrimenti il costo dipende dalla durata come segue:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Il costo deve essere non negativo.

cost_per_square_hour_after_quadratic_soft_max

double

Costo per ora al quadrato sostenuto se viene violata la soglia quadratic_soft_max_duration.

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

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Il costo deve essere non negativo.

LoadLimit

Definisce un limite di carico applicabile a un veicolo, ad esempio "questo camion può trasportare solo fino a 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, viene applicata la seguente penalità di costo (solo una volta per veicolo): (carico - soft_max_load) * cost_per_unit_above_soft_max. Tutti i costi si sommano e devono essere espressi nella stessa unità di Shipment.penalty_cost. I limiti flessibili possono essere definiti solo su tipi che si applicano solo ai ritiri o solo alle consegne in tutto il modello.

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 di carico accettabile.

cost_per_kilometer

LoadCost

Costo dello spostamento di un'unità di carico per un chilometro per questo veicolo. Questo valore può essere utilizzato come proxy per il consumo di carburante: se il carico è un peso (in Newton), il carico*chilometro ha la dimensione di un'energia.

Sperimentale: per ulteriori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

cost_per_traveled_hour

LoadCost

Costo del viaggio con un'unità di carico per un'ora per questo veicolo.

Sperimentale: per ulteriori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Intervallo

Intervallo di importi di ricarica accettabili.

Campi
min

int64

Un carico minimo accettabile. Deve essere ≥ 0. Se vengono specificati entrambi, min deve essere ≤ max.

max

int64

Un carico massimo accettabile. Deve essere ≥ 0. Se non specificato, il carico massimo non è limitato da questo messaggio. Se vengono specificati entrambi, min deve essere ≤ max.

LoadCost

Costo dello spostamento di un'unità di carico durante un periodo di Transition. Per un determinato carico, il costo è la somma di due parti:

  • min(load, load_threshold) * cost_per_unit_below_threshold
  • max(0, carico - load_threshold) * cost_per_unit_above_threshold

Con questo costo, le soluzioni preferiscono consegnare prima le domande elevate o, in modo equivalente, ritirare le domande elevate per ultime. Ad esempio, se un veicolo ha

load_limit {
  key: "weight"
  value {
    cost_per_kilometer {
      load_threshold: 15
      cost_per_unit_below_threshold: 2.0
      cost_per_unit_above_threshold: 10.0
    }
  }
}

e il suo percorso è inizio,ritiro,ritiro,consegna,consegna,fine con le transizioni:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

allora il costo sostenuto da questo LoadCost è (cost_below * load_below * chilometri + cost_above * load_above * km)

  • transizione 0: 0.0
  • transizione 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transizione 2: 2,0 * 15 * 1,0 + 10,0 * (20 - 15) * 1,0 = 80,0
  • transizione 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transizione 4: 0.0

Quindi il valore di LoadCost lungo il percorso è 120,0.

Tuttavia, se il percorso è inizio,ritiro,consegna,ritiro,consegna,fine con transizioni:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

allora il costo sostenuto da questo LoadCost è

  • transizione 0: 0.0
  • transizione 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transizione 2: 0.0
  • transizione 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transizione 4: 0.0

In questo caso, il valore di LoadCost sul percorso è 40,0.

LoadCost rende più costose le soluzioni con transizioni con carichi pesanti.

Sperimentale: per ulteriori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Campi
load_threshold

int64

Quantità di carico al di sopra della quale il costo di spostamento di un'unità di carico cambia da cost_per_unit_below_threshold a cost_per_unit_above_threshold. Deve essere >= 0.

cost_per_unit_below_threshold

double

Costo di spostamento di un'unità di carico, per ogni unità compresa tra 0 e la soglia. Deve essere un valore finito e >= 0.

cost_per_unit_above_threshold

double

Costo dello spostamento di un'unità di carico, per ogni unità superiore alla soglia. Nel caso speciale in cui la soglia è pari a 0, si tratta di un costo fisso per unità. Deve essere un valore finito e >= 0.

TravelMode

Modalità di viaggio che possono essere utilizzate dai veicoli.

Queste dovrebbero essere un sottoinsieme delle modalità di viaggio dell'API Routes di Google Maps Platform, consulta: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

Nota: i percorsi WALKING sono in versione beta e a volte potrebbero non includere marciapiedi o percorsi pedonali chiari. Devi mostrare questo avviso all'utente per tutti i percorsi a piedi che mostri nella tua app.

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

Policy su come un veicolo può essere scaricato. Si applica solo alle spedizioni che prevedono sia il ritiro che la consegna.

Le altre spedizioni possono essere effettuate in qualsiasi punto del percorso, indipendentemente da unloading_policy.

Enum
UNLOADING_POLICY_UNSPECIFIED Policy di scarico non specificata; le consegne devono avvenire 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

VehicleFullness

VehicleFullness è una metrica che calcola il livello di riempimento di un veicolo. Ogni campo VehicleFullness è compreso tra 0 e 1, calcolato come il rapporto tra un campo della metrica con limite (ad es. AggregatedMetrics.travel_distance_meters) e il relativo limite del veicolo (ad es. Vehicle.route_distance_limit), se esiste. In caso contrario, il rapporto di riempimento rimane non impostato. Se il limite è 0, il campo viene impostato su 1. Nota: quando un percorso è soggetto a problemi di traffico, alcuni rapporti di riempimento non elaborati potrebbero superare 1,0, ad esempio il veicolo potrebbe superare il limite di distanza. In questi casi, limitiamo i valori di pienezza a 1,0.

Campi
max_fullness

double

Numero massimo di tutti gli altri campi in questo messaggio.

distance

double

Il rapporto tra AggregatedMetrics.travel_distance_meters e Vehicle.route_distance_limit. Se Vehicle.route_distance_limit non è impostato, questo campo non verrà impostato.

travel_duration

double

Il rapporto tra [AggregatedMetrics.travel_duration_seconds][] e Vehicle.travel_duration_limit. Se Vehicle.travel_duration_limit non è impostato, questo campo non verrà impostato.

active_duration

double

Il rapporto tra [AggregatedMetrics.total_duration_seconds][] e Vehicle.route_duration_limit. Se Vehicle.route_duration_limit non è impostato, questo campo non verrà impostato.

max_load

double

Il rapporto massimo tra tutti i tipi di [AggregatedMetrics.max_load][] e i rispettivi Vehicle.load_limits. Se tutti i campi Vehicle.load_limits non sono impostati, questo campo non verrà impostato.

active_span

double

Il rapporto (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) per un determinato veicolo. Se il denominatore non è presente, utilizza (ShipmentModel.global_end_time - ShipmentModel.global_start_time).

Waypoint

Incapsula un waypoint. I waypoint indicano le località di arrivo e partenza delle richieste di visita, nonché le località di partenza e di arrivo dei veicoli.

Campi
side_of_road

bool

Facoltativo. Indica che la posizione di questo waypoint deve avere una preferenza per il veicolo che si ferma su un lato specifico della strada. Quando imposti questo valore, il percorso passerà attraverso la località in modo che il veicolo possa fermarsi sul lato della strada verso cui è orientata la località rispetto al centro della strada. Questa opzione non funziona per la modalità di viaggio "A PIEDI".

vehicle_stopover

bool

Indica che la tappa è destinata alla sosta dei veicoli, con l'intenzione di far salire o scendere i passeggeri. Questa opzione funziona solo per la modalità di viaggio "DRIVING" e quando "location_type" è "location".

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

Campo unione location_type. Diversi modi per rappresentare una località. location_type può essere solo uno dei seguenti tipi:
location

Location

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

place_id

string

L'ID luogo del PDI associato al waypoint.

Quando utilizzi un ID luogo per specificare la località di arrivo o di partenza di una VisitRequest, utilizza un ID luogo sufficientemente specifico da determinare una località LatLng per la navigazione verso il luogo. Ad esempio, un ID luogo che rappresenta un edificio è adatto, ma un ID luogo che rappresenta una strada è sconsigliato.