Questa guida mostra i possibili utilizzi degli attributi di transizione. Ti insegnerà a modellare scenari reali su due esempi: incorporare il tempo di parcheggio del veicolo nei percorsi ottimizzati e garantire che ogni percorso termini con una visita a una località specifica.
Prima di iniziare
Utilizza gli attributi di transizione per aggiungere costi e ritardi specifici del modello a determinate transizioni nei percorsi ottimizzati. Questi costi e ritardi vengono aggiunti alle durate e ai costi della transizione calcolati dai dati della mappa in base ai parametri del veicolo utilizzato.
Una transizione è il segmento del percorso che collega una località alla successiva.
Una località si riferisce a uno dei seguenti punti nel percorso di un veicolo:
- Il punto di partenza del percorso.
- Una fermata in cui viene effettuato un ritiro o una consegna.
- Il punto di arrivo del percorso.
Puoi definire tutti gli attributi di transizione per il modello aggiungendoli all'elenco ShipmentModel.transition_attributes.
Ogni elemento dell'elenco definisce un insieme di attributi di transizione e viene abbinato alle transizioni nei percorsi utilizzando i tag nella località di partenza e nella località di arrivo della transizione. Per scoprire di più sugli attributi di transizione, consulta la documentazione di riferimento per TransitionAttributes.
Modella scenari reali
Questa sezione mostra due piccoli esempi di come implementare vincoli aziendali reali utilizzando gli attributi di transizione.
Prenota il parcheggio
In questo scenario, il conducente deve parcheggiare il veicolo prima di poter visitare la località A. La località B si trova nelle vicinanze e il conducente può utilizzare la stessa posizione del parcheggio per entrambe le visite. Se il conducente visita B subito dopo A, risparmia tempo perché non deve lasciare la posizione del parcheggio e parcheggiare di nuovo il veicolo. Nell'API Route Optimization, puoi utilizzare gli attributi di transizione per aggiungere tempo extra per parcheggiare il veicolo solo quando il conducente si sposta da una posizione del parcheggio all'altra.
Quando modelli il tempo di parcheggio separatamente dalle durate delle visite, i percorsi in cui le visite che utilizzano lo stesso parcheggio sono raggruppate richiedono meno tempo. In questo modo, il modello diventa più preciso e l'ottimizzatore preferisce gli itinerari in cui le visite sono raggruppate.
Per farlo in una richiesta API Route Optimization, segui questi passaggi:
Utilizza
VisitRequest.durationsolo per il tempo necessario per eseguire la visita. Ad esempio, per consegnare il pacco e raccogliere la firma del cliente.Per ogni posizione del parcheggio distinta utilizzata nel modello, utilizza un nuovo tag che non sia utilizzato per nient'altro nel modello, ad esempio
PARKING_123.Aggiungi questo tag ai seguenti elementi:
VisitRequest.tagsin tutte le richieste di visita che utilizzano questa posizione del parcheggio.Vehicle.start_tagsse il veicolo inizia il suo percorso in questa posizione del parcheggio.Vehicle.end_tagsse il veicolo inizia o termina il suo percorso in questa posizione del parcheggio.
Per ogni nuovo tag di parcheggio, aggiungi una voce a
ShipmentModel.transition_attributesche aggiunge un ritardo per il parcheggio quando provieni da un'altra posizione del parcheggio, procedendo nel seguente modo:Imposta
TransitionAttributes.excluded_src_tageTransitionAttributes.dst_tagsuPARKING_123.Imposta
TransitionAttributes.delaysul tempo necessario per parcheggiare il veicolo.
Ad esempio, se il tag di una località è
PARKING_123e sono necessari 150 secondi per parcheggiare il veicolo, aggiungi la seguente voce aShipmentModel.transition_attributes:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
Pulizia obbligatoria al termine del percorso
In questo scenario, il veicolo deve essere pulito alla fine del percorso, con i seguenti vincoli aggiuntivi:
- La pulizia viene eseguita presso una struttura di pulizia specializzata prima di tornare al deposito dei veicoli. Il percorso ottimizzato utilizza la struttura di pulizia migliore in base alla sua posizione e alle posizioni dei ritiri e delle consegne effettuati dal veicolo.
- Dopo la pulizia, il veicolo non deve effettuare ulteriori ritiri o consegne.
- Il tempo necessario per raggiungere il luogo e pulire il veicolo viene conteggiato nelle ore di lavoro del conducente e deve rientrare nella durata massima del percorso.
Puoi modellare questo requisito consentendo solo percorsi vuoti o la cui ultima visita è presso un impianto di pulizia. Nell'API Route Optimization, questa operazione viene eseguita vietando le transizioni al waypoint finale del percorso da qualsiasi località, ad eccezione della struttura di pulizia o del punto di partenza del percorso:
- Scegli due nuovi tag che non vengono utilizzati in nessun punto del modello, ad esempio
CLEANEDeROUTE_END. Il primo è per le località in cui il veicolo è o diventa pulito, mentre il secondo è per la fine del percorso. - Per ogni veicolo, aggiungi una nuova spedizione di sola consegna che rappresenta la visita
a un impianto di pulizia con i seguenti attributi:
- Ogni sede dell'impianto di pulizia deve essere rappresentata come una richiesta di visita di consegna di questa spedizione.
- Aggiungi
CLEANEDaVisitRequest.tagsdi ogni richiesta di visita della spedizione della struttura di pulizia. Indica che un veicolo che lascia questa posizione è pulito. Le altre richieste di visita nel modello non devono utilizzare questo tag, in modo che il veicolo venga considerato "non pulito" quando le lascia. - Consenti all'ottimizzatore di saltare questa spedizione quando il veicolo non viene utilizzato impostando il relativo
penalty_costsu un numero ridotto.
Per ogni veicolo, aggiungi
CLEANEDaVehicle.start_tags. Questo viene utilizzato per contrassegnare il veicolo come pulito prima che esegua ritiri o consegne, supponendo che sia stato pulito alla fine del giorno lavorativo precedente, e consentirgli di passare direttamente dal waypoint di partenza al waypoint di arrivo. Anche se questi percorsi non si verificano in pratica, consentire questo scenario aiuta l'ottimizzatore a cercare i percorsi ottimizzati in modo più efficiente.Per ogni veicolo, aggiungi
ROUTE_ENDaVehicle.end_tags.Aggiungi una nuova voce a
ShipmentModel.transition_attributesche impedisce ai veicoli di arrivare al waypoint finale quando non sono puliti, con le seguenti proprietà:Imposta
TransitionAttributes.excluded_src_tagsuCLEANED.Imposta
TransitionAttributes.dst_tagsuROUTE_END.Imposta
TransitionAttributes.delaysu un valore elevato. Se imposti un ritardo superiore alla durata massima del percorso, impedisci all'ottimizzatore di utilizzare questa transizione in un percorso.
Ad esempio, quando la scala temporale del modello è un giorno lavorativo, puoi utilizzare un ritardo di 24 ore (86.400 secondi) per vietare la transizione alla fine del percorso da qualsiasi luogo, ad eccezione di un impianto di pulizia e dell'inizio del percorso:
{ "excluded_src_tag": "CLEANED", "dst_tag": "ROUTE_END", "delay": "86400s" }
Come scegliere tra ritardi e costi
La scelta tra ritardi e costi dipende dalla natura della logica di business e dei vincoli implementati. L'impostazione TransitionAttributes.delay è ideale per implementare vincoli rigidi o per esprimere un compromesso in termini di tempo impiegato.
TransitionAttributes.cost
è più adatto per l'implementazione di preferenze flessibili o compromessi espressi come costo aggiuntivo. Puoi combinare ritardi e costi in modo arbitrario quando sono coinvolti sia il tempo impiegato sia il costo.
L'esempio di pulizia del veicolo utilizza un ritardo molto lungo, perché la pulizia del veicolo alla fine del percorso è un requisito obbligatorio e il ritardo lungo impedisce all'ottimizzatore di ignorare il requisito. Se imposti solo un costo, l'ottimizzatore potrebbe scegliere di saltare la pulizia se trova un modo per compensare il costo altrove, ad esempio consegnando più spedizioni nel tempo "risparmiato" non pulendo il veicolo.
L'esempio del parcheggio utilizza un breve ritardo che corrisponde al tempo aggiuntivo necessario per parcheggiare il veicolo. Puoi anche utilizzare i costi in combinazione con i ritardi, se il conducente si ferma in un parcheggio a pagamento.
Come aggiungere un attributo di transizione che corrisponda a tutte le richieste di visita
Gli esempi precedenti utilizzano attributi di transizione che corrispondono a località con un determinato tag o a località senza il tag. Ma cosa succede se devi aggiungere attributi di transizione che si applicano a tutte le transizioni?
Non puoi semplicemente omettere i tag, perché ogni messaggio TransitionAttributes deve avere uno dei tag TransitionAttributes.src_tag e TransitionAttributes.excluded_src_tag e uno dei tag TransitionAttributes.dst_tag e TransitionAttributes.excluded_dst_tag.
Tuttavia, puoi trovare corrispondenze per tutti i tag impostando
TransitionAttributes.excluded_src_tag
o
TransitionAttributes.excluded_dst_tag
su un tag che non viene utilizzato in nessun punto del modello. In questo modo, verranno trovate tutte le località che non hanno questo tag, ma poiché hai scelto intenzionalmente un tag non utilizzato da nessuna località, questi attributi di transizione corrisponderanno a tutte le località.