Il problema del commesso viaggiatore - Politecnico di Torino
Il problema del commesso viaggiatore - Politecnico di Torino
Il problema del commesso viaggiatore - Politecnico di Torino
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
<strong>Il</strong> <strong>problema</strong> <strong>del</strong><br />
<strong>commesso</strong> <strong>viaggiatore</strong><br />
Fulvio CORNO - Matteo SONZA REORDA<br />
Dip. Automatica e Informatica<br />
<strong>Politecnico</strong> <strong>di</strong> <strong>Torino</strong><br />
Sommario<br />
• Definizione <strong>del</strong> <strong>problema</strong><br />
• Algoritmo base<br />
• Algoritmo Branch and Bound<br />
• Algoritmo greedy.<br />
A.A. 2004/2005 APA - TSP 2<br />
1
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Sommario<br />
• Definizione <strong>del</strong> <strong>problema</strong><br />
• Algoritmo base<br />
• Algoritmo Branch and Bound<br />
• Algoritmo greedy.<br />
A.A. 2004/2005 APA - TSP 3<br />
Cammino hamiltoniano<br />
Dato un grafo G=(V,E), si definisce<br />
hamiltoniano un cammino p=<br />
tale per cui<br />
• k è pari a |V|<br />
• v i ≠ v j ∀ i,j.<br />
In altre parole, un cammino hamiltoniano<br />
tocca tutti i vertici <strong>del</strong> grafo una ed una sola<br />
volta.<br />
A.A. 2004/2005 APA - TSP 4<br />
2
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Ciclo hamiltoniano<br />
Un ciclo hamiltoniano è un cammino <strong>di</strong><br />
lunghezza |V+1| così composto:<br />
• i primi |V| vertici compongono un cammino<br />
hamiltoniano<br />
• il vertice <strong>di</strong> arrivo (v k+1 ) coincide con quello<br />
<strong>di</strong> partenza (v 1 ).<br />
A.A. 2004/2005 APA - TSP 5<br />
Esempio<br />
1 2 3<br />
4 5 6<br />
7 8 9<br />
A.A. 2004/2005 APA - TSP 6<br />
3
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Esempio<br />
Cammino<br />
hamiltoniano:<br />
1-2-9-3-5-4-7-8-6<br />
1 2 3<br />
4 5 6<br />
7 8 9<br />
A.A. 2004/2005 APA - TSP 7<br />
Esempio<br />
Ciclo hamiltoniano:<br />
1-2-9-3-5-4-7-8-6-1<br />
1 2 3<br />
4 5 6<br />
7 8 9<br />
A.A. 2004/2005 APA - TSP 8<br />
4
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
TSP<br />
<strong>Il</strong> Problema <strong>del</strong> Commesso Viaggiatore<br />
(Traveling Salesman Problem, o TSP) è<br />
definito come segue.<br />
Dato un grafo pesato G=(V,E), trovare un<br />
ciclo hamiltoniano tale per cui il peso <strong>del</strong><br />
cammino (ossia la somma dei pesi degli archi<br />
che lo compongono) è minima.<br />
A.A. 2004/2005 APA - TSP 9<br />
Esempio<br />
2<br />
Ciclo hamiltoniano<br />
<strong>di</strong> lunghezza<br />
minima (23)<br />
2<br />
1 2 3<br />
1<br />
5<br />
6<br />
7<br />
3<br />
4 5 6<br />
2<br />
4<br />
2<br />
5<br />
2<br />
8<br />
7 8 9<br />
5<br />
A.A. 2004/2005 APA - TSP 10<br />
5
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Complessità<br />
<strong>Il</strong> TSP è un <strong>problema</strong> che non ammette<br />
soluzioni <strong>di</strong> complessità polinomiale.<br />
A.A. 2004/2005 APA - TSP 11<br />
Esempio <strong>di</strong> applicazione<br />
Nel ciclo <strong>di</strong> produzione <strong>del</strong>le schede elettroniche<br />
monostrato esiste una fase in cui devono essere<br />
eseguiti i fori in cui saranno poi alloggiati (e saldati) i<br />
pin dei componenti.<br />
L'operazione <strong>di</strong> foratura ha un tempo proporzionale alla<br />
lunghezza <strong>del</strong> percorso eseguito dalla punta.<br />
Minimizzare il percorso <strong>del</strong>la punta (riportandola al<br />
termine nella posizione iniziale <strong>di</strong> riposo) corrisponde a<br />
risolvere il TSP sul grafo che rappresenta l'insieme dei<br />
fori, pesato con le <strong>di</strong>stanze geometriche che li<br />
separano.<br />
A.A. 2004/2005 APA - TSP 12<br />
6
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Sommario<br />
• Definizione <strong>del</strong> <strong>problema</strong><br />
• Algoritmo base<br />
• Algoritmo Branch and Bound<br />
• Algoritmo greedy.<br />
A.A. 2004/2005 APA - TSP 13<br />
Algoritmo base<br />
Si basa su una ricerca esaustiva nello spazio<br />
dei possibili cicli hamiltoniani, al termine <strong>del</strong>la<br />
quale si identifica quello con lunghezza<br />
minima.<br />
Tale ricerca può essere eseguita attraverso<br />
una procedura recursiva.<br />
A.A. 2004/2005 APA - TSP 14<br />
7
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Co<strong>di</strong>ce C – variabili globali<br />
VERTEXP graph;<br />
int nvertex;<br />
char*visited;<br />
int *journey;<br />
int *best;<br />
chartrovato=0;<br />
int min=MAXINT;<br />
int cost=0;<br />
int source;<br />
A.A. 2004/2005 APA - TSP 15<br />
Co<strong>di</strong>ce C – programma<br />
principale (1)<br />
…<br />
int i;<br />
int start;<br />
char fname[MAXNAME];<br />
…<br />
if( (visited=(char *)malloc( nvertex * sizeof( char)))==NULL)<br />
{ printf("Errore in allocazione vettore visited \n");<br />
return; }<br />
for(i=0; i
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Co<strong>di</strong>ce C – programma<br />
principale (2)<br />
…<br />
visited[start] = 1;<br />
source=start;<br />
tsp( start, 0);<br />
if( trovato)<br />
{ printf( "Soluzione: \n");<br />
for( i=0; iweight;<br />
if( cost < min)<br />
{ min = cost;<br />
for( i=0; i
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Co<strong>di</strong>ce C – tsp (2)<br />
}<br />
for( i=0, p=graph[start].adjlist;<br />
ivertex]==0)<br />
{ cost+=p->weight;<br />
journey[step] = p->vertex;<br />
visited[p->vertex] = 1;<br />
tsp( p->vertex, step+1);<br />
cost-=p->weight;<br />
visited[p->vertex] = 0;<br />
}<br />
}<br />
A.A. 2004/2005 APA - TSP 19<br />
Co<strong>di</strong>ce C – tsp (2)<br />
}<br />
for( i=0, p=graph[start].adjlist;<br />
ivertex]==0)<br />
{ cost+=p->weight;<br />
journey[step] = p->vertex;<br />
visited[p->vertex] = 1;<br />
tsp( p->vertex, step+1);<br />
cost-=p->weight;<br />
visited[p->vertex] = 0;<br />
}<br />
}<br />
La parte in blu corrisponde<br />
ad una visita in profon<strong>di</strong>t à.<br />
A.A. 2004/2005 APA - TSP 20<br />
10
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Co<strong>di</strong>ce C – tsp (2)<br />
}<br />
for( i=0, p=graph[start].adjlist;<br />
ivertex]==0)<br />
{ cost+=p->weight;<br />
journey[step] = p->vertex;<br />
visited[p->vertex] = 1;<br />
tsp( p->vertex, step+1);<br />
cost-=p->weight;<br />
visited[p->vertex] = 0;<br />
}<br />
}<br />
Con queste due istruzioni si<br />
esplorano TUTTI i possibili<br />
cammini composti da |V|<br />
vertici.<br />
A.A. 2004/2005 APA - TSP 21<br />
Complessità<br />
Nel caso peggiore il grafo è completo. In tal<br />
caso il numero <strong>di</strong> possibili scelte è n-1 al<br />
primo passo, n-2 al secondo, n-k al k-esimo.<br />
<strong>Il</strong> numero <strong>di</strong> chiamate recursive è quin<strong>di</strong><br />
O(n!).<br />
A.A. 2004/2005 APA - TSP 22<br />
11
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Esempio<br />
A<br />
4<br />
1<br />
B<br />
3 2<br />
1<br />
D<br />
7<br />
C<br />
A.A. 2004/2005 APA - TSP 23<br />
Esempio<br />
Ciclo hamiltoniano <strong>di</strong><br />
lunghezza minima,<br />
pari a 7<br />
A<br />
4<br />
1<br />
B<br />
3 2<br />
1<br />
D<br />
7<br />
C<br />
A.A. 2004/2005 APA - TSP 24<br />
12
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Albero <strong>di</strong> ricerca<br />
A<br />
4<br />
B<br />
1 C<br />
3 D<br />
6<br />
C<br />
5<br />
D<br />
3<br />
B<br />
8<br />
D<br />
4<br />
B<br />
10<br />
C<br />
13<br />
D<br />
12<br />
C<br />
4<br />
D<br />
9<br />
B<br />
6<br />
C<br />
12<br />
B<br />
16 13 7 13 7 16<br />
A.A. 2004/2005 APA - TSP 25<br />
Backtracking<br />
È la tecnica consistente nell'esplorare<br />
esaustivamente un certo spazio <strong>di</strong> ricerca<br />
eseguendo ad ogni passo tutte le possibili<br />
scelte.<br />
A.A. 2004/2005 APA - TSP 26<br />
13
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Backtracking (II)<br />
Si basa su<br />
1.ad ogni passo si prende una <strong>del</strong>le possibili<br />
decisioni, e si esplora poi recursivamente<br />
tutto il sottoalbero che ne deriva<br />
2.si ritorna poi sulla decisione presa<br />
(backtracking), e se ne fa una alternativa,<br />
visitando tutto il risultante sottoalbero<br />
3.si ripete da 1 sino a che vi sono decisioni<br />
possibili non esplorate.<br />
<strong>Il</strong> metodo viene seguito recursivamente a tutti<br />
i livelli.<br />
A.A. 2004/2005 APA - TSP 27<br />
Sommario<br />
• Definizione <strong>del</strong> <strong>problema</strong><br />
• Algoritmo base<br />
• Algoritmo Branch and Bound<br />
• Algoritmo greedy.<br />
A.A. 2004/2005 APA - TSP 28<br />
14
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Branch & Bound<br />
La soluzione precedente esegue una visita<br />
esaustiva <strong>di</strong> tutte le possibili soluzioni (cioè <strong>di</strong><br />
tutti i possibili cicli hamiltoniani) e sceglie<br />
quella ottima.<br />
In realtà si può evitare <strong>di</strong> esplorare alcune<br />
soluzioni, poiché è noto a priori che esse non<br />
possono essere soluzioni ottime.<br />
Non appena si capisce che una soluzione non<br />
può portare ad una soluzione ottima, ne si<br />
abbandona l'esplorazione (bound).<br />
A.A. 2004/2005 APA - TSP 29<br />
TSP con B&B<br />
Una con<strong>di</strong>zione <strong>di</strong> bound molto semplice che<br />
si può applicare al TSP è la seguente:<br />
• Se una soluzione parziale ha un costo<br />
superiore a quello <strong>del</strong>la soluzione migliore<br />
trovata sino a quel punto, non potrà<br />
sicuramente essere una soluzione ottima.<br />
A.A. 2004/2005 APA - TSP 30<br />
15
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Co<strong>di</strong>ce C – tsp (1)<br />
void tsp( int start, int step)<br />
{ int i; ADJLSTEL *p;<br />
if( step == nvertex-1)<br />
{ for( i=0, p=graph[start].adjlist;ivertex==source)<br />
{ trovato = 1;<br />
cost+=p->weight;<br />
if( cost < min)<br />
{ min = cost;<br />
for( i=0; iweight;<br />
}<br />
}<br />
}<br />
A.A. 2004/2005 APA - TSP 31<br />
Co<strong>di</strong>ce C – tsp (2)<br />
for( i=0, p=graph[start].adjlist;ivertex]==0)<br />
{ if( cost+p->weightweight;<br />
journey[step] = p->vertex;<br />
visited[p->vertex] = 1;<br />
tsp( p->vertex, step+1);<br />
cost-=p->weight;<br />
visited[p->vertex] = 0;<br />
}<br />
}<br />
}<br />
}<br />
A.A. 2004/2005 APA - TSP 32<br />
16
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Albero <strong>di</strong> ricerca<br />
Senza bound<br />
A<br />
4<br />
B<br />
1 C<br />
3 D<br />
6<br />
C<br />
5<br />
D<br />
3<br />
B<br />
8<br />
D<br />
4<br />
B<br />
10<br />
C<br />
13<br />
D<br />
12<br />
C<br />
4<br />
D<br />
9<br />
B<br />
6<br />
C<br />
12<br />
B<br />
16 13 7 13 7 16<br />
A.A. 2004/2005 APA - TSP 33<br />
Albero <strong>di</strong> ricerca<br />
Con bound<br />
A<br />
4<br />
B<br />
1 C<br />
3 D<br />
6<br />
C<br />
5<br />
D<br />
3<br />
B<br />
8<br />
D<br />
4<br />
B<br />
10<br />
C<br />
13<br />
D<br />
12<br />
C<br />
4<br />
D<br />
9<br />
B<br />
6<br />
C<br />
12<br />
B<br />
16 13 7 13 7 16<br />
A.A. 2004/2005 APA - TSP 34<br />
17
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Or<strong>di</strong>ne <strong>di</strong> esplorazione<br />
Nel caso <strong>di</strong> algoritmi branch & bound è<br />
importante l'or<strong>di</strong>ne con cui si esplorano le<br />
soluzioni: prima si trova una soluzione buona,<br />
più sono efficaci nel seguito le con<strong>di</strong>zioni <strong>di</strong><br />
bound, riducendo così il costo<br />
<strong>del</strong>l'esplorazione.<br />
A.A. 2004/2005 APA - TSP 35<br />
Sommario<br />
• Definizione <strong>del</strong> <strong>problema</strong><br />
• Algoritmo base<br />
• Algoritmo Branch and Bound<br />
• Algoritmo greedy.<br />
A.A. 2004/2005 APA - TSP 36<br />
18
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Algoritmi greedy<br />
Per quanto si possa investire nella ricerca <strong>di</strong><br />
algoritmi esatti in grado <strong>di</strong> risolvere il TSP, gli<br />
stessi avranno sempre una complessità che<br />
cresce esponenzialmente con la <strong>di</strong>mensione<br />
<strong>del</strong> grafo.<br />
Qualora si desideri una soluzione<br />
approssimata, ma ottenibile con una<br />
complessità computazionale ridotta, si<br />
possono utilizzare gli algoritmi greedy.<br />
A.A. 2004/2005 APA - TSP 37<br />
Algoritmo greedy per TSP<br />
Un possibile algoritmo greedy per il TSP nel<br />
caso <strong>di</strong> grafi completi prevede che ad ogni<br />
passo si scelga il vertice con <strong>di</strong>stanza minore,<br />
tra quelli non ancora visitati, dal vertice<br />
corrente.<br />
In tal modo si ottiene:<br />
• un algoritmo con complessità lineare nel<br />
numero dei vertici (non vi è backtrack)<br />
• una soluzione ottimale, che in generale<br />
non sarà lontana da quella ottima.<br />
A.A. 2004/2005 APA - TSP 38<br />
19
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Co<strong>di</strong>ce C (1)<br />
void tsp_greedy(int source)<br />
{ int start; int i, k; int best, best_vertex; ADJLSTEL *p;<br />
start=source;<br />
for(k=0;kweightweight;<br />
best_vertex=p->vertex;<br />
}<br />
}<br />
}<br />
A.A. 2004/2005 APA - TSP 39<br />
Co<strong>di</strong>ce C (2)<br />
}<br />
}<br />
}<br />
cost+=best_vertex->weight;<br />
journey[k] = best_vertex->vertex;<br />
visited[best_vertex] = 1;<br />
start = best_vertex;<br />
A.A. 2004/2005 APA - TSP 40<br />
20
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Esempio 1<br />
A<br />
4<br />
1<br />
B<br />
3 2<br />
1<br />
D<br />
7<br />
C<br />
A.A. 2004/2005 APA - TSP 41<br />
Esempio 1<br />
In questo caso l'algoritmo<br />
greedy produce la<br />
soluzione ottima<br />
A<br />
4<br />
1<br />
B<br />
3 2<br />
1<br />
D<br />
7<br />
C<br />
A.A. 2004/2005 APA - TSP 42<br />
21
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Esempio 2<br />
6<br />
A<br />
3<br />
1<br />
B<br />
3<br />
2 2<br />
1<br />
3<br />
D<br />
C<br />
3<br />
E<br />
6<br />
A.A. 2004/2005 APA - TSP 43<br />
Esempio 2<br />
Soluzione ottima<br />
(costo 10)<br />
6<br />
A<br />
3<br />
1<br />
B<br />
3<br />
2 2<br />
1<br />
3<br />
D<br />
C<br />
3<br />
E<br />
6<br />
A.A. 2004/2005 APA - TSP 44<br />
22
Algoritmi e Programmazione Avanzata<br />
APA - TSP<br />
Esempio 2<br />
In questo caso l'algoritmo<br />
greedy NON produce la<br />
soluzione ottima<br />
(costo 16)<br />
6<br />
A<br />
3<br />
1<br />
B<br />
3<br />
2 2<br />
1<br />
3<br />
D<br />
C<br />
3<br />
E<br />
6<br />
A.A. 2004/2005 APA - TSP 45<br />
23