Il commesso viaggiatore Algoritmi per la distribuzione delle merci: Il problema del TSP noto come il problema del Commesso Viaggiatore è inteso come il problema di ottimizzare i costi sulla rete, per consegnare la merce ai vari centri di distribuzione o ai negozi al dettaglio. Ciò comporta, trovare il percorso minimo che consente di passare da tutti i nodi i quali coincidono con le destinazioni delle merci. I Metodi per la risoluzione di questo problema sono di due categorie: - Metodi Esatti - Metodi Euristici I primi consentono di ottenere la soluzione esatta attraverso l'uso di metodi matematici efficienti ed efficaci; i secondi invece, sono dei metodi che forniscono la soluzione in maniera approssimata, in quanto presentano un errore rispetto alla soluzione esatta e utilizzano gli algoritmi risolutivi della ricerca operativa. Viene utilizzata la disuguaglianza triangolare, quindi ad ogni costo cij si deve verificare che: cij cik c jk La disuguaglianza triangolare può essere utilizzata in qualunque gruppo. Lo scopo è quello di trovare l’itinerario che passi da ogni nodo del grafo oggetto di studio una sola volta e che contemporaneamente minimizzi i costi. Tutto ciò si deve verificare partendo da un nodo qualunque ritornando in fine al nodo di partenza. I metodi Euristici possono essere: - costruttivi; - di miglioramento; - a due fasi. Il primo algoritmo ha come condizione iniziale che deve partire da un nodo della rete; Il secondo, di miglioramento,parte da un circuito già individuato, si procede cambiando nodi e archi per migliorare il circuito di partenza, l’obiettivo anche in questo caso è quello di ridurre il costo totale del circuito. Il terzo è un metodo ibrido rispetto ai primi due. Le Euristiche, tra i metodi costruttivi, viste nel corso di trasporto merci e logistica sono le seguenti: - Nearest Neighbour (Nodo più vicino) - Inserimento del nodo più lontano - Inserimento del nodo più vicino - Doppio albero ricoprente - Christofides Nearest Neighbour: - Si parte dal nodo origine per procedere con il nodo più prossimo, quindi il collegamento con il nodo più vicino. - L’obiettivo è quello di ricavare il circuito di minimo costo. L'errore relativo che si commette con questa Euristica è di circa il 25%. Vantaggi: Gli archi molto lunghi in genere non sono molti. Svantaggi: Il percorso può presentare degli incroci. I primi archi sono brevi, gli ultimi lunghi. Inserimento nodo più lontano: - Si parte da un circuito di partenza, tenendo in considerazione due nodi che presentano la distanza massima. - Per trovare il successivo nodo da inserire, occorre valutare la massima distanza tra i nodi precedenti e quelli rimanenti. - Scelto il nodo in base alla massima distanza, lo si inserisce valutando, tra i vari circuiti che si possono realizzare, quello che presenta il minimo incremento di costo, ovvero di lunghezza. Iterando questo algoritmo si perviene al circuito di minimo costo. L'errore relativo di questa euristica si attesta intorno al 10%. Inserimento nodo più vicino: - Si parte da un nodo qualsiasi della rete, successivamente si passa ai nodi che presentano la minima distanza. Per trovare il successivo nodo da inserire, occorre valutare la minima distanza tra i nodi precedenti e quelli rimanenti. Anche qui, l’obiettivo è il circuito Hamiltoniano di minimo costo. L'errore relativo di questa euristica si attesta intorno al 20%. Doppio albero ricoprente: Il concetto alla base di questa euristica è l’uso dell’ albero ricoprente. Un albero è quel grafo che ha un numero di archi (i rami appunto) pari al numero dei nodi, meno uno. E’ detto inoltre ricoprente, in quanto tocca tutti i nodi della rete. L’algoritmo alla base di questa euristica è formato dai seguenti - Individuare l’albero ricoprente minimo, il cui costo sarà. - Individuare un possibile circuito Hamiltoniano di costo pari a C(CH) - Operazione di ottimizzazione del circuito tale che alla fine si abbia un circuito Hamiltoniano di costo minimo. L’errore relativo medio che si commette con questa euristica è circa pari al 30%. Christofides Anche questa euristica ha, come punto di partenza, l’individuazione dell’albero ricoprente di costo minimo: Gli step che si succedono in questo algoritmo sono i seguenti: - Individuazione dell’albero ricoprente minimo. - Operazione di Matching, ovvero: ”Individuare nell’albero ricoprente minimo i nodi di ordine dispari e connetterli in maniera ottimale dal punto di vista dei costi”. - individuare il circuito Hamiltoniano minimo basandosi anche sulle connessioni aggiunte, partendo sempre dal nodo origine ed eliminando i nodi già raggiunti. Per nodo di ordine pari si intende quel nodo al quale sono incidenti un numero pari di archi. Si definisce invece,nodo di ordine dispari, quel nodo al quale sono incidenti archi in numero dispari. L’errore relativo che si commette con questa euristica è i media, del 10%. Esercizio 1 Un azienda di prodotti alimentari deve trasportare un carico di merce da un proprio centro di distribuzione a diversi magazzini localizzati in una data area geografica. I magazzini e il centro di distribuzione, coincidente con il nodo A, sono collegati tramite la rete stradale rappresentata tramite la seguente matrice, nella quale vengono riportate le distanze Euclidee per ogni origine – destinazione. A B C D E F A 0 21 35 38 70 55 B 21 0 13 29 62 22 C 35 13 0 34 48 20 D 38 29 34 0 15 27 E 70 62 48 15 0 32 F 55 22 20 27 32 0 Si vuole raggiungere ogni nodo della rete distributiva senza farvi ritorno, minimizzando il percorso totale e tornando al nodo di partenza. In particolare: - risolvere il problema di TSP con le euristiche Nearest neighbor, Inserimento del nodo più vicino, Inserimento del nodo più lontano; - verificare quale tra gli algoritmi risulta essere il più efficace; - trovare la soluzione partendo da un nodo diverso da A. Euristica Nearest neighbor L’impiego del presente algoritmo prevede di partire dal nodo origine della rete (nodo A) e collegarlo al nodo più prossimo. Quest’ultimo dovrà, a sua volta, essere collegato al nodo che dimostra di possedere la relazione più piccola. Utilizzando i dati della matrice si perviene al seguente Circuito hemiltoniano: A-B-C-F-D-E-A Dalla somma delle distanze dei singoli tratti si evince che la lunghezza totale del circuito hemiltoniano, valutata con l’algoritmo Nearest neighbor, è di 166. Invece, considerando il nodo F come localizzazione dell’azienda distributrice di prodotti alimentari, il Circuito hemiltoniano risulta essere: F-C-B-A-D-E-F Dalla somma delle distanze dei singoli tratti si evince che la lunghezza totale del Circuito hemiltoniano in questo caso è di 139. Euristica Inserimento del nodo più vicino L’uso dell’euristica Inserimento del nodo più vicino prevede l’individuazione di un circuito parziale caratterizzato dalla minima distanza tra il nodo origine (A) ed un altro nodo della rete. Dopodiché si inserisce il nodo che risulta essere il più vicino ad uno dei nodi del circuito parziale. Il passo successivo prevede di stabilire dove inserire in nuovo nodo e ciò verrà fatto considerando il minimo incremento alla lunghezza del percorso che l’inserimento del nuovo nodo apporta e ricordando che il Circuito hemiltoniano prevede che un nodo della rete deve essere raggiunto una sola volta durante il tragitto. Di seguito vengono riportate le relative iterazioni: - Dai dati forniti in tabella si nota che il circuito parziale iniziale è costituito dai nodi A-B poiché la loro distanza (21) è la più piccola tra tutte le possibili distanze tra A e gli altri nodi della rete. Il circuito parziale ha lunghezza 21+21=42. - Inserimento del nodo successivo più vicino. La distanza minima a partire dai nodi A e B è quella del nodo C (13), ma ora occorre valutare di quanto incrementa la lunghezza del circuito. Le lunghezze sono: A-B=21 C-A=35 C-B=13 allora l’incremento apportato è 35+13-21=27. Il nuovo circuito A-C-B-A ha lunghezza 35+13+21=69. - La distanza minima da A, B, C, è quella del nodo F (20). Ora si può stabilire dove inserirlo: F tra A-C: A-C=35 F-A=55 F-C=20 Incremento 55+20-35=40 F tra C-B: C-B=13 F-C=20 F-B=22 Incremento 20+22-13=29 F tra B-A: B-A=21 F-B=22 F-A=55 Incremento 55+22-21=56 F viene inserito, allora, tra C e B perché è l’incremento minimo al tragitto e il nuovo circuito è A-C-F-B-A di lunghezza 69+29=98. - Il nodo da considerare ora è quello D (29) ed i relativi incrementi sono: A-D-C=37 C-D-F=41 F-D-B=34 A-D-B=46 Quindi è opportuno inserire D tra F e B. Il nuovo circuito A-C-F-D-B-A ha lunghezza 132. - Concludendo l’iterazione si considera il nodo E e verrà inserito tra F e D, poiché A-E-C=83 C-E-F=60 F-E-D=20 D-E-B=48 B-E-A=111 La lunghezza totale del Circuito hemiltoniano A-C-F-E-D-B-A è di 152. Invece, considerando il nodo D come localizzazione dell’azienda distributrice di prodotti alimentari, il Circuito hemiltoniano assumerà altra configurazione. - Dai dati forniti in tabella si nota che il circuito parziale iniziale è costituito dai nodi D-E poiché la loro distanza (15) è la più piccola tra tutte le possibili distanze tra D e gli altri nodi della rete. Il circuito parziale ha lunghezza 15+15=30. - Inserimento del nodo successivo più vicino. La distanza minima a partire dai nodi D e E è quella del nodo F (27). Il nuovo circuito D-F-E-D avrà lunghezza pari a 68. - La distanza minima da D, E, F, è quella del nodo C (20). Ora si può stabilire dove inserirlo in base all’incremento: D-C-F=33 F-C-E=36 E-C-D=67 C viene inserito, allora, tra D e F perché è l’incremento minimo al tragitto e il nuovo circuito è D-C-F-E-D di lunghezza 101. - Il nodo da considerare ora è quello B (13) ed i relativi incrementi sono: D-B-C=8 F-B-C=15 F-B-E=52 E-B-D=76 Quindi è opportuno inserire B tra D e C. Il nuovo circuito D-B-C-F-E-D ha lunghezza 109. - Concludendo l’iterazione si considera il nodo A e verrà inserito tra D e B, poiché E-A-D=93 D-A-B=30 B-A-C=43 C-A-F=70 F-A-E=93 La lunghezza totale del Circuito hemiltoniano D-A-B-C-F-E-D è di 139. Euristica Inserimento del nodo più lontano L’uso dell’euristica Inserimento del nodo più lontano prevede l’individuazione di un circuito parziale caratterizzato dalla massima distanza tra il nodo origine (A) ed un altro nodo della rete. Dopodiché si inserisce il nodo che risulta essere il più lontano ad uno dei nodi del circuito parziale. Il passo successivo prevede di stabilire dove inserire in nuovo nodo e ciò verrà fatto considerando il minimo incremento alla lunghezza del percorso che l’inserimento del nuovo nodo apporta e ricordando che il Circuito hemiltoniano prevede che un nodo della rete deve essere raggiunto una sola volta durante il tragitto. Di seguito vengono riportate le relative iterazioni: - Dai dati forniti in tabella si nota che il circuito parziale iniziale è costituito dai nodi A-E poiché la loro distanza (70) è la più grande tra tutte le possibili distanze tra A e gli altri nodi della rete. Il circuito parziale ha lunghezza 70+70=140. - Inserimento del nodo successivo più lontano. La distanza massima a partire dai nodi A e E è quella del nodo B (62), ma ora occorre valutare di quanto incrementa la lunghezza del circuito. Le lunghezze sono: A-E=70 B-A=21 B-E=62 Il nuovo circuito A-B-E-A ha lunghezza 21+62+70=153. - La distanza massima da A, B, E, è quella del nodo F (55). Ora si può stabilire dove inserirlo: F tra A-E: A-E=70 F-A=55 F-E=32 Incremento 32+55-70=17 F tra A-B: A-B=21 F-A=55 F-B=22 Incremento 22+55-21=56 F tra B-E: B-E=62 F-B=22 F-E=32 Incremento 32+22-62= -8 F viene inserito, allora, tra B ed E perché è l’incremento minimo al tragitto e il nuovo circuito è A-B-F-E-A di lunghezza 153-8=145. - Il nodo da considerare ora è quello C (48) ed i relativi incrementi sono: A-C-B=27 B-C-F=11 F-C-E=36 E-C-A=13 Quindi è opportuno inserire C tra B ed F. Il nuovo circuito A-B-C-F-E-A ha lunghezza 156. - Concludendo l’iterazione si considera il nodo D e verrà inserito tra E ed A, poiché gli incrementi sono: C-D-F=41 A-D-B=46 B-D-C=50 F-D-E=10 E-D-A= -17 La lunghezza totale del Circuito hemiltoniano A-B-C-F-E-D-A è di 139. Invece, considerando il nodo C come localizzazione dell’azienda distributrice di prodotti alimentari, il Circuito hemiltoniano assumerà altra configurazione. - Dai dati forniti in tabella si nota che il circuito parziale iniziale è costituito dai nodi C-E poiché la loro distanza (48) è la più grande tra tutte le possibili distanze tra C e gli altri nodi della rete. Il circuito parziale ha lunghezza 48+48=96. - Inserimento del nodo successivo più lontano. La distanza massima a partire dai nodi C e E è quella del nodo A (70). Il nuovo circuito C-A-E-C avrà lunghezza pari a 153. - La distanza massima da A, C, E, è quella del nodo B (62). Ora si può stabilire dove inserirlo in base all’incremento: C-B-A= -1 A-B-E=13 C-B-E=27 B viene inserito, allora, tra C e A perché è l’incremento minimo al tragitto e il nuovo circuito è C-B-A-E-C di lunghezza 152. - Il nodo da considerare ora è quello F (55) ed i relativi incrementi sono: C-F-B=29 B-F-A=56 A-F-E=17 E-F-C=4 Quindi è opportuno inserire F tra C ed E. Il nuovo circuito C-B-A-E-F-C ha lunghezza 156. - Concludendo l’iterazione si considera il nodo D e verrà inserito tra E ed A, poiché gli incrementi sono: C-D-B=50 A-D-B=46 E-D-F=10 A-D-E= -17 F-D-C=41 La lunghezza totale del Circuito hemiltoniano C-B-A-D-E-C è di 139. Conclusioni Tra gli algoritmi utilizzati quello che risulta più efficace è quello dell’Euristica del nodo più lontano che ha dato come Circuito hemiltoniano A-B-C-F-E-D-A di lunghezza totale pari a 139. Esercizio 2 Il grafo è composto da 11 nodi di coordinate illustrate nella seguente tabella: id 1 2 3 4 5 6 7 8 9 10 11 nodo A B C D E F G H I L M coord. X coord. Y 10,00 85,00 23,00 49,00 47,00 68,00 12,00 74,00 53,00 12,00 62,00 28,00 41,00 44,00 77,00 39,00 79,00 66,00 86,00 0,00 92,00 4,00 Nodi 90,00 80,00 70,00 60,00 50,00 40,00 30,00 20,00 10,00 0,00 0,00 20,00 40,00 60,00 80,00 100,00 La tabella seguente riporta le distanze euclidee fra i vari nodi della rete oggetto di studio: A A B C D E F G H I L M 11 38 51 41 85 77 81 72 114 115 B C D 11 38 51 27 42 27 19 42 19 36 31 25 74 48 34 68 44 26 74 55 36 67 59 44 105 80 63 106 82 65 E 41 36 31 25 56 43 42 32 78 78 F 85 74 48 34 56 18 36 60 35 40 G 77 68 44 26 43 18 H 81 74 55 36 42 36 19 I 72 67 59 44 32 60 42 27 L 114 105 80 63 78 35 37 40 66 19 42 27 37 40 66 38 38 63 7 M 115 106 82 65 78 40 38 38 63 7 Euristica Doppio albero ricoprente Individuare l’albero ricoprente minimo. Partendo dal nodo iniziale (A), si deve trovare la connessione minima con quest’ultimo. In seguito occorre trovare la minima connessione tra i nodi rimanenti e i due collegati in precedenza. Iterando questo algoritmo si perviene all’albero ricoprente minimo: A-D-B-G-F-H-I-H-F-E-L-M-L-E-F-G-C-G-B-D-A Si elidono i nodi ripetuti, otterremo: A-D-B-G-F-H-I-E-L-M-C-A Così facendo si devono introdurre tre archi di collegamento, e cioè: A-C, C-M, E-I. Per avere un circuito Hamiltoniano raddoppio gli archi percorrendoli nei due sensi. In tal modo ottengo un circuito, il cui costo complessivo è di 481 e risulta essere il migliore rispetto alle combinazioni studiate, riportate di seguito: A-D-B-G-C-F-H-I-E-L-M-A COSTO = 549 A-D-B-G-C-F-E-L-M-H-I-A COSTO = 532 A-D-B-G-F-E-L-M-H-I-C-A COSTO = 483 Euristica Christofides Individuo l’albero ricoprente minimo che in tal caso è uguale a quello dell’esercizio precedente, in quanto il grafo è il medesimo: A-D-B-G-F-H-I-E-L-M-C Individuo i nodi di ordine dispari che sono: A=1; D=2; B=2; G=3; F=3; H=2; I=1; E=2; L=2; M=1; C=1 Di seguito si propongono due delle possibili combinazioni : Soluzione 1 Si individuano gli archi di Mathing: A-G, C-M, F-I Individuati gli archi di Mathing si individuano alcuni circuiti e si sceglie infine quello a costo minimo: A-D-B-G-F-H-I-F-E-L-M-C-G-A COSTO =481 A-G-C-M-L-E-F-H-I-F-G-B-D-A COSTO =570 A-D-B-G-C-M-L-E-F-H-I-F-G-A COSTO =564 A-D-B-G-C-M-L-E-F-I-H-F-G-A COSTO =598 Soluzione 2: Si individuano gli archi di Mathing: A-C, M-I Individuati gli archi di Mathing si individuano alcuni circuiti e si sceglie infine quello a costo minimo: A-D-B-G-F-E-L-M-I-H-C-A COSTO =505 A-C-G-F-H-I-M-L-E-B-D-A COSTO =442 A-D-B-G-F-H-I-M-L-E-C-A COSTO =460 A-C-G-F-E-L-M-I-H-B-D-A COSTO =500