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