Le finestre temporali specificano la tempistica degli eventi su un percorso. Questi eventi possono includere l'inizio e la fine del percorso di un conducente, gli orari di ritiro e i tempi di consegna programmati o la durata di un intero percorso.
Le finestre temporali possono supportare obiettivi come:
- Dai la priorità al completamento dei ritiri e delle consegne entro i periodi di tempo specificati.
- Pianifica i percorsi in modo che rientrino nell'orario di apertura complessivo.
- Assicurati che i veicoli inizino e terminino i percorsi entro i periodi di tempo specificati.
Struttura
Come mostrato nel diagramma, le finestre temporali sono strutturate come segue:
globalStartTimeeglobalEndTimesono proprietà diShipmentModeltimeWindowssono proprietà di:pickupsall'interno diShipment.deliveriesall'interno diShipment.
startTimeWindowseendTimeWindowssono proprietà diVehicle.
Elenco di controllo di Essentials
Il seguente elenco di controllo descrive le conoscenze essenziali per evitare potenziali errori relativi alle finestre temporali. Questo elenco può aiutarti a convalidare la tua richiesta e a risolvere i problemi relativi alla risposta.
Proprietà
La tabella seguente descrive le proprietà della finestra temporale globale.
| Proprietà | Formato | Descrizione |
|---|---|---|
globalStartTime |
Timestamp |
L'ora più remota per un evento. |
globalEndTime |
Timestamp |
L'ora più recente per qualsiasi evento. |
La tabella seguente descrive le proprietà delle finestre temporali per spedizioni e veicoli.
| Genitore | Proprietà | Formato | Descrizione |
|---|---|---|---|
Shipment.pickups |
timeWindows |
Array di tipi di messaggi TimeWindow. |
Specifica gli intervalli di tempo per il ritiro di una spedizione. |
Shipment.deliveries |
timeWindows |
Specifica gli intervalli di tempo per la consegna di una spedizione. | |
Vehicle |
startTimeWindows |
Specifica l'ora di inizio del programma di funzionamento di un veicolo. | |
endTimeWindows |
Specifica l'ora di fine del programma di funzionamento di un veicolo. |
La tabella seguente descrive le proprietà di un tipo di messaggio TimeWindow.
| Proprietà | Formato | Descrizione |
|---|---|---|
startTime |
Stringa (formato "Zulu" UTC RFC3339) | L'inizio di un intervallo di tempo. |
endTime |
Stringa (formato "Zulu" UTC RFC3339) | La fine di un intervallo di tempo. |
Esempi
Questa sezione illustra tre tipi di esempi:
- Esempi di codice che illustrano la struttura delle finestre temporali.
- Uno scenario di esempio che mostra un modo per utilizzare le finestre temporali per raggiungere uno scopo commerciale.
- Un esempio di richiesta che include i valori impostati nello scenario di esempio.
Esempi di codice
Le sezioni seguenti mostrano esempi di codice di diversi tipi di finestre temporali.
Finestre temporali globali
Il seguente esempio di codice mostra la struttura delle finestre temporali globali:
{ "model": { "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ", "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ", "shipments": [ ... ], "vehicles": [ ... ] } }
Finestre temporali per ritiri e tempi di consegna
Il seguente esempio di codice mostra la struttura delle finestre temporali nei ritiri e nelle consegne di una spedizione:
{ "model": { "shipments": [ { "pickups": [ { "timeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ], "deliveries": [ { "timeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ] } ], "vehicles": [ ... ] } }
Finestre temporali dei veicoli
Il seguente esempio di codice mostra la struttura delle finestre temporali di un veicolo:
{ "model": { "shipments": [ ... ], "vehicles": [ { "startTimeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ], "endTimeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ] } }
Scenario di esempio
Questa sezione utilizza uno scenario aziendale di asilo per cani. L'esempio ottimizza i percorsi per il ritiro e la consegna di cani da due case diverse e i proprietari hanno le stesse finestre temporali di ritiro e consegna. L'ottimizzatore deve rispettare l'orario di apertura dell'asilo, le finestre specifiche di ritiro e consegna per i clienti e l'orario di lavoro del conducente.
Per questo esempio, i valori delle proprietà nella richiesta sono i seguenti:
| Genitore | Proprietà | Valore | Scenario |
|---|---|---|---|
ShipmentModel |
globalStartTime |
2023-01-13T07:00:00Z |
Rappresenta l'orario di apertura del tuo asilo per cani. Non è possibile effettuare ritiri o consegne prima di questo orario. |
ShipmentModel |
globalEndTime |
2023-01-13T19:00:00Z |
Rappresenta l'orario di chiusura del tuo asilo per cani. Tutti i ritiri e le consegne devono essere completati entro questo orario. |
Shipment.pickups |
timeWindows |
startTime:2023-01-13T07:30:00Z |
Definisce la finestra temporale accettabile per andare a prendere un cane a casa di un cliente. In questo esempio, hai chiesto a entrambi i clienti di essere disponibili per il ritiro tra le 07:30 e le 09:00. |
endTime:2023-01-13T09:00:00Z |
|||
Shipment.deliveries |
timeWindows |
startTime:2023-01-13T17:00:00Z |
Definisce la finestra temporale accettabile per la consegna di un cane a casa di un cliente. In questo esempio, hai comunicato a entrambi i clienti che i loro cani verranno consegnati tra le 17:00 e le 18:30. |
endTime:2023-01-13T18:30:00Z |
|||
Vehicle |
startTimeWindows |
startTime:2023-01-13T07:00:00ZendTime:2023-01-13T07:15:00Z |
Definisce la finestra accettabile per l'inizio (dalle 07:00 alle 07:15) e la fine (dalle 17:00 alle 17:15) del viaggio del veicolo. |
endTimeWindows |
startTime:2023-01-13T18:45:00ZendTime:2023-01-13T19:00:00Z |
Il seguente diagramma illustra le finestre temporali che interessano questo percorso.
In questo scenario, come illustrato dal diagramma, le finestre temporali funzionano come segue:
- La finestra temporale globale rappresenta l'orario di apertura dell'asilo per cani e tutte le altre finestre temporali devono rientrare in questa finestra temporale.
- I ritiri e le consegne hanno i propri
timeWindowsrispettivamente all'inizio e alla fine della giornata. - I
startTimeWindowsdel veicolo forniscono all'operatore del veicolo un periodo di tempo entro il quale deve iniziare a lavorare, mentre iendTimeWindowsforniscono un altro periodo di tempo entro il quale deve terminare la giornata. - L'ora di inizio del primo
startTimeWindowe l'ora di fine dell'ultimoendTimeWindowdefiniscono l'orario di apertura del veicolo, che in questo caso corrisponde alla finestra temporale globale.
Esempio di richiesta
L'esempio seguente mostra la struttura di una richiesta optimizeTours che incorpora i valori delle finestre temporali dello scenario di esempio.
{ "model": { "globalStartTime": "2023-01-13T07:00:00Z", "globalEndTime": "2023-01-13T19:00:00Z", "shipments": [ { "pickups": [ { "arrivalLocation": { "latitude": 37.8024, "longitude": -122.4058 }, "timeWindows": [ { "startTime": "2023-01-13T07:30:00Z", "endTime": "2023-01-13T09:00:00Z" } ] } ], "deliveries": [ { "arrivalLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "timeWindows": [ { "startTime": "2023-01-13T17:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ] }, { "pickups": [ { "arrivalLocation": { "latitude": 37.7359, "longitude": -122.5011 }, "timeWindows": [ { "startTime": "2023-01-13T07:30:00Z", "endTime": "2023-01-13T09:00:00Z" } ] } ], "deliveries": [ { "arrivalLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "timeWindows": [ { "startTime": "2023-01-13T17:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ] } ], "vehicles": [ { "startLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "endLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "costPerHour": 27, "startTimeWindows": [ { "startTime": "2023-01-13T07:00:00Z", "endTime": "2023-01-13T07:15:00Z" } ], "endTimeWindows": [ { "startTime": "2023-01-13T18:45:00Z", "endTime": "2023-01-13T19:00:00Z" } ] } ] } }
Finestre temporali flessibili
Le finestre temporali possono essere utilizzate come vincoli flessibili definendo softStartTime
e softEndTime in un tipo di messaggio TimeWindow. In questo modo, l'ottimizzatore può deviare dalla finestra temporale specificata a un costo specificato, dando la priorità all'ottimizzazione complessiva rispetto al rispetto rigoroso dei periodi di tempo, se vantaggioso.
Le finestre temporali flessibili presentano le seguenti limitazioni di utilizzo:
- Non possono essere applicati a
globalStartTimeeglobalEndTimeperché non utilizzano il tipo di messaggioTimeWindow. - Sono applicabili solo quando è presente un singolo
TimeWindowin un elenco.
Proprietà
La tabella seguente descrive le proprietà dei vincoli flessibili per le finestre temporali.
| Nome proprietà | Formato | Descrizione della proprietà |
|---|---|---|
softStartTime |
Timestamp | Specifica l'inizio della finestra temporale flessibile. Se un evento si verifica prima di questo orario, viene addebitato un costo. |
softEndTime |
Timestamp | Specifica la fine della finestra temporale flessibile. Se un evento si verifica dopo questo orario, viene addebitato un costo. |
costPerHourBeforeSoftStartTime |
numero | Il costo orario sostenuto quando un evento inizia prima del giorno softStartTime. Questa proprietà è obbligatoria quando utilizzi softStartTime. Per saperne di più su come implementare i costi, consulta il concetto chiave Modello di costo. |
costPerHourAfterSoftEndTime |
numero | Il costo orario sostenuto quando un evento termina dopo il giorno softEndTime. Questa proprietà è obbligatoria quando utilizzi softEndTime. Per saperne di più su come implementare i costi, consulta il concetto chiave Modello di costo. |
Esempio di codice
L'esempio seguente mostra la struttura delle proprietà dei vincoli flessibili di un tipo di messaggio TimeWindow:
{ "softStartTime": "SOFT_START_TIME", "softEndTime": "SOFT_END_TIME", "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME, "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME }