Questo documento mostra come effettuare la prima richiesta all'API Route Optimization utilizzando uno scenario di caso d'uso reale.
Per semplicità, l'esempio utilizza HTTP e JSON per dimostrare l'API REST. Tuttavia, per l'ambiente di produzione, la raccomandazione generale è di utilizzare gRPC per i vantaggi in termini di prestazioni. Tuttavia, gRPC richiede un'installazione. Per saperne di più, consulta Librerie client dell'API Route Optimization.
Scenario
Gestisci un servizio di asilo per cani dalle 07:00 alle 19:00 a San Francisco. Questa mattina devi prendere due cani da diverse località della città. Entrambi i proprietari dei cani ti hanno dato una finestra di ritiro tra le 07:30 e le 09:30.
Hai un furgone per il lavoro e paghi l'autista 27 dollari all'ora. L'autista e il furgone iniziano la giornata presso il tuo asilo alle 07:00 e devono tornare dai ritiri mattutini entro le 12:00 per una pausa pranzo.
Oggi è il 13 febbraio 2024 e l'autista ha le seguenti attività:
- Prendi il cane da montagna bernese vicino alla Coit Tower.
- Prendi il chihuahua al South Sunset Playground Park.
- Lascia entrambi i cani all'asilo per cani presso il Mission Dolores Park.
Hai bisogno di un percorso che riduca al minimo il tempo trascorso dai cani nel furgone, rispettando al contempo i requisiti di ritiro e riconsegna.
Prima di iniziare
Per eseguire il codice in questo scenario di esempio, devi prima completare le istruzioni riportate in Configurare l'API Route Optimization.
1. Scegli il tuo approccio di ottimizzazione del percorso
L'API Route Optimization offre diversi metodi tra cui scegliere a seconda della complessità del problema di ottimizzazione.
Poiché questo scenario di asilo per cani è una richiesta semplice e diretta, utilizza
un metodo di blocco, ad esempio optimizeTours, che fornisce rapidamente i risultati
per le richieste di piccole dimensioni. Per saperne di più sui metodi dell'API Route Optimization, consulta Endpoint sincroni e asincroni.
Utilizza il seguente URL per effettuare una richiesta POST HTTP al optimizeTours
metodo:
https://routeoptimization.googleapis.com/v1/projects/PROJECT_OR_ID:optimizeTours
Devi anche impostare le impostazioni di timeout e scadenza su un valore breve per ridurre i tempi di attesa non necessari. Per questo scenario di asilo per cani, l'ottimizzatore non ha bisogno di molto tempo per rispondere alla tua richiesta, quindi utilizza le seguenti impostazioni:
- Imposta il
timeoutparametro su 2 secondi. - Lascia le impostazioni di scadenza sul valore predefinito, ovvero 60 secondi per le richieste REST.
2. Costruisci il corpo del messaggio di richiesta
Dopo aver scelto il metodo di blocco optimizeTours e aver definito le impostazioni di timeout
e scadenza, il passo successivo è costruire il corpo del messaggio di richiesta.
Per questo scenario, la richiesta è un messaggio OptimizeToursRequest codificato come JSON nell'API REST.
Per costruire il messaggio di richiesta:
Inizia con la struttura di richiesta di base, che è la seguente:
{ "timeout": ..., "model": { "shipments": [...], "vehicles": [...], "globalStartTime": "...", "globalEndTime": "..." } }Per saperne di più sulla struttura, consulta la guida ai concetti chiave per la struttura di base (ShipmentModel, Shipment e Vehicle).
Definisci le spedizioni. Nel campo
shipments, aggiungi un messaggioShipmentper ogni cane che deve essere ritirato e riconsegnato al mattino. Qui puoi definire la località e gli orari di ritiro preferiti di ciascun proprietario del cane e la località e gli orari dell'asilo per cani per la riconsegna dei cani.Per ogni cane, crea una
VisitRequestper i ritiri e un'altra per le consegne, che, per questo scenario, viene definita riconsegna all'asilo.Nei ritiri, imposta
arrivalWaypointsulla località di ritiro del cane (Coit Tower per il cane da montagna bernese o South Sunset Playground Park per il chihuahua) etimeWindowssull'orario di ritiro richiesto dal proprietario (dalle 07:30 alle 09:30).Nelle consegne, imposta
arrivalWaypointsull' asilo per cani etimeWindowssull'orario di riconsegna richiesto (dalle 09:30 alle 11:30).
Per saperne di più sulle finestre temporali, consulta Finestre temporali.
Puoi utilizzare il campo
labelper aggiungere un identificatore per ogni spedizione, ad esempio "Cane da montagna bernese" e "Chihuahua". In questo modo puoi identificare le spedizioni nella risposta.
Per saperne di più sulla definizione delle spedizioni, consulta Spedizione.
Definisci i veicoli. Nel campo
vehicles, aggiungi unVehiclemessaggio per il tuo furgone con l'asilo per cani come punti di partenza e di arrivo, il costo dello stipendio dell'autista e gli orari di lavoro del furgone.Imposta
startWaypointeendWaypointper il furgone sulle località di inizio e fine della giornata, ovvero l'asilo per cani vicino al Mission Dolores Park.Per ridurre al minimo i costi operativi, devi definire i vincoli di costo della tua attività. Imposta il parametro di costo
costPerHoursu 27, ovvero l'importo che paghi all'autista per la guida del furgone dell'asilo per cani. Per saperne di più sui parametri di costo, consulta Modello di costi.Per assicurarti che l'ottimizzatore crei un percorso entro gli orari di lavoro del furgone, definisci
startTimeWindowsnell'intervallo accettabile per l'autista per iniziare a guidare il furgone eendTimeWindowsnell' intervallo accettabile per quando l'autista deve tornare all'asilo per cani. Per saperne di più sulle finestre temporali, consulta Finestre temporali.
Per saperne di più sulla definizione dei veicoli, consulta Veicolo.
Imposta una finestra temporale globale. La finestra temporale globale rappresenta l'intervallo di tempo in cui il furgone può effettuare ritiri e riconsegne per il tuo asilo per cani durante la giornata. Per questo scenario, imposta
globalStartTimealle 07:00 eglobalEndTimealle 19:00 del 13 febbraio 2024, che rappresentano gli orari di lavoro dell'asilo per cani.
3. Invia la richiesta
Di seguito è riportata una semplice richiesta curl basata sullo scenario dell'asilo per cani e che utilizza il metodo di blocco optimizeTours.
Prima di inviare la richiesta, sostituisci PROJECT_NUMBER_OR_ID nel codice di esempio con l' ID del progetto Google Cloud.
curl -X POST 'https://routeoptimization.googleapis.com/v1/projects/PROJECT_NUMBER_OR_ID:optimizeTours' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
--data @- << EOM
{
"timeout": "2s",
"model": {
"shipments": [
{
"pickups": [
{
"arrivalWaypoint": {
"location": {
"latLng": {
"latitude": 37.802395,
"longitude": -122.405822
}
}
},
"timeWindows": [
{
"startTime": "2024-02-13T07:30:00Z",
"endTime": "2024-02-13T09:30:00Z"
}
]
}
],
"deliveries": [
{
"arrivalWaypoint": {
"location": {
"latLng": {
"latitude": 37.760202,
"longitude": -122.426796
}
}
},
"timeWindows": [
{
"startTime": "2024-02-13T09:30:00Z",
"endTime": "2024-02-13T11:30:00Z"
}
]
}
],
"label": "Bernese mountain dog"
},
{
"pickups": [
{
"arrivalWaypoint": {
"location": {
"latLng": {
"latitude": 37.738067,
"longitude": -122.498593
}
}
},
"timeWindows": [
{
"startTime": "2024-02-13T07:30:00Z",
"endTime": "2024-02-13T09:30:00Z"
}
]
}
],
"deliveries": [
{
"arrivalWaypoint": {
"location": {
"latLng": {
"latitude": 37.760202,
"longitude": -122.426796
}
}
},
"timeWindows": [
{
"startTime": "2024-02-13T09:30:00Z",
"endTime": "2024-02-13T11:30:00Z"
}
]
}
],
"label": "Chihuahua"
}
],
"vehicles": [
{
"startWaypoint": {
"location": {
"latLng": {
"latitude": 37.760202,
"longitude": -122.426796
}
}
},
"endWaypoint": {
"location": {
"latLng": {
"latitude": 37.760202,
"longitude": -122.426796
}
}
},
"costPerHour": 27,
"startTimeWindows": [
{
"startTime": "2024-02-13T07:00:00Z",
"endTime": "2024-02-13T07:15:00Z"
}
],
"endTimeWindows": [
{
"startTime": "2024-02-13T11:45:00Z",
"endTime": "2024-02-13T12:00:00Z"
}
]
}
],
"globalStartTime": "2024-02-13T07:00:00Z",
"globalEndTime": "2024-02-13T19:00:00Z"
}
}
EOM
Parametri di richiesta utilizzati nella richiesta
La tabella seguente descrive i parametri di richiesta utilizzati nel corpo della richiesta dello scenario di esempio. Puoi filtrare i contenuti per genitore o per ricerca di testo.
| Parent | Parametro | Tipo di proprietà | Descrizione |
|---|---|---|---|
OptimizeToursRequest |
model |
oggetto (ShipmentModel) |
Questo è il nucleo della tua richiesta. Si tratta di un singolo oggetto in cui
definisci l'intero problema, inclusi tutti i cani che devi ritirare e
riconsegnare (shipments)
e il furgone del tuo parco risorse
(vehicles).
Consideralo come il progetto completo del problema che devi ottimizzare. |
timeout |
Durata | Questo parametro specifica il tempo massimo in cui il server elabora una richiesta prima di restituire una risposta. Utilizza questo parametro per ridurre i tempi di attesa. Per le richieste piccole e rapide, come in questo scenario di asilo per cani, imposta questo valore su 2 secondi. | |
ShipmentModel |
shipments[] |
array di oggetti (Shipment) |
Si tratta di un array di oggetti in cui ogni oggetto rappresenta un cane che deve essere ritirato o riconsegnato. |
vehicles[] |
array di oggetti (Vehicle) |
Si tratta di un array di oggetti in cui ogni oggetto definisce un veicolo della tua flotta. Qui puoi descrivere le tue risorse, ad esempio il furgone che esegue i ritiri e le riconsegne. Devi definire almeno un veicolo per ottenere un percorso ottimizzato. | |
globalStartTime |
Timestamp | Questa è la prima ora possibile in cui può verificarsi qualsiasi evento nell'intero modello. Questo parametro restringe il problema di ottimizzazione nel tempo, il che è fondamentale per calcoli accurati di traffico e routing calcoli. Per questo scenario di asilo per cani, imposta questo valore sull'ora più recente in cui l'autista può guidare il furgone per la giornata, ovvero le 07:00 del 13 febbraio 2024. | |
globalEndTime |
Timestamp | Questa è l'ultima ora possibile in cui può verificarsi qualsiasi evento nell'intero modello. Per questo scenario di asilo per cani, imposta questo valore sull'ora in cui il furgone dovrebbe terminare l'operazione, ovvero le 19:00 del 13 febbraio 2024. | |
Shipment |
pickups[] |
array di oggetti (VisitRequest) |
Questo è un elenco di tutte le opzioni di ritiro possibili per la spedizione. L'ottimizzatore sceglie la migliore per risolvere il problema. Per questo scenario di asilo per cani, elenca le località di ritiro e le finestre temporali fornite da ogni proprietario per ogni cane. |
deliveries[] |
array di oggetti (VisitRequest) |
Questo è un elenco di tutte le opzioni di riconsegna possibili per la spedizione. L'ottimizzatore sceglie la migliore per risolvere il problema. Per questo scenario di asilo per cani, elenca la località della struttura dell'asilo per cani e la finestra temporale in cui l'autista deve tornare per il pranzo per ogni cane. | |
label |
stringa | Questo è un identificatore per una spedizione specifica nella tua richiesta. Puoi specificare le etichette nella richiesta per semplificare la lettura della risposta. Per questo scenario di asilo per cani, utilizza una stringa descrittiva come "Chihuahua", "Cane da montagna bernese" o il nome del cane per abbinare la soluzione all'input quando ricevi la risposta dell'API. | |
VisitRequest |
arrivalWaypoint[] |
oggetto (Waypoint) |
Questa è la località di una visita specifica sul percorso. Puoi definirla utilizzando le coordinate di latitudine e longitudine, un ID luogo o un orientamento. In
questo scenario di asilo per cani, imposta questo valore sulla località fornita dal proprietario per
pickups
e sull'indirizzo dell'asilo per cani per
deliveries. |
timeWindows[] |
array di oggetti (TimeWindow) |
Si tratta di un array di oggetti che definiscono i vincoli temporali per un ritiro o riconsegna. Per questo scenario, utilizza questo valore per definire la finestra di ritiro per ciascun cane e la finestra accettabile per la riconsegna dei cani all' asilo per cani. | |
Vehicle |
startWaypoint[] |
oggetto (Waypoint) |
Questa è la località di partenza del percorso del veicolo, definita con le coordinate di latitudine e longitudine o un ID luogo. Questo parametro indica all'ottimizzatore dove deve iniziare il percorso del veicolo. Se non definisci questo waypoint, l'ottimizzatore sceglie uno dei ritiri o delle riconsegne come località di partenza. Per questo scenario di asilo per cani, poiché l'autista inizia la giornata presso la struttura dell'asilo, utilizza le coordinate del Mission Dolores Park. |
endWaypoint[] |
oggetto (Waypoint) |
Questa è la destinazione finale del percorso del veicolo, definita con le coordinate di latitudine e longitudine o un ID luogo. Questo parametro indica all'ottimizzatore dove deve terminare il percorso del veicolo. Se non definisci questo waypoint, l'ottimizzatore sceglie uno dei ritiri o delle riconsegne come la fine del percorso. Per questo scenario di asilo per cani, poiché l'autista deve terminare la giornata presso la struttura dell'asilo, utilizza le coordinate del Mission Dolores Park. | |
costPerHour |
numero | Questo è il costo sostenuto per ogni ora di utilizzo di un veicolo, indipendentemente dal fatto che sia in viaggio o fermo. Per questo scenario di asilo per cani, utilizza questo valore per modellare la retribuzione oraria di un autista. | |
startTimeWindows[] |
array di oggetti (TimeWindow) |
Questa è la finestra accettabile per l'autista per iniziare a guidare il furgone per i ritiri dei cani mattutini. | |
endTimeWindows[] |
array di oggetti (TimeWindow) |
Questa è la finestra accettabile per l'autista per terminare la guida del furgone e parcheggiare di nuovo presso l'asilo per cani. |