30.06.2015 Views

Il problema del commesso viaggiatore - Politecnico di Torino

Il problema del commesso viaggiatore - Politecnico di Torino

Il problema del commesso viaggiatore - Politecnico di Torino

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!