Package google.maps.routeoptimization.v1

Indice

RouteOptimization

Un servizio per l'ottimizzazione dei tour dei veicoli.

Validità di determinati tipi di campi:

  • google.protobuf.Timestamp
    • Gli orari sono 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 non deve essere impostato o deve essere 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 non deve essere impostato o deve essere 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 tra latitudine e longitudine deve essere diverso da zero.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

Questo metodo è un'operazione a lunga esecuzione (LRO). Gli input per l'ottimizzazione (messaggi OptimizeToursRequest) e gli output (messaggi OptimizeToursResponse) vengono letti e scritti in Cloud Storage nel formato specificato dall'utente. Come il metodo OptimizeTours, ogni OptimizeToursRequest contiene un ShipmentModel e restituisce un OptimizeToursResponse contenente campi ShipmentRoute, ovvero un insieme di percorsi da eseguire dai veicoli 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 è falso, 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 sulla risorsa parent:

  • routeoptimization.operations.create

Per ulteriori informazioni, 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 da eseguire dai veicoli per ridurre al minimo il costo complessivo.

Un modello ShipmentModel è costituito principalmente da Shipment da eseguire e da Vehicle che possono essere utilizzati per trasportare i Shipment. I ShipmentRoute assegnano i Shipment ai Vehicle. 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 minimizza 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 sulla risorsa parent:

  • routeoptimization.locations.use

Per ulteriori informazioni, consulta la documentazione di IAM.

AggregatedMetrics

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

Durata totale del viaggio per un itinerario o una soluzione.

wait_duration

Duration

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

delay_duration

Duration

Durata totale del ritardo per un itinerario o una soluzione.

break_duration

Duration

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

visit_duration

Duration

Durata totale della visita per un itinerario 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 percorsa per un itinerario o una soluzione.

max_loads

map<string, VehicleLoad>

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

BatchOptimizeToursMetadata

Questo tipo non contiene campi.

Metadati dell'operazione per le chiamate BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Richiedi di ottimizzare in batch i 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 di 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/{location-id}

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

model_configs[]

AsyncModelConfig

Obbligatorio. Informazioni di input/output di ciascun modello di acquisto, ad esempio percorsi file e formati di 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 contiene campi.

Risposta a un BatchOptimizeToursRequest. Viene restituito nell'operazione a lunga esecuzione al termine dell'operazione.

BreakRule

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

  • durante il tragitto tra due visite (che include il tempo immediatamente prima o dopo una visita, ma non nel mezzo di una visita), in cui caso viene esteso il tempo di transito corrispondente tra le visite,
  • o prima dell'avvio del veicolo (il veicolo potrebbe non avviarsi nel mezzo di una pausa), nel qual caso non influisce sull'ora di inizio del veicolo.
  • o dopo la fine del servizio (idem, con l'ora di fine del servizio).
Campi
break_requests[]

BreakRequest

Sequenza di interruzioni. Visualizza il messaggio BreakRequest.

frequency_constraints[]

FrequencyConstraint

Potrebbero essere applicati diversi FrequencyConstraint. Devono essere soddisfatte tutte le BreakRequest di questo BreakRule. Consulta FrequencyConstraint.

BreakRequest

La sequenza delle interruzioni (ovvero il numero e l'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 relative finestre temporali (earliest_start_time / latest_start_time) possono sovrapporsi, ma devono essere compatibili con l'ordine (questo viene controllato).

Campi
earliest_start_time

Timestamp

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

latest_start_time

Timestamp

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

min_duration

Duration

Obbligatorio. Durata minima dell'interruzione. Il valore deve essere positivo.

FrequencyConstraint

È possibile limitare ulteriormente la frequenza e la durata delle interruzioni specificate sopra, imponendo una frequenza minima delle interruzioni, ad esempio "Deve essere presente un'interruzione di almeno 1 ora ogni 12 ore". Supponendo che questo possa essere interpretato come "In qualsiasi finestra temporale scorrevole di 12 ore, deve esserci almeno una pausa di almeno un'ora", questo 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 interruzioni nella soluzione rispetteranno tutti questi vincoli, oltre alle finestre di tempo e alle durate minime già specificate in BreakRequest.

In pratica, un FrequencyConstraint può essere applicato a interruzioni 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. Leggi la descrizione di FrequencyConstraint.

max_inter_break_duration

Duration

Obbligatorio. Periodo massimo consentito di qualsiasi intervallo di tempo nel percorso che non include almeno parzialmente un'interruzione di duration >= min_break_duration. Il valore deve essere positivo.

DataFormat

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

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

DistanceLimit

Un limite che definisce la distanza massima che può essere percorsa. Può essere dura o morbida.

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

Campi
max_meters

int64

Un limite massimo che impone che la distanza non superi max_meters. Il limite deve essere non negativo.

soft_max_meters

int64

Un limite flessibile che non applica un limite di distanza massima, ma che, se violato, genera un costo che si somma agli altri costi definiti nel modello, con la stessa unità di misura.

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

cost_per_kilometer_below_soft_max

double

Costo per chilometro sostenuto, che aumenta 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 addebitato 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 posizione di Google Cloud Storage in cui verranno scritti i file di output.

Campi
uri

string

Obbligatorio. URI Google Cloud Storage.

GcsSource

La posizione 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 iniettata nella richiesta, incluse informazioni sulle visite che devono essere limitate e su come devono essere limitate.

Campi
routes[]

ShipmentRoute

Percorsi della soluzione da iniettare. 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

Caricamenti della soluzione da inserire ignorati. Alcuni potrebbero essere omessi dalla soluzione originale. Consulta il campo routes.

constraint_relaxations[]

ConstraintRelaxation

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

ConstraintRelaxation

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

Campi
relaxations[]

Relaxation

Tutti gli allentamento 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 la limitazione di visita relaxations. Se è vuoto, viene considerato predefinito e relaxations si applica a tutti i veicoli non specificati in altri constraint_relaxations. Può essere presente al massimo un valore predefinito, ovvero è consentito un solo campo di rilassamento dei vincoli vuoto vehicle_indices. Un indice del veicolo può essere elencato una sola volta, anche all'interno di più constraint_relaxations.

Un indice del veicolo viene mappato come 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 relaxations sono completamente vincolate e non è possibile inserire o aggiungere nuove visite a questi percorsi.routes 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 delle restrizioni applicato a una visita #j che soddisfa:

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

Analogamente, l'avvio del veicolo viene allentato a relaxations(i).level se soddisfa i seguenti requisiti:

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

Per applicare un livello di rilassamento se una visita soddisfa il threshold_visit_count OPPURE il 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ù flessibile. Di conseguenza, dal punto di partenza del veicolo fino alle visite del percorso fino al punto di arrivo del veicolo, il livello di rilassamento diventa più rilassato: in altre parole, 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 qualsiasi relaxations sono completamente vincolate e non è possibile inserire visite in queste sequenze. Inoltre, se l'inizio o la fine di un veicolo non soddisfa le condizioni di alcun allentamento, l'ora è fissa, a meno che il veicolo non sia vuoto.

Campi
level

Level

Il livello di rilassamento delle limitazioni che si applica quando le condizioni a partire da threshold_time E almeno threshold_visit_count sono soddisfatte.

threshold_time

Timestamp

L'ora a partire dalla quale è possibile applicare il rilassamento level.

threshold_visit_count

int32

Il numero di visite a partire dal quale è possibile applicare il rilassamento level. Se threshold_visit_count è 0 (o non impostato), level può essere applicato direttamente all'avvio del veicolo.

Se è route.visits_size() + 1, il level può essere applicato solo al veicolo. Se è superiore a route.visits_size() + 1, level non viene applicato per quel percorso.

Livello

Esprime i diversi livelli di rilassamento dei vincoli, che vengono applicati per una visita e quelli che seguono quando soddisfa le condizioni di soglia.

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

Enum
LEVEL_UNSPECIFIED

Livello di rilassamento predefinito implicito: non vengono applicati rilassamenti, 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 e fine delle visite e dei veicoli saranno meno rigidi, ma ogni visita rimane associata allo stesso veicolo e la sequenza delle visite deve essere rispettata: non è possibile inserire visite tra una visita e l'altra o prima di una visita.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Come per RELAX_VISIT_TIMES_AFTER_THRESHOLD, ma la sequenza delle visite è meno rigida: le visite possono essere eseguite solo da questo veicolo, ma possono potenzialmente non essere eseguite.
RELAX_ALL_AFTER_THRESHOLD Come per RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, ma il veicolo è anche rilassato: le visite sono completamente senza costi all'ora di soglia o dopo 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:
gcs_source

GcsSource

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

Località

Incapsula una posizione (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 il reso. I valori di rotta possono variare da 0 a 360, dove 0 indica una rotta a nord, 90 indica una rotta a est e così via.

OptimizeToursRequest

Richiesta da inviare a un risolutore di ottimizzazione del tour che definisce il modello di spedizione da risolvere, nonché 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/{location-id}

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

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 del caso.

Per le richieste asincrone, il server genererà una soluzione (se possibile) prima 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 a trovare una prima soluzione simile a una precedente.

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

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

  • Per tutti i percorsi, 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.
  • È possibile fare riferimento a una spedizione in un solo percorso.
  • il ritiro di una spedizione con ritiro e consegna deve essere eseguito prima della consegna.
  • non può essere eseguita più di un'alternativa di ritiro o consegna di una spedizione.
  • per tutti i percorsi, i tempi sono in aumento (ad es. vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • 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 iniettata non è fattibile, non viene necessariamente restituito un errore di convalida, ma potrebbe essere restituito un errore che indica l'impossibilità di applicazione.

injected_solution_constraint

InjectedSolutionConstraint

Limita l'algoritmo di ottimizzazione per trovare una soluzione finale simile a una precedente. Ad esempio, può essere utilizzato per bloccare parti di percorsi già completati o da completare, ma che non devono essere modificati.

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

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 problema del modello.

A partire da novembre 2020, vengono compilati solo i polilinei dei percorsi non vuoti e populate_polylines deve essere impostato su true.

I campi route_polyline dei percorsi passati 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. I polilinee vengono comunque compilati 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 dalla richiesta o aggiunti.

Se true, le etichette nelle seguenti categorie devono apparire al massimo una volta nella rispettiva categoria:

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

La rimozione di visite ai percorsi o di interi percorsi da una soluzione iniettata può influire sui vincoli impliciti, il che può comportare la modifica della soluzione, errori di convalida o l'impossibilità di applicazione.

NOTA: l'utente che chiama 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 prodotto il OptimizeToursResponse utilizzato nella soluzione iniettata e la richiesta corrente che include la soluzione iniettata. I controlli di unicità descritti sopra non sono sufficienti per garantire questo requisito.

consider_road_traffic

bool

Tieni conto della stima del traffico per calcolare i campi ShipmentRoute Transition.travel_duration, Visit.start_time e vehicle_end_time, per impostare il campo ShipmentRoute.has_traffic_infeasibilities e per calcolare il campo OptimizeToursResponse.total_cost.

populate_polylines

bool

Se true, i polilinee verranno compilati nelle ShipmentRoute di risposta.

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

Se questo valore è 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 a lungo termine presentano un rischio di interruzione notevolmente 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 viaggio verranno calcolati utilizzando le distanze geodetiche con una velocità definita da geodesic_meters_per_second.

label

string

L'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 associati al payload dell'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 è 10.000.

SearchMode

Modalità che definisce il comportamento della ricerca, con un compromesso tra latenza e 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 Interrompi la ricerca dopo aver trovato la prima soluzione valida.
CONSUME_ALL_AVAILABLE_TIME Dedica tutto il tempo a tua disposizione alla ricerca di soluzioni migliori.

SolvingMode

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

Enum
DEFAULT_SOLVE Risolvi il modello. Gli avvisi possono essere emessi in [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Convalida 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 il resto della richiesta (status e routes non sono impostati nella risposta). Se vengono rilevate infeasibilità nei percorsi injected_solution_constraint, queste vengono inserite nel campo OptimizeToursResponse.validation_errors e OptimizeToursResponse.skipped_shipments viene lasciato vuoto.

IMPORTANTE: non vengono restituite qui tutte le spedizioni non realizzabili, ma solo quelle rilevate come non realizzabili durante la preelaborazione.

OptimizeToursResponse

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

Campi
routes[]

ShipmentRoute

Percorsi calcolati per ogni veicolo; il percorso i-esimo corrisponde al veicolo i-esimo nel modello.

request_label

string

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

skipped_shipments[]

SkippedShipment

L'elenco di tutte le spedizioni ignorate.

validation_errors[]

OptimizeToursValidationError

Elenco di tutti gli errori di convalida che siamo riusciti a rilevare in modo indipendente. Consulta la spiegazione "ERRORI MULTIPLI" per il messaggio OptimizeToursValidationError. Invece di errori, verranno inclusi avvisi nel caso in cui solving_mode sia DEFAULT_SOLVE.

metrics

Metrics

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

Metriche

Metriche complessive, aggregate per tutti i route.

Campi
aggregated_route_metrics

AggregatedMetrics

Aggregato per i percorsi. Ogni metrica è la somma (o il valore massimo, per i caricamenti) di tutti i campi ShipmentRoute.metrics dello stesso nome.

skipped_mandatory_shipment_count

int32

Numero di importazioni obbligatorie ignorate.

used_vehicle_count

int32

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

earliest_vehicle_start_time

Timestamp

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

latest_vehicle_end_time

Timestamp

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

costs

map<string, double>

Costo della soluzione, suddiviso in base ai campi delle richieste 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 del costo corrispondente, aggregato nell'intera soluzione. In altre parole, costs["model.shipments.pickups.cost"] è la somma di tutti i costi di ritiro della soluzione. Tutti i costi definiti nel modello sono riportati in dettaglio qui, ad eccezione dei costi relativi a TransitionAttributes, che vengono registrati 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.

OptimizeToursValidationError

Descrive un errore o un avviso rilevato 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, la procedura di convalida tenta di generarne diversi. Come per un compilatore, si tratta di un processo imperfetto. Alcuni errori di convalida sono "fatali", il che significa che interrompono l'intera procedura di convalida. È il caso, ad esempio, degli errori display_name="UNSPECIFIED". Alcuni errori possono causare il salto di altri errori durante la procedura di convalida.

STABILITÀ: code e display_name devono essere molto stabili. Tuttavia, nel tempo potrebbero apparire nuovi codici e nomi visualizzati, il che potrebbe causare la generazione di una coppia (code, display_name) diversa per una determinata richiesta (non valida) perché il nuovo errore ha nascosto quello precedente. Ad esempio, consulta "ERRORI MULTIPLI".

display_name

string

Il nome visualizzato dell'errore.

fields[]

FieldReference

Un contesto di errore può coinvolgere 0, 1 (la maggior parte delle volte) o più campi. Ad esempio, il riferimento al primo ritiro del veicolo 4 e della spedizione 2 può essere effettuato 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 (se il codice != "UNSPECIFIED").

STABILITÀ: non stabile: il messaggio di errore associato a un determinato code potrebbe cambiare (si spera per chiarirlo) nel tempo. Utilizza invece 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 devi 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, potremmo specificare l'elemento 2 di start_time_windows del veicolo 5 utilizzando:

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

Tuttavia, ometteremo le entità di primo livello come OptimizeToursRequest o ShipmentModel per evitare di appesantire il messaggio.

Campi
name

string

Nome del campo, ad esempio "vehicles".

sub_field

FieldReference

Se necessario, sottocampo nidificato in modo ricorsivo.

Campo unione index_or_key.

index_or_key può essere solo uno dei seguenti:

index

int32

Indice del campo se ripetuto.

key

string

Chiave se il campo è una mappa.

OutputConfig

Specifica una destinazione per i risultati di [BatchOptimizeTours][google.maps.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:
gcs_destination

GcsDestination

La posizione 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. È 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, ove ragionevole. Verrà data la preferenza ai percorsi che non includono strade a pedaggio. Si applica solo alle modalità di viaggio motorizzate.

avoid_highways

bool

Specifica se evitare le autostrade, ove 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, ove ragionevole. Verrà data la preferenza ai percorsi che non includono viaggi in traghetto. Si applica solo alle modalità di viaggio motorizzate.

avoid_indoor

bool

Facoltativo. Specifica se evitare di navigare all'interno, ove ragionevole. Verrà data la preferenza ai percorsi che non contengono la navigazione al chiuso. Si applica solo alla modalità di viaggio WALKING.

Spedizione

La spedizione di un singolo articolo, da un ritiro a una consegna. Affinché la spedizione sia considerata eseguita, un veicolo unico deve visitare una delle sue stazioni di ritiro (e diminuire di conseguenza le relative capacità di riserva), quindi visitare in un secondo momento una delle sue stazioni di consegna (e quindi aumentare di conseguenza le relative capacità di riserva).

Campi
display_name

string

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

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

Serie di alternative di consegna associate alla spedizione. Se non specificato, il veicolo deve visitare solo una stazione di ricarica corrispondente ai punti di ritiro.

load_demands

map<string, Load>

Le richieste di carico della spedizione (ad esempio peso, volume, numero di pallet e così via). Le chiavi nella mappa devono essere identificatori che descrivono il tipo di carico corrispondente, idealmente incluse anche le unità di misura. Ad esempio: "weight_kg", "volume_gallons", "pallet_count" e così via. Se una determinata chiave non compare nella mappa, il carico corrispondente viene considerato nullo.

allowed_vehicle_indices[]

int32

L'insieme di veicoli che possono effettuare questa spedizione. Se è vuoto, tutti i veicoli possono eseguirlo. I veicoli sono indicati dal relativo indice nell'elenco vehicles di ShipmentModel.

costs_per_vehicle[]

double

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

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

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

costs_per_vehicle_indices[]

int32

Indici dei veicoli a cui si applica costs_per_vehicle. Se non è vuoto, deve 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 relativo 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 non negativo e la spedizione deve contenere almeno un ritiro e una consegna.

Ad esempio, supponiamo che t sia il tempo più breve necessario per passare dall'opzione di ritiro selezionata direttamente all'opzione di consegna selezionata. L'impostazione pickup_to_delivery_absolute_detour_limit impone:

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

Se nella stessa spedizione vengono specificati sia i limiti relativi che quelli assoluti, viene utilizzato il limite più restrittivo per ogni possibile coppia di ritiro/consegna. A partire da ottobre 2017, i percorsi alternativi sono supportati 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. Ciò non dipende dalle alternative selezionate per il ritiro e la consegna né dalla velocità del veicolo. Questo 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).

È diverso da visit_types, che viene specificato per una singola visita: tutti i ritiri/le consegne appartenenti alla stessa spedizione condividono lo stesso shipment_type.

label

string

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

ignore

bool

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

Se ignori una spedizione, si verifica un errore di convalida se 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 alle spedizioni ignorate verranno ignorati.

penalty_cost

double

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

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

pickup_to_delivery_relative_detour_limit

double

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

Ad esempio, supponiamo che t sia il tempo più breve necessario per passare dall'opzione di ritiro selezionata direttamente all'opzione di consegna selezionata. L'impostazione pickup_to_delivery_relative_detour_limit impone:

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

Se nella stessa spedizione vengono specificati sia i limiti relativi che quelli assoluti, viene utilizzato il limite più restrittivo per ogni possibile coppia di ritiro/consegna. A partire da ottobre 2017, i percorsi alternativi sono supportati solo quando le durate dei viaggi non dipendono dai veicoli.

Carica

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

Campi
amount

int64

L'entità del carico del veicolo che esegue la visita corrispondente varierà. 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 effettuata da un veicolo: ha una geolocalizzazione (o due, vedi di seguito), orari di apertura e chiusura rappresentati da finestre temporali e una durata del servizio (tempo impiegato dal veicolo una volta arrivato per ritirare o consegnare le merci).

Campi
arrival_location

LatLng

La posizione geografica in cui arriva il veicolo quando esegui questa VisitRequest. Se il modello di spedizione contiene matrici di distanza e 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 contiene matrici di distanza e durata, arrival_waypoint non deve essere specificato.

departure_location

LatLng

La geolocalizzazione da cui parte il veicolo al termine di questo VisitRequest. Può essere omesso se è uguale a arrival_location. Se il modello di spedizione contiene matrici di distanza e durata, departure_location non deve essere specificato.

departure_waypoint

Waypoint

Il waypoint da cui il veicolo parte dopo aver completato questa VisitRequest. Può essere omesso se è uguale a arrival_waypoint. Se il modello di spedizione contiene matrici di distanza e 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 in una visita. Tieni presente che un veicolo può partire al di fuori dell'intervallo di tempo di arrivo, ovvero l'ora di arrivo + la durata non devono rientrare in un intervallo di tempo. Ciò può comportare tempi di attesa se il veicolo arriva prima delle TimeWindow.start_time.

L'assenza di TimeWindow indica che il veicolo può effettuare 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 al possibile tempo di attesa; vedi time_windows).

cost

double

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

load_demands

map<string, Load>

Carica le richieste di questa visita. È come il campo Shipment.load_demands, tranne per il fatto che si applica solo a questo VisitRequest anziché all'intero Shipment. Le richieste elencate qui vengono aggiunte a quelle elencate in Shipment.load_demands.

visit_types[]

string

Specifica i tipi di visita. Questo può essere utilizzato per allocare il tempo aggiuntivo necessario a un veicolo per completare questa 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 in ShipmentRoute.Visit corrispondente.

ShipmentModel

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

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

Shipment

Set di importazioni da eseguire nel modello.

vehicles[]

Vehicle

Set di veicoli che possono essere utilizzati per effettuare visite.

global_start_time

Timestamp

Ora di inizio e di fine globale del modello: nessuna ora al di fuori di questo intervallo può essere considerata valida.

L'intervallo di tempo del modello deve essere inferiore a un anno, ovvero global_end_time e global_start_time devono trovarsi a una distanza massima di 31536000 secondi l'uno dall'altro.

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

global_end_time

Timestamp

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

global_duration_cost_per_hour

double

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

duration_distance_matrices[]

DurationDistanceMatrix

Specifica le matrici di durata e distanza utilizzate nel modello. Se questo campo è vuoto, verranno utilizzate le distanze di Google Maps o geodesiche, a seconda del valore del campo use_geodesic_distances. Se non è vuoto, use_geodesic_distances non può essere vero e né duration_distance_matrix_src_tagsduration_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 la 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 "lenta".
  • 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 la locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

Tag che definiscono le origini delle matrici di durata e distanza; duration_distance_matrices(i).rows(j) definisce le durate e le distanze dalle visite con tag duration_distance_matrix_src_tags(j) alle 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, di destinazione e della matrice di un Vehicle possono essere gli stessi; analogamente, i tag di origine e di destinazione di un VisitRequest possono essere gli stessi. Tutti i tag devono essere diversi e non possono essere stringhe vuote. Se questo campo non è vuoto, duration_distance_matrices non deve essere vuoto.

duration_distance_matrix_dst_tags[]

string

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

I tag corrispondono a VisitRequest.tags o Vehicle.start_tags. Un determinato VisitRequest o Vehicle deve corrispondere esattamente a un tag in questo campo. Tieni presente che i tag di origine, di destinazione e della matrice di un Vehicle possono essere gli stessi; analogamente, i tag di origine e di destinazione di un VisitRequest possono essere gli stessi. 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 tipi di spedizione incompatibili (vedi ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Insiemi di requisiti shipment_type (vedi ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

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

max_active_vehicles

int32

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

DurationDistanceMatrix

Specifica una matrice di durata e distanza dalle posizioni di partenza e di arrivo del veicolo e delle visite.

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 a quali veicoli si applica questa matrice di durata e distanza. Se è vuoto, si applica a tutti i veicoli e può essere presente una sola matrice.

Ogni inizio del viaggio del veicolo deve corrispondere esattamente a una matrice, ovvero esattamente uno dei suoi campi start_tags deve corrispondere al vehicle_start_tag di una matrice (e solo a 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 nel modello non sono presenti costi o vincoli che fanno riferimento alle distanze, questo campo può essere lasciato vuoto; in caso contrario, deve contenere lo stesso numero di elementi di durations.

PrecedenceRule

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

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

Inoltre, le precedenze si applicano solo quando vengono eseguite entrambe le importazioni e vengono ignorate in caso contrario.

Campi
first_is_delivery

bool

Indica se l'evento "primo" è una pubblicazione.

second_is_delivery

bool

Indica se l'evento "secondo" è una pubblicazione.

offset_duration

Duration

Lo sfasamento tra l'evento "first" e l'evento "second". Può essere negativo.

first_index

int32

Indice di spedizione dell'evento "primo". Questo campo deve essere specificato.

second_index

int32

Indice di spedizione dell'evento "secondo". Questo campo deve essere specificato.

ShipmentRoute

Il percorso di un veicolo può essere decomposto, lungo l'asse del tempo, come segue (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 servizio e l'inizio e la fine di ogni visita (ovvero arrivo e partenza). Avvengono in un determinato secondo.
  • "intervalli di tempo", come le visite stesse e la transizione tra le visite. Sebbene a volte gli intervalli di tempo possano avere una durata pari a zero, ovvero iniziare e terminare nello stesso secondo, spesso hanno una durata positiva.

Invariati:

  • Se ci sono n visite, ci sono n+1 transizioni.
  • Una visita è sempre preceduta da una transizione (stessa riga) e seguita da un'altra transizione (riga + 1).
  • L'avvio del veicolo è sempre seguito dalla transizione 0.
  • La fine del veicolo è sempre preceduta dalla transizione n.

Se aumenti lo zoom, 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 TRAVEL, BREAKS, DELAY e WAIT possono essere disposti durante una transizione.

  • Non si sovrappongono.
  • DELAY è univoco e deve essere un periodo di tempo contiguo immediatamente prima della visita successiva (o della fine del servizio del veicolo). Pertanto, è sufficiente conoscere la durata del ritardo per conoscere la relativa ora di inizio e di fine.
  • Le interruzioni 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 clienti 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 relativo indice nell'origine ShipmentModel.

vehicle_label

string

Etichetta del veicolo che esegue questo percorso, uguale a ShipmentModel.vehicles(vehicle_index).label, se specificato.

vehicle_start_time

Timestamp

Ora in cui il veicolo inizia il percorso.

vehicle_end_time

Timestamp

Ora in cui il veicolo termina il percorso.

visits[]

Visit

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

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 incongruenze nei tempi di percorrenza del percorso vengono previste utilizzando le stime della durata del viaggio in base al traffico. Il tempo potrebbe non essere sufficiente per completare i viaggi, i ritardi e le interruzioni tra le visite, prima della prima visita o dopo l'ultima visita, tenendo conto del traffico, pur rispettando le finestre di tempo per le visite e i veicoli. Ad esempio,

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

L'arrivo a next_visit avverrà probabilmente più tardi rispetto all'attuale finestra temporale a causa dell'aumento della stima del tempo di percorrenza travel_duration(previous_visit, next_visit) a causa del traffico. Inoltre, una pausa potrebbe sovrapporsi a una visita a causa di un aumento delle stime dei tempi di percorrenza e delle limitazioni relative alle finestre di tempo per le visite o le pause.

route_polyline

EncodedPolyline

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

breaks[]

Break

Soste programmate per il veicolo che esegue questo percorso. La sequenza breaks rappresenta intervalli di tempo, ognuno dei quali inizia al start_time corrispondente e dura duration secondi.

metrics

AggregatedMetrics

Metriche relative a 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.

route_costs

map<string, double>

Costo del percorso, suddiviso per campi di richiesta relativi al costo. 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 del costo corrispondente, aggregato nell'intero percorso. In altre parole, costs["model.shipments.pickups.cost"] è la somma di tutti i costi di ritiro lungo il percorso. Tutti i costi definiti nel modello sono riportati in dettaglio qui, ad eccezione dei costi relativi a TransitionAttributes, che vengono riportati solo in modo aggregato a partire 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. Puoi trovare ulteriori informazioni sulla codifica dei polilinee qui: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Campi
points

string

Stringa che rappresenta i punti codificati del polilinea.

Transizione

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

Se il veicolo non ha start_location e/o end_location, le metriche relative ai viaggi 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. Potrebbe trattarsi di un problema 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 (fine della visita o del veicolo). Leggi i TransitionAttributes.delay.

break_duration

Duration

Somma della durata delle interruzioni, se presenti, che si verificano durante questa transizione. I dettagli sull'ora di inizio e sulla durata di ogni pausa vengono memorizzati in ShipmentRoute.breaks.

wait_duration

Duration

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

total_duration

Duration

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

  • prossima visita start_time (o vehicle_end_time se si tratta dell'ultima transizione) - start_time di questa transizione;
  • if ShipmentRoute.has_traffic_infeasibilities is false, the following additionally holds: `total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

Ora di inizio di questa transizione.

route_polyline

EncodedPolyline

La rappresentazione 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 Navigation per ricostruire il percorso durante la navigazione e, in caso di deviazione, rispettare l'intenzione originale al momento della creazione del percorso. Tratta questo token come un blob opaco. Non confrontare il valore tra le richieste, in quanto potrebbe cambiare anche se il servizio restituisce lo stesso percorso esatto. 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 compare in Vehicle.load_limits di questo veicolo o che ha 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. Dopo ogni visita, i valori load_demands vengono aggiunti o sottratti per ottenere i carichi della transizione successiva, a seconda che la visita sia stata un ritiro o una consegna.

VehicleLoad

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

Campi
amount

int64

La quantità di carico sul veicolo, per il tipo specificato. La unità di carico è in genere indicata dal tipo. Leggi i Transition.vehicle_loads.

Visita

Una visita effettuata durante un percorso. Questa visita corrisponde al ritiro o alla 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 un caricamento.

visit_request_index

int32

Indice di VisitRequest nel campo Ritiro o Consegna del Shipment (vedi is_pickup).

start_time

Timestamp

Ora di inizio della visita. Tieni presente che il veicolo potrebbe arrivare prima di questa data e ora presso la sede della visita. Gli orari sono in linea con le ShipmentModel.

load_demands

map<string, Load>

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

detour

Duration

Tempo aggiuntivo per i giri a vuoto dovuti alle spedizioni visitate sul percorso prima della visita e al potenziale tempo di attesa indotto dalle finestre temporali. Se la visita è una consegna, il percorso alternativo viene calcolato dalla visita di ritiro corrispondente ed è uguale a:

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

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

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

string

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

visit_label

string

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

ShipmentTypeIncompatibility

Specifica le incompatibilità tra le spedizioni a seconda del relativo shipment_type. La visualizzazione di spedizioni incompatibili sullo stesso percorso è limitata in base alla modalità di incompatibilità.

Campi
types[]

string

Elenco di tipi incompatibili. Due spedizioni con shipment_types diversi tra quelli elencati sono "incompatibili".

incompatibility_mode

IncompatibilityMode

Modalità applicata all'incompatibilità.

IncompatibilityMode

Modalità che definiscono in che modo l'aspetto 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

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

  • Se entrambi sono solo per il ritiro (nessuna consegna) o solo per la consegna (nessun ritiro), non possono condividere lo stesso veicolo.
  • Se una delle spedizioni prevede la consegna e l'altra il ritiro, le due spedizioni possono condividere lo stesso veicolo se la prima viene consegnata prima che la seconda venga ritirata.

ShipmentTypeRequirement

Specifica i requisiti tra le spedizioni in base al relativo tipo di spedizione (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 dal dependent_shipment_types.

dependent_shipment_types[]

string

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

NOTA: non sono consentite catene di requisiti in cui un shipment_type dipende da sé 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 "obbligatorie".
IN_SAME_VEHICLE_AT_PICKUP_TIME

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

Un ritiro della spedizione "dipendente" deve quindi avere:

  • Una spedizione "obbligatoria" solo per la consegna consegnata sul percorso dopo,
  • Una spedizione "obbligatoria" ritirata sul percorso precedente e, se la spedizione "obbligatoria" prevede una consegna, questa deve essere eseguita dopo il ritiro della spedizione "dipendente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Come prima, tranne che le spedizioni "dipendenti" devono avere una spedizione "obbligatoria" sul veicolo al momento della consegna.

SkippedShipment

Specifica i dettagli delle importazioni non eseguite in una soluzione. Per i casi banali e/o se siamo in grado di identificare la causa dell'interruzione, 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 ignorata. Vedi il commento sopra Reason. Se non riusciamo a capire il motivo per cui una spedizione è stata saltata, i motivi non verranno impostati.

Motivo

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

Campi
code

Code

Fai riferimento ai commenti del codice.

example_exceeded_capacity_type

string

Se il codice del motivo è DEMAND_EXCEEDS_VEHICLE_CAPACITY, indica 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 significato. In particolare, non fornisce alcuna indicazione se un determinato motivo verrà visualizzato prima di un altro nella soluzione, se entrambi si applicano.

Enum
CODE_UNSPECIFIED Questo valore non deve mai essere utilizzato.
NO_VEHICLE Non è presente alcun veicolo nel modello, il che rende non possibili tutte le spedizioni.
DEMAND_EXCEEDS_VEHICLE_CAPACITY La richiesta della spedizione supera la capacità di un veicolo per alcuni tipi di capacità, tra cui example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

La distanza minima necessaria per effettuare questa spedizione, ovvero dalla start_location del veicolo alle località di ritiro e/o consegna della spedizione e alla località di destinazione del veicolo, supera la 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 effettuare questa spedizione, inclusi i tempi di percorrenza, di attesa e di servizio, supera il 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/h).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Come sopra, ma viene confrontato solo il tempo di percorrenza minimo e il travel_duration_limit del veicolo.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Il veicolo non può effettuare questa spedizione nello scenario migliore (vedi CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT per il calcolo del tempo) se parte all'ora di inizio più anticipata: il tempo totale farebbe terminare il viaggio del veicolo dopo la sua ora di fine più tardiva.
VEHICLE_NOT_ALLOWED Il campo allowed_vehicle_indices della spedizione non è vuoto e questo veicolo non vi appartiene.

TimeWindow

Le finestre temporali limitano l'ora 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 della finestra temporale rigidi, start_time e end_time, impongono l'ora iniziale e finale 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 verifichi a partire dal giorno soft_start_time o in una data successiva, con un costo proporzionale al tempo che intercorre prima dell'evento soft_start_time. Il limite superiore della finestra temporale flessibile, soft_end_time, esprime una preferenza per la data e l'ora in cui si verifica l'evento, ovvero prima del giorno soft_end_time, comportando un costo proporzionale al tempo che intercorre dopo questa data.soft_end_time start_time, end_time, soft_start_time e soft_end_time devono rispettare i 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 dell'intervallo di tempo obbligatorio. Se non specificato, verrà impostato su ShipmentModel.global_start_time.

end_time

Timestamp

L'ora di fine dell'intervallo di tempo obbligatorio. 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 dell'intervallo di tempo.

cost_per_hour_before_soft_start_time

double

Un costo per ora aggiunto agli altri costi nel modello se l'evento si verifica prima di soft_start_time, calcolato come segue:

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

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 per ora aggiunto agli altri costi del modello se l'evento si verifica dopo 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. Più TransitionAttributes possono essere applicati alla stessa transizione: in questo caso, tutti i costi aggiuntivi si sommano e si applica la limitazione o il vincolo più rigoroso (secondo 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 o un inizio del viaggio dell'origine corrisponde se e solo se 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 di src_tag e excluded_src_tag deve essere diverso da vuoto.

dst_tag

string

Una visita alla destinazione o una fine del viaggio corrisponde se e solo se 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 di dst_tag e excluded_dst_tag deve essere diverso da vuoto.

cost

double

Specifica un costo per l'esecuzione di questa transizione. Si tratta della stessa unità di misura di tutti gli altri costi del modello e non deve essere negativo. Viene applicato 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 alla distanza percorsa durante l'esecuzione di questa transizione.

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

delay

Duration

Specifica un ritardo 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.

Veicolo

Modella un veicolo con un problema di spedizione. La risoluzione di un problema di spedizione comporterà la creazione di un percorso che parte da start_location e termina a 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 in questione.

start_location

LatLng

Posizione geografica in cui il veicolo parte prima di ritirare le spedizioni. Se non specificato, il veicolo si avvia al primo ritiro. Se il modello di spedizione ha matrici di durata e distanza, 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_waypointstart_location, il veicolo si avvia al primo ritiro. Se il modello di spedizione ha matrici di durata e distanza, start_waypoint non deve essere specificato.

end_location

LatLng

Posizione geografica in cui termina il viaggio del veicolo dopo aver completato l'ultima VisitRequest. Se non specificato, il ShipmentRoute del veicolo termina immediatamente al termine dell'ultimo VisitRequest. Se il modello di spedizione ha matrici di durata e distanza, end_location non deve essere specificato.

end_waypoint

Waypoint

Waypoint che rappresenta una posizione geografica in cui il veicolo termina dopo aver completato l'ultima VisitRequest. Se non vengono specificati né end_waypointend_location, il ShipmentRoute del veicolo termina immediatamente al termine dell'ultimo VisitRequest. Se il modello di spedizione ha matrici di durata e distanza, end_waypoint non deve essere specificato.

start_tags[]

string

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

Non sono consentite stringhe vuote o duplicate.

end_tags[]

string

Specifica i tag collegati alla fine del percorso del veicolo.

Non sono consentite stringhe vuote o duplicate.

start_time_windows[]

TimeWindow

Fasce orarie durante le quali il veicolo può partire dalla stazione di partenza. Devono rispettare i limiti di tempo globali (vedi campi ShipmentModel.global_*). Se non specificato, non ci sono limitazioni oltre a questi limiti di tempo globali.

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

cost_per_hour_after_soft_end_time e soft_end_time possono essere impostati solo se esiste una singola finestra temporale.

end_time_windows[]

TimeWindow

Fasce orarie durante le quali il veicolo potrebbe arrivare alla sua destinazione finale. Devono rispettare i limiti di tempo globali (vedi campi ShipmentModel.global_*). Se non specificato, non ci sono limitazioni oltre a questi limiti di tempo globali.

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

cost_per_hour_after_soft_end_time e soft_end_time possono essere impostati solo se esiste una singola finestra temporale.

unloading_policy

UnloadingPolicy

Criterio di scarico applicato al veicolo.

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

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

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

cost_per_traveled_hour

double

Costo per ora di percorrenza del percorso del veicolo. Questo costo viene applicato solo al tempo di percorrenza del 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 si applica alla distanza indicata nel ShipmentRoute.transitions e non si applica a nessuna distanza percorsa implicitamente dal arrival_location al 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 serve spedizioni. Indica se in questo caso il veicolo deve essere considerato usato o meno.

Se true, il veicolo si sposta dalla posizione di partenza a quella di destinazione anche se non effettua consegne e vengono presi in considerazione i costi di tempo e distanza derivanti dal viaggio da inizio a fine.

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

route_duration_limit

DurationLimit

Limite applicato alla durata totale del percorso del veicolo. In un determinato OptimizeToursResponse, la durata del percorso di un veicolo è la differenza tra 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 dell'itinerario è la somma di tutti i suoi transitions.travel_duration.

route_distance_limit

DistanceLimit

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

extra_visit_duration_for_visit_type

map<string, Duration>

Specifica una mappa dalle stringhe visit_types alle durate. La durata è il tempo aggiuntivo di VisitRequest.duration da prendere in considerazione per le visite con il visit_types specificato. Questa durata della visita aggiuntiva 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, nella mappa verrà aggiunta una durata per ogni tipo.

break_rule

BreakRule

Descrive la programmazione delle interruzioni da applicare a questo veicolo. Se è vuoto, non verranno pianificate interruzioni 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 il valore è true, used_if_route_is_empty deve essere false e questo veicolo rimarrà inutilizzato.

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

Se una spedizione viene eseguita da un veicolo ignorato in injected_solution_constraint e qualsiasi ritiro/consegna correlato è vincolato a rimanere sul veicolo (ovvero non è rilassato al livello RELAX_ALL_AFTER_THRESHOLD), viene saltato nella risposta. Se una spedizione ha un campo allowed_vehicle_indices non vuoto e tutti i veicoli consentiti vengono ignorati, 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, il veicolo è più lento e i tempi di percorrenza sono il doppio di quelli dei veicoli standard. Questo moltiplicatore non influisce sulle durate 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 moltiplicatore è considerato pari a 1, 0.

AVVERTENZA: i tempi di percorrenza verranno arrotondati al secondo più vicino dopo l'applicazione di questo moltiplicatore, ma prima di eseguire qualsiasi operazione numerica. Pertanto, un piccolo moltiplicatore potrebbe comportare una perdita di precisione.

Vedi anche extra_visit_duration_for_visit_type di seguito.

DurationLimit

Un limite che definisce una durata massima del percorso di un veicolo. Può essere dura o morbida.

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

Campi
max_duration

Duration

Un limite massimo che impone che la durata non superi max_duration.

soft_max_duration

Duration

Un limite flessibile che non applica un limite di durata massima, ma che, se violato, fa sì che il percorso comporti un costo. Questo costo si somma agli altri costi definiti nel modello, con la stessa unità di misura.

Se definito, soft_max_duration non deve essere un valore 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 applica un limite di durata massima, ma che, se violato, fa sì che il percorso comporti un costo quadratico in base alla durata. Questo costo si somma agli altri costi definiti nel modello, con la stessa unità di misura.

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

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Costo orario sostenuto se viene violata la soglia 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_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 quadrata 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 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 del veicolo, si applica la seguente penalità di costo (una sola volta per veicolo): (carico - soft_max_load) * cost_per_unit_above_soft_max. Tutti i costi si sommano e devono essere nella stessa unità di Shipment.penalty_cost.

start_load_interval

Interval

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

end_load_interval

Interval

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

max_load

int64

La quantità massima di carico accettabile.

Intervallo

Intervallo di importi di carico accettabili.

Campi
min

int64

Un carico minimo accettabile. Deve essere ≥ 0. Se sono 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 sono specificati entrambi, min deve essere ≤ max.

TravelMode

Modalità di viaggio che possono essere utilizzate dai veicoli.

Devono essere un sottoinsieme dei modi di viaggio dell'API Routes Preferred della piattaforma Google Maps, consulta: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

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

UnloadingPolicy

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

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

Enum
UNLOADING_POLICY_UNSPECIFIED Norme di scarico non specificate: le consegne devono avvenire solo dopo i relativi ritiri.
LAST_IN_FIRST_OUT Le consegne devono avvenire nell'ordine inverso dei ritiri
FIRST_IN_FIRST_OUT Le consegne devono avvenire nello stesso ordine dei ritiri

Waypoint

Incapsula un waypoint. I waypoint contrassegnano le posizioni di arrivo e partenza delle richieste di visita e le posizioni di partenza e di arrivo dei veicoli.

Campi
side_of_road

bool

Facoltativo. Indica che la posizione di questo waypoint è destinata a avere una preferenza per la fermata del veicolo su un determinato lato 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 è inclinata la località rispetto al centro della strada. Questa opzione non funziona per la modalità di viaggio "A PIEDI".

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

Location

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

place_id

string

L'ID luogo PDI associato al waypoint.