Sapienza Università di Roma - Dipartimento di Ingegneria Informatica, Automatica e Gestionale Problemi di Instradamento di Veicoli Renato Bruni bruni@dis.uniroma1.it Il materiale presentato è derivato da quello dei proff. A. Sassano e C. Mannino
Tornando al Problema di Distribuzione PROBLEMA GENERALE: Trasportare beni da una o più origini a una o più destinazioni Minimizzando dei costi di trasporto Rispettando una serie di vincoli: - vincoli di capacità dei veicoli - vincoli di raggiungibilità delle destinazioni Abbiamo deciso dove posizionare le origini (genericamente i depositi) risolvendo la localizzazione di impianti Ora dobbiamo decidere il resto
Dati del Problema Dopo aver risolto la localizzazione, per ogni area si conosce: 1. Origine (o deposito) v 1 2. Destinazioni (o clienti) che v 1 deve servire {v 2, v 3,,v n } 3. Grafo orientato G(V,E) deposito-clienti Nodi V={v 1,,v n } Archi a b se b è accessibile da a v 2 v 1 v 4 v 5 v 3 4. Costo dell arco da v a a v b : c ab è il valore dell aspetto che si vuole minimizzare, ad es. spesa, distanza, preferibilità, tempo, etc. (è importante scegliere correttamente)
Il Grafo dei Collegamenti Vogliamo un grafo orientato che sia completo G(V,E) quindi aggiungiamo anche gli archi relativi a collegamenti che non ci sono mettendo pesi opportunamente alti v 1 c 12 =3 c 21 =4 v 3 v 2 c 32 = + poniamo c 32 = (o meglio un numero >> tutti gli altri costi) se 2 non è accessibile da 3
La Flotta di Veicoli Per servire i vari clienti abbiamo una flotta di veicoli Ciascun veicolo visita un insieme di clienti e torna al deposito Numero e caratteristiche dei singoli veicoli devono essere noti d 1 = 3 d 2 =2 B C A d 5 =1 Q A =10 d 3 =2 d 4 =1
Dati su Domanda e Veicoli 1. d i : domanda del cliente v i 2. m: numero di veicoli disponibili 3. J={1, 2,, m}: insieme dei veicoli 4. Di solito Q j : capacità del veicolo j {1, 2,, m} 5. A volte per ogni cliente bisogna distinguere se è consegna o prelievo (Picup or Delivery) Eventuali aspetti temporali: orari di apertura limitati, tempi di trasporto, di carico e scarico (tempi di transito) 6. Tempo di transito da a a b: t ab 7. Tempo di servizio di a: t a 8. T j : tempo massimo di rientro del veicolo j {1, 2,, m} 9. Finestre temporali associate ad ogni nodo v i : [inizio i, fine i ]
Famiglia dei cluster clienti/veicolo C ={C 1, C 2,,C m } C V {1, 2,,m} v 1 C {1, 2,,m} C C h = {v 1 },h {1, 2,,m} C = V d h < Q h C Struttura delle Soluzioni C caratterizza completamente la soluzione? 14 13 2 3 15 2 5 6 1 3 12 11 8 4 10 9 7 C 1 ={1,2, 4, 5,6,7} C 2 ={1, 3, 13,14,15} C 3 ={1,8, 9, 10,11,12} No! Ad un cluster posso associare diverse sequenze di visita
14 13 3 2 3 Clustering e Routing 12 13 11 3 14 12 11 15 5 2 1 8 4 7 9 15 5 2 8 4 7 9 10 6 Esempio di stessi cluster ma sequenze ( routing ) diverse Una sequenza è un ciclo T orientato che tocca tutti i nodi del cluster C ( Ciclo Hamiltoniano, già visto come trovarli) Conclusione: Una soluzione ammissibile è data dai cicli hamiltoniani {T 1, T 2,,T m } definiti sui cluster {C 1, C 2,,C m } 6
Problema Base di Distribuzione Soluzione ammissibile: T ={T 1, T 2,,T m } Un ciclo hamiltoniano T per ogni cluster C Insieme delle soluzioni ammissibili: T ={T 1, T 2,,T q } L(T ) somma dei costi di transito associati agli archi del ciclo hamiltoniano T Z(T ) = L(T ) costo di transito J Problema Base di Distribuzione 14 15 5 13 3 12 2 3 2 6 1 4 8 7 9 11 10 min Z(T) : T T Minimizzare il costo di transito - servendo la domanda di tutti i clienti - rispettando la capacità dei veicoli
Formulazione del Problema Base EVENTO ELEMENTARE: Nodo v h assegnato al cluster C Variabile binaria y h con: y h =1 se v h C ; y h =0 se v h C Soluzione ammissibile: 14 T ={T 1, T 2,,T m } 15 5 13 3 12 2 3 2 1 4 8 7 9 11 10 C V {1, 2,,m} v 1 C {1, 2,,m} C C h = {v 1 },h {1, 2,,m} C = V 6 y 1 = m J y h = 1 J h {2,,n} d h < Q h C d h y h < Q h V-{v 1 } J
Modello del Problema Base y = [y 1, y 2,y 3,..., y m ] vettore di incidenza di C f(y ) costo di transito del ciclo hamiltoniano minimo definito sui nodi di C cioè sul sottografo G indotto da C in G Problema Base di Distribuzione min Z(T ) : T T min f( y ) h J min L(T ): T T J Ha la forma di Assegnamento Generalizzato, ma ancora non ci va bene perché l obiettivo non è espresso linearmente ma come soluzione di un problema di TSP y 1 = m J y h = 1 J d h y h < Q h V- {v 1 }
Nuove variabili binarie f(y ) costo (di transito) del ciclo hamiltoniano minimo definito sul sottografo G indotto da C in G Soluzioni ammissibili: cicli hamiltoniani di G Evento elementare: il veicolo usa l arco v i v j per qualche coppia {v i, v j } C 13 1 se veicolo usa v i v j 3 Variabile: x ij 0 altrimenti 14 Esempio: 2 2 x13,3 = 1; x1,13 = 0 G 2 1 Allora potrò esprimere la funzione obiettivo in modo lineare come somma dei pesi degli archi usati
Condizioni di Ammissibilità 1/2 Un sottoinsieme di archi T di G 13 è l insieme di archi di un ciclo hamiltoniano di G quando (ma basta richiedere ciò?) 1. Esiste un arco uscente da ogni nodo di C 14 3 2. Esiste un arco entrante in ogni nodo di C Il vettore [ x ij : i=1,,n; j=1,,n] G 2 1 è il vettore di incidenza di un ciclo hamiltoniano T di G n j = 1 n j = 1 x x ij ji = = y y i i.. j=2 j=n j=1 y i =1 se i C i.. j=2 j=n j=1 y i =0 se i C i
Il vettore [ x ij : i=1,,n; j=1,,n] è il vettore di incidenza di un ciclo hamiltoniano T di G 14 solo se 13 Condizioni di Ammissibilità 2/2 G 2 1 3 n j = 1 n j = 1 x x ij ji = = y y i i Ma questo non basta ancora: con questi vincoli i sottocicli risultano ancora ammissibili! Come si eliminano? sottociclo
Eliminazione dei Sottocicli Un sottociclo è un ciclo orientato su un sottoinsieme dei nodi di C Un ciclo orientato su un sottoinsieme S C contiene S archi 13 ELIMINAZIONE DEI SOTTOCICLI: Nessun sottoinsieme proprio S di C può contenere S archi 14 G 2 1 3 Σ x ij S -1 (i,j) S o equivalentemente Σ x ij 1 i S j S per ogni S C 2 S C -1 per ogni J
Un sottoinsieme di archi T di G Ammissibilità Cicli è l insieme di archi di un ciclo hamiltoniano di G se e solo se n j= 1 n j= 1 x x ij ji x ij E ( S ) ij = = y y i i S 1 1. arco uscente da ogni nodo di C 2. arco entrante in ogni nodo di C per ogni S C 3. non contiene sottocicli 2 S C -1 j=2.. i j=2 j=n.. i j=n Mettendo tutto assieme possiamo eliminare le y e ottenere una formulazione di PL01
minσ Σ Σ c ij x ij J Formulazione VRP come PL01 i I j Ι j i Σ Σ x 1j = m J j I Σ Σ x ij = 1 J j Ι j i Σ x ji = Σ x ih j Ι j i h Ι h i Σ Σ d j x ij Q i I j Ι j i j 1 Σ x ij S -1 (i,j) S x ij {0,1} minimizzo somma costi dal deposito escono m veicoli i {2,,n} i I J J I={1, 2,, n}: insieme dei nodi (tra cui 1 è il deposito) J={1, 2,, m}: insieme dei veicoli ogni cliente è servito se veicolo entra nel nodo i deve uscirne la capacità è rispettata S {2,,n}, S 2 i,j I J J j. i h proibisco ogni possibile sottociclo S variabili x ij : percorro arco (i,j) col veicolo.
Numero di Veicoli variabile Se i veicoli disponibili sono m ma potrei anche utilizzarne di meno (spendendo meno), considero per ognuno un costo di attivazione f Se invece spendo sempre lo stesso anche se lascio dei veicoli fermi, non serve minσ Σ Σ c ij x ij + Σ f Σ x 1j J i I j Ι j i Σ Σ x 1j m J j I J e tutto il resto come prima j Ι j 1 dal deposito escono fino a m veicoli minimizzo somma costi percorrenza + costi attivazione Con meno veicoli occorre fare dei percorsi più lunghi Cerco in pratica il miglior compromesso tra risparmio per i veicoli ed economicità dei percorsi
Aspetti Temporali Se per il generico veicolo ho un tempo massimo di utilizzo T (dovuto per es. alla disponibilità del conducente, a vincoli sull orario di lavoro o alla chiusura del deposito) T deve essere espresso in una unità di misura facilmente sommabile e a partire dall inizio delle operazioni (ad esempio in minuti dall uscita dal deposito) Devo considerare: (ovviamente nella stessa unità di misura) Tempo di transito da i a j: t ij Tempo di servizio di i: t i Devo aggiungere vincoli: Σ t i Σ x ij + Σ Σ t ij x ij T i I j Ι j i i I j Ι j i J il tempo complessivo di utilizzo del veicolo non supera il limite Tempi di transito e/o di servizio potrebbero variare da veicolo a veicolo In tal caso ho t ij e t i
Finestre Temporali 1/2 Se invece per il generico cliente j ho una finestra temporale [ iniz j fine j ] (posso visitarlo solo dall istante iniz j all istante fine j, sempre espresso in una opportuna unità di misura a partire dall inizio delle operazioni Devo considerare: un nuovo insieme di variabili a j R con j I che rappresentano l istante di arrivo dal cliente j (dette variabili temporali, ovviamente nella stessa unità di misura) Devo aggiungere i vincoli: iniz j a j fine j j I a j R j I giungo dal cliente j rispettando la sua finestra temporale Però questo non basta (!): devo anche aggiungere vincoli tra le a e le x, altrimenti troverò dei valori per le a che soddisfano tutte le finestre, ma che non è magari possibile ottenere con i percorsi fatti secondo le x
Finestre Temporali 2/2 Vincoli da aggiungere che legano le a e le x: se visito il cliente i all istante a i e subito dopo vado dal cliente j, deve avere: a j = a i + t i + t ij raggiungo il cliente j un istante che è dato da quando arrivo in i, più il tempo di servire i e transitare da i a j e ciò deve valere sse x ij =1 allora separo = in e e aggiungo qualcosa che impone il vincolo sse x ij =1 : a j a i + t i + t ij - (1- x ij ) T a j a i + t i + t ij + (1- x ij ) T i,j I J T è un valore maggiore di tutti i possibili valori di a, e quindi se x ij =0 i vincoli sono banalmente soddisfatti, se invece x ij =1 i vincoli devono valere
Cenni a Ulteriori Varianti Se in alcuni nodi devo prelevare e in altri consegnare ciò che ho prelevato, si chiama picup and delivery problem devo imporre vincoli di precedenza tra l instante in cui visito in cliente i in cui prelievo e l istante in cui visito il cliente j a cui consegno a i a j per ogni coppia i, j di picup e delivery Oppure, se non ho le variabili temporali a i, uso variabili intere u i che rappresentano l ordine di visita del nodo i col veicolo, vincoli opportuni tra le u e vincoli che colleghino le u alle x (simili a quelli già visti per le a) Inoltre servono variabili q i che sono il carico totale del veicolo alla partenza dal cliente i, in modo da imporre che il carico totale non superi mai la capacità Esiste anche il Dial a Ride Problem: bisogna soddisfare varie richieste di trasporto da un punto ad un altro (eventualmente giunte anche durante l esecuzione): è il problema dei taxi
Come gestire i Vincoli di Sottocicli? I vincoli di eliminazione di sottocicli sono in numero esponenziale x ij E ( S ) ij S 1 per ogni S C Semplifichiamo: focalizziamoci su un singolo cluster di G(V,E) (1) (2) n j = 1 n j = 1 x x ij ji = 1 per = 1 per ogni ogni i V i V (3) x ij ij E ( S ) S 1 per ogni S V Proprietà: x vettore d incidenza di un ciclo hamiltoniano ij E x ij = V Ottenuto sommando le V equazioni (1) Cioè: ogni ciclo hamiltoniano di G contiene esattamente V archi
Oracolo di separazione: dato un punto (anche frazionario) x * che soddisfa le (1), decide se esiste un vincolo (3) violato da x *, cioè trova S V, tale che * x > S 1 (A) ij ij E ( S ) oppure conclude che nessun vincolo (3) è violato da x * Osservazione: sommando i vincoli (1) per i S si ottiene Separazione Vincoli Sottocicli + * * xij xij = ij E ( S ) ij δ ( S ) S Si ha violazione dei vincoli di sottociclo quando la I sommatoria è > S -1 (condizione (A)), cioè quando * < 1 x ij ij δ ( S ) Allora possiamo generare vincoli di sottociclo violati cercando per esempio tagli per cui valga questa condizione (è un modo, se ne potrebbero pensare anche altri )
Oracolo Vincoli Sottocicli Oracolo di Separazione Associa a ogni arco (i,j) capacità c ij = x ij * Per ogni coppia di nodi u,v Calcola l u-v taglio a capacità minima (u W, v W) Se c(w) < 1 vincolo violato e STOP Fine ciclo (Per ogni arco (u,v) la condizione non è verificata) Non esiste un vincolo violato l u-v taglio a capacità minima si trova risolvendo il problema di massimo flusso u-v Quindi risolvo un problema di massimo flusso per ogni scelta u,v. Se fisso u, ne devo risolvere uno per ogni scelta di v, cioè C -1
Algoritmi di Soluzione Metodi Esatti: Branch-and-cut, cioè Branch-and-Bound con aggiunta di vincoli per migliorare la formulazione, eventualmente con generazione dinamica di vincoli di sottociclo raggiunge l ottimo per problemi di dimensione contenuta, non riesce a risolvere problemi grandi Metodi Approssimati (Euristiche): Euristiche costruttive: Greedy, Clare & Wright Costruttive in due fasi: Cluster First Route Second (CFRS) o Route First Cluster Second (RFCS) Euristiche migliorative: Ricerca Locale, Taboo Search più usate per risolvere problemi pratici (spesso grandi dimensioni)
Euristiche Costruttive Clare & Wright: Passo 0: forma soluzione iniziale {T 10,, T n-10 } con T i0 = {v 1, v i+1 } (una rotta per cliente) Passo i: per ogni coppia {T hi, T i } tale che la somma delle sue domande è Q (cioè rotte unibili senza violare capacità) calcola c last(h),1 + c 1,first() c last(h),first() (cioè il risparmio ottenuto fondendo la coppia: elimino l utlimo arco della prima e il primo della seconda e aggiungo l arco che collega le due rotte, può essere negativo) e scegli il massimo c last(h),1 c last(h),first() c1,first() Se il massimo risparmio è 0 STOP altrimenti fondi le rotte corrispondenti al massimo, i=i+1 e vai al Passo i Se il numero di veicoli è m, per avere una sol. ammissibile occorre fondere rotte anche se ho massimo negativo fino ad averne non più di m
Sweep (CFRS): Metodi Costruttivi Due Fasi Si rappresentano tutti i clienti in un piano dove l origine è il deposito Si immagina un raggio uscente dal deposito che ruoti in modo da spazzare tutto il piano I clienti progressivamente incontrati dal raggio vengono messi in un cluster finchè la somma delle loro domande non supera la capacità, oltre viene creato un nuovo cluster Per ogni cluster si trova poi il routing con una delle euristiche per il TSP Clare & Wright modificato: Il risparmio viene calcolato considerando anche le permutazioni delle due rotte che potrei fondere, e periodicamente riottimizzo le rotte di ogni cluster con una euristica per il TSP RFCS: Si risolve prima il TSP per tutti i clienti per mezzo di una euristica, poi si spezza il ciclo Hamiltoniano trovato in modo da rispettare le capacità dei veicoli
Euristiche Migliorative Ricerca Locale: Calcola un intorno di una soluzione ammissibile (vari possibili criteri: spostamento di cliente da un cluster a un altro, modifica routing) Trova la miglior soluzione dell intorno e passa ad essa se conveniente (come visto, ci si arresta in un minimo locale) Tabu Search (per non arrestarsi in minimi locali): Inizializzazione: Definisci una soluzione ammissibile iniziale attraverso un metodo costruttivo Iterazione: genera intorni eseguendo delle mosse (ad esempio spostamento di cliente da un cluster a un altro). Effettuare la mossa inversa viene vietato (è Tabu) per un certo numero di passi Ci si sposta in una soluzione dell intorno accettando anche, sotto opportune condizioni, dei peggioramenti, in modo da non fermarsi su minimi locali Il Tabu serve ad evitare di tornare subito sulla soluzione precedente quando ho accettato un peggioramento Postottimizzazione: riottimizza il routing di ogni cluster con euristica per TSP Ovviamente, tante possibili varianti e miglioramenti dello schema descritto