Method: projects.locations.optimizeTours

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

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

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

Richiesta HTTP

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*/locations/*}:optimizeTours

L'URL utilizza la sintassi di transcodifica gRPC.

Parametri del percorso

Parametri
parent

string

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

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

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

Corpo della richiesta

Il corpo della richiesta contiene dati con la seguente struttura:

Rappresentazione JSON
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
Campi
timeout

string (Duration format)

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

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

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

model

object (ShipmentModel)

Modello di spedizione da risolvere.

solvingMode

enum (SolvingMode)

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

searchMode

enum (SearchMode)

Modalità di ricerca utilizzata per risolvere la richiesta.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

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

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

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

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

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

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

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

refreshDetailsRoutes[]

object (ShipmentRoute)

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

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

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

Questo campo non deve essere utilizzato insieme a injectedFirstSolutionRoutes o injectedSolutionConstraint.

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

interpretInjectedSolutionsUsingLabels

boolean

Se vero:

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

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

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

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

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

considerRoadTraffic

boolean

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

populatePolylines

boolean

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

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

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

label

string

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

geodesicMetersPerSecond

number

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

maxValidationErrors

integer

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

Corpo della risposta

In caso di esito positivo, il corpo della risposta contiene un'istanza di OptimizeToursResponse.

Ambiti di autorizzazione

Richiede il seguente ambito OAuth:

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