22.05.2013 Views

Euristiche per il problema del commesso viaggiatore

Euristiche per il problema del commesso viaggiatore

Euristiche per il problema del commesso viaggiatore

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Mo<strong>del</strong>li dei Sistemi di Produzione<br />

Mo<strong>del</strong>li e Algoritmi <strong>del</strong>la Logistica<br />

20010-11<br />

Problema <strong>del</strong> <strong>commesso</strong> <strong>viaggiatore</strong>:<br />

EURISTICHE<br />

CARLO MANNINO<br />

Sapienza Università di Roma<br />

Dipartimento di Informatica e Sistemistica


<strong>Euristiche</strong> <strong>per</strong> <strong>il</strong> TSP simmetrico<br />

• Consideriamo un grafo G(N,A) non orientato e completo, con costi sugli<br />

archi c R A<br />

• Un ciclo ham<strong>il</strong>toniano è un ciclo semplice, non orientato, che passi <strong>per</strong><br />

ogni nodo di G.<br />

• Il costo di un ciclo è pari alla somma dei costi degli archi <strong>del</strong> ciclo.<br />

• Il <strong>problema</strong> <strong>del</strong> <strong>commesso</strong> <strong>viaggiatore</strong> (TSP–Travelling Salesman<br />

Problem) consiste nel trovare un ciclo ham<strong>il</strong>toniano in G di costo minimo.<br />

• Siccome <strong>il</strong> grafo è non orientato, si parla di TSP simmetrico<br />

• Il <strong>problema</strong> appartiene alla classe di problemi combinatori con funzione<br />

obiettivo lineare ed alla casse dei problemi diffic<strong>il</strong>i (NP-hard).<br />

• In questa lezione ci concentriamo su algoritmi euristici <strong>per</strong> <strong>il</strong> TSP<br />

simmetrico.


Problemi di OC con funzione obiettivo lineare<br />

• Insieme base E ={1,2,…,n} (eventi elementari)<br />

(es. progetto e attivato, arco e scelto, connessione e stab<strong>il</strong>ita)<br />

• Costi (Vantaggi) elementari {c i associati agli elementi di E}<br />

• Soluzione Ammissib<strong>il</strong>e = Opportuno sottoinsieme F E<br />

(es. sottoinsieme di progetti attivati che soddisfano <strong>il</strong> “budget”)<br />

• Costo di una soluzione F = somma dei costi elementari<br />

degli elementi di F<br />

• Insieme <strong>del</strong>le soluzioni ammissib<strong>il</strong>i<br />

Problema:<br />

S ={F 1, F 2, …, F m}<br />

min {c(F): F S}<br />

c (<br />

F)<br />

c(<br />

e)<br />

e<br />

F<br />

c2 F2 c 1<br />

2<br />

1<br />

F 1<br />

3<br />

c n<br />

n F 3


G(V,E)<br />

5<br />

3<br />

5<br />

7<br />

1<br />

4<br />

3<br />

7<br />

5<br />

1<br />

4<br />

1<br />

3<br />

4<br />

15<br />

5<br />

1<br />

3<br />

4<br />

3<br />

5<br />

15<br />

2<br />

3<br />

5<br />

5<br />

2<br />

2<br />

5<br />

TSP come <strong>problema</strong> OC<br />

2<br />

• Grafo G(V,E) non orientato, completo<br />

• c e costo arco e E<br />

Insieme base = insieme archi E<br />

Soluzione T E<br />

Costo T =<br />

T = {14, 42, 23, 35, 51}<br />

c(T) = 20<br />

c ( T)<br />

e<br />

T<br />

ce


Algoritmo Avido (“Greedy”)<br />

• Insieme base E ={1,2,…,n} (eventi elementari)<br />

• Insieme <strong>del</strong>le soluzioni ammissib<strong>il</strong>i S ={F 1, F 2, …,F m} (F E)<br />

• H F <strong>per</strong> qualche H S H soluzione parziale<br />

• Costo di una soluzione parziale H =<br />

Idea base<br />

Costruire una sequenza di soluzioni parziali H 0 ,H 1, H 2 , H 3 ...:<br />

a. a partire dall’insieme vuoto (soluzione parziale H 0)<br />

b. aggiungendo, ad ogni passo, l’elemento che produce la<br />

soluzione parziale con <strong>il</strong> minimo costo.<br />

c. arrestandosi quando:<br />

c (<br />

H)<br />

c(<br />

e)<br />

1. la soluzione parziale corrente è una soluzione ammissib<strong>il</strong>e;<br />

2. ogni soluzione parziale ottenib<strong>il</strong>e aggiungendo un nuovo<br />

elemento ha un valore maggiore <strong>del</strong>la funzione obiettivo.<br />

e<br />

H


Algoritmo Avido (“Greedy”) - Flow chart<br />

H:= ; c(H)=0<br />

Q * = min {c(H {k}): k H, H {k} soluzione parziale}<br />

k * = arg min {c(H {k}): k H , H {k} soluzione parziale}<br />

H S<br />

SI<br />

e<br />

Q * > c(H)<br />

STOP<br />

H soluzione greedy<br />

NO<br />

H:=H {k * }


Algoritmo Avido - TSP<br />

H:= ; c(H)=<br />

k * = arg min {c(H {k}): k H , H {k} estendib<strong>il</strong>e ciclo ham<strong>il</strong>toniano}<br />

H =H {k * }<br />

H ciclo<br />

ham<strong>il</strong>toniano<br />

SI<br />

STOP<br />

H soluzione greedy<br />

NO


Esempio greedy TSP<br />

5<br />

3<br />

4<br />

2<br />

1<br />

3<br />

4<br />

2<br />

1<br />

15<br />

5<br />

3<br />

7<br />

5<br />

5<br />

5<br />

3<br />

4<br />

2<br />

1<br />

1<br />

5<br />

3<br />

4<br />

2<br />

1<br />

1<br />

2<br />

5<br />

3<br />

4<br />

2<br />

1<br />

1<br />

2<br />

3<br />

5<br />

3<br />

4<br />

2<br />

1<br />

1<br />

2<br />

3<br />

5<br />

3<br />

4<br />

2<br />

1<br />

1<br />

2<br />

15<br />

c(T) = 26<br />

5 5<br />

3


Algoritmo di Ricerca Locale (“Local Search”)<br />

• Insieme base ={1,2,…,n} (eventi elementari)<br />

• Insieme <strong>del</strong>le soluzioni ammissib<strong>il</strong>i S ={F 1, F 2, …,F m} (F i<br />

• Intorno di una soluzione ammisib<strong>il</strong>e F = N(F ) S<br />

Idea base<br />

N(T 0 )<br />

Costruire una sequenza di soluzioni ammissib<strong>il</strong>i T 0 ,T 1, T 2 , T 3 ...:<br />

T 0<br />

a. a partire da una soluzione ammissib<strong>il</strong>e T 0<br />

b. individuando, al passo k, la soluzione di minimo costo T k appartenente<br />

all’intorno N(T k-1 ) <strong>del</strong>la soluzione corrente T k-1 .<br />

c. arrestandosi quando ogni soluzione appartenente all’intorno<br />

N(T k-1 ) ha un valore <strong>del</strong>la funzione obiettivo maggiore di c(T k-1)<br />

ovvero c(T k-1) < c(T k)<br />

T 1<br />

N(T 1 )<br />

T 2<br />

T 3<br />

N(T 2 )<br />

)


N(F 1 )={F 2,F 4}<br />

N(F 2 )={F 1,F 4}<br />

N(F 3)={F 2}<br />

N(F 4 )={F 1,F 2,F 3}<br />

Intorni<br />

I ={N (F i ): F i S } Sistema di Intorni di S<br />

F N + (F i ) F= F i k : k F i , F S Intorno “greedy”<br />

F N - (F i ) F=F i k : k F i , F S<br />

F N s(F i ) F i {k } { j } : k F i , j F i , F S<br />

F N s(F i ) F i {h,k } { j,i } : h,k F i , j,i F i , F S<br />

F 2<br />

1<br />

4<br />

5<br />

2<br />

F 1<br />

Intorno “reverse greedy”<br />

3<br />

6<br />

9<br />

7<br />

8<br />

F 4<br />

Intorno di “scambio”<br />

F 3<br />

Intorno “2-scambio”


Minimi Locali e Minimi Globali<br />

F * minimo globale c(F * ) < c(F) <strong>per</strong> ogni F S<br />

F * minimo locale c(F * ) < c(F) <strong>per</strong> ogni F N (F * )}<br />

minimi locali minimo globale<br />

L’algoritmo di ricerca locale individua un minimo locale<br />

N (x )= {y: |x-y|< }


Ricerca Locale (“Local Search”) - Flow chart<br />

T S<br />

Q * = min {c(T’ ): T’ N(T)}<br />

T NUOVO= argmin {c(T’ ): T’ N(T) }<br />

Q * >c(T)<br />

SI<br />

STOP<br />

T minimo locale<br />

NO<br />

T:= T NUOVO


5<br />

5<br />

3<br />

3<br />

7<br />

1<br />

4<br />

1<br />

4<br />

5<br />

1<br />

3<br />

4<br />

15<br />

1<br />

15<br />

3<br />

5<br />

c(T) =26<br />

2<br />

2<br />

5<br />

5<br />

3<br />

Intorno 2-scambio <strong>per</strong> <strong>il</strong> TSP<br />

2<br />

2<br />

5<br />

3<br />

5<br />

5<br />

3<br />

3<br />

4<br />

1<br />

4<br />

1<br />

4<br />

1<br />

1<br />

15<br />

1<br />

15<br />

1<br />

15<br />

5<br />

3<br />

5<br />

3<br />

5<br />

3<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

T 1<br />

T 2<br />

T 3<br />

5<br />

5<br />

3<br />

5<br />

3<br />

1<br />

7<br />

4<br />

4<br />

4<br />

5<br />

5<br />

1<br />

3<br />

1<br />

15<br />

1<br />

1<br />

15<br />

3<br />

5<br />

3<br />

3<br />

2<br />

2<br />

2<br />

5<br />

c(T 1) =27<br />

2<br />

c(T2) =26<br />

5<br />

2<br />

c(T 3) =19


5<br />

5<br />

3<br />

3<br />

7<br />

1<br />

4<br />

1<br />

4<br />

5<br />

1<br />

3<br />

4<br />

15<br />

1<br />

15<br />

3<br />

5<br />

c(T) =26<br />

2<br />

2<br />

5<br />

5<br />

3<br />

Intorno 2-scambio <strong>per</strong> <strong>il</strong> TSP<br />

2<br />

2<br />

5<br />

5<br />

3<br />

4<br />

1<br />

4<br />

1<br />

1<br />

1<br />

15<br />

5<br />

3<br />

2<br />

• Soluz. ottima in N(T): T 4<br />

5<br />

3<br />

2<br />

2<br />

2<br />

5<br />

1<br />

7<br />

5<br />

3<br />

4<br />

4<br />

1<br />

3<br />

4<br />

1<br />

3<br />

5<br />

2<br />

2<br />

c(T4) =19<br />

5<br />

2<br />

15<br />

c(T5) =30<br />

3<br />

4


Local Search: intorni esponenziali<br />

• A ogni iterazione <strong>del</strong>l’algoritmo di LS viene risolto un <strong>problema</strong> di<br />

ottimizzazione locale: min {c(T’ ): T’ N(T)}<br />

• Il <strong>problema</strong> di ottimizzazione locale è analogo al <strong>problema</strong> originale, ma<br />

l’insieme di soluzioni ammissib<strong>il</strong>i (intorno) è ristretto.<br />

• Negli esempi visti sin qua, la soluzione <strong>del</strong> <strong>problema</strong> locale può essere<br />

ottenuta efficientemente enumerando le soluzioni ammissib<strong>il</strong>i (poche)<br />

• Idea alternativa: definizione di un intorno “grande” ma tale che <strong>il</strong><br />

<strong>problema</strong> di ottimizzazione locale sia risolvib<strong>il</strong>e efficientemente<br />

• Questo tipo di LS è chiamata Ricerca Locale con intorni esponenziali.<br />

• Consideriamo <strong>il</strong> caso <strong>del</strong>l’intorno ASSIGN <strong>per</strong> <strong>il</strong> TSP.<br />

• Per risolvere <strong>il</strong> <strong>problema</strong> di ottimizzazione associato, dobbiamo introdurre<br />

<strong>il</strong> <strong>problema</strong> <strong>del</strong> matching in grafi bipartiti.


Problema <strong>del</strong> Matching in grafi bipartiti<br />

• Grafo bipartito completo: H (Z,A):<br />

Z = U W A = {(u,w): u U, w W}<br />

Pesi p uw <strong>per</strong> ogni uw A<br />

• Matching: sottoinsieme M A di archi indipendenti (niente nodi in comune)<br />

uw , ij M , uw ij u i, u j, w i, w j<br />

2<br />

1 2 3<br />

3 5 1<br />

4 5 6<br />

Peso Matching M =<br />

1 2 3<br />

4 5 6<br />

p ( M)<br />

p(<br />

e)<br />

e<br />

M<br />

2<br />

1 2 3<br />

3 5 1<br />

4 2<br />

6 3 5<br />

4 5 6<br />

P(M ) = 8 P(M ) = 3<br />

4 2 3 4 2<br />

6 3 5<br />

2 5 1 6 3 5<br />

H (Z,A)


Problema <strong>del</strong> Matching in grafi bipartiti<br />

1<br />

H (Z,A)<br />

2 3<br />

2<br />

3 5 1<br />

4 2<br />

6 3 5<br />

4 5 6<br />

P(M ) = 5<br />

• H (Z,A), Z = U W, |U| = |W|<br />

• Matching <strong>per</strong>fetto M di H:<br />

|M| = |Z/2| = |U| = |W|<br />

Problema Matching Perfetto: trova un matching <strong>per</strong>fetto di peso minimo<br />

• Il <strong>problema</strong> <strong>del</strong> Matching Perfetto di peso (costo) minimo viene ridotto a<br />

<strong>problema</strong> di flusso a costo minimo su un grafo orientato capacitato H’<br />

• H’ è costruito a partire da H orientando gli archi da U a W


Matching Perfetto e flusso a costo minimo<br />

Costruzione H’ = (Z,A’), con capacità c e costi p<br />

1. Orienta gli archi da U a W:<br />

A’ = {(u,w): u U, w W}<br />

2. Associa capacità unitaria c a = 1 a ogni a A’<br />

3. Poni d u = -1 <strong>per</strong> ogni u U<br />

4. Poni d w = 1 <strong>per</strong> ogni w W .<br />

2<br />

H’ = (Z,A’)<br />

1 2 3<br />

3 5 1 4 6<br />

4 5 6<br />

• Ogni Matching Perfetto corrisponde a un flusso intero (0-1) e viceversa.<br />

• Il flusso a costo minimo (con costi p) corrisponde al matching <strong>per</strong>fetto di<br />

peso minimo<br />

• Il <strong>problema</strong> di flusso a costo minimo può essere risolto efficientemente.<br />

3<br />

2<br />

5


Matching e assegnamento<br />

• Il <strong>problema</strong> <strong>del</strong> matching <strong>per</strong>fetto può essere<br />

interpretato come <strong>problema</strong> di assegnamento.<br />

• Dati due insiemi di elementi U e W di uguale<br />

cardinalità<br />

• Dato un costo p uw di assegnare l’elemento u U<br />

all’elemento w W.<br />

• Assegnare ogni elemento di U ad un elemento di W<br />

in modo da minimizzare <strong>il</strong> costo complessivo di<br />

assegnamento.<br />

• Equivalente al <strong>problema</strong> di matching <strong>per</strong>fetto nel<br />

grafo bipartito completo non orientato H (U W,A)<br />

con pesi p uw <strong>per</strong> ogni uw A<br />

2<br />

1 2 3<br />

3 5 1<br />

4 2<br />

6 3 5<br />

4 5 6


Cicli ham<strong>il</strong>toniani e <strong>per</strong>mutazioni<br />

• Ogni Ciclo Ham<strong>il</strong>toniano corrisponde a una <strong>per</strong>mutazione (non unica) dei<br />

vertici, e ogni <strong>per</strong>mutazione corrisponde a un ciclo Ham<strong>il</strong>toniano (unico)<br />

G(V,E)<br />

6<br />

f<br />

e<br />

f<br />

6<br />

e<br />

3<br />

3<br />

3<br />

3<br />

a<br />

2 5<br />

5<br />

d<br />

a<br />

d<br />

7<br />

2 5<br />

5<br />

7<br />

2<br />

3 b<br />

1<br />

6<br />

5<br />

4<br />

7<br />

6<br />

c<br />

2<br />

3<br />

1 b<br />

6<br />

5<br />

4<br />

7<br />

6<br />

c<br />

f<br />

e<br />

f<br />

d<br />

6<br />

5<br />

6<br />

5<br />

a<br />

1<br />

4<br />

d<br />

a<br />

1<br />

4<br />

c<br />

3<br />

b<br />

2<br />

c<br />

b<br />

2<br />

3e<br />

{a, b, c, d, e, f}<br />

{a, b, e, c, d, f}<br />

• Fissato <strong>il</strong> primo elemento nella <strong>per</strong>mutazione (es. a), ogni altro elemento<br />

occupa univocamente una posizione pari oppure dispari<br />

T


Intorno di una <strong>per</strong>mutazione<br />

• Dato un ciclo ham<strong>il</strong>toniamo T definiamo intorno ASSIGN di T<br />

(indicato con N A(T )) come:<br />

NA(T ) = {insieme dei cicli ham<strong>il</strong>toniani ottenuti da T riposizionando<br />

in tutti i modi possib<strong>il</strong>i i nodi in posizioni pari}<br />

f<br />

e<br />

f<br />

e<br />

6<br />

5<br />

a<br />

1<br />

T<br />

4<br />

d<br />

a<br />

d<br />

3<br />

{a, b, c, d, e, f}<br />

b<br />

2<br />

c<br />

b<br />

c<br />

f<br />

e<br />

d<br />

e<br />

6<br />

5<br />

a<br />

1<br />

4<br />

f<br />

a<br />

d<br />

3<br />

b<br />

2<br />

c<br />

b<br />

c<br />

{a, b, e, c, d, f}<br />

b<br />

f<br />

e<br />

e<br />

6<br />

5<br />

a<br />

1<br />

4<br />

f<br />

a<br />

d<br />

3<br />

d<br />

2<br />

c<br />

b<br />

c<br />

{a, d, c, f, e, b}


f<br />

e<br />

Intorno di una <strong>per</strong>mutazione<br />

N A(T ) = {insieme dei cicli ham<strong>il</strong>toniani ottenuti da T riposizionando<br />

in tutti i modi possib<strong>il</strong>i i nodi in posizioni pari}<br />

?<br />

e<br />

6<br />

5<br />

a<br />

d<br />

a<br />

1<br />

4<br />

?<br />

3<br />

b<br />

c<br />

?<br />

2<br />

c<br />

f<br />

e<br />

6<br />

5<br />

a<br />

1<br />

T<br />

4<br />

d<br />

3<br />

b<br />

2<br />

c<br />

T = {v 1 , v 2 , v 3 , v 4 , …, v n}<br />

U= {v 2 , v 4 , v 6, …, v n/2 2}<br />

{2, 4, …, n/2 2} Posizioni libere<br />

# modi diversi di assegnare nodi liberi a<br />

posizioni libere?<br />

= <strong>per</strong>mutazioni di n/2 2 elementi<br />

|N A(T ) | cresce esponenzialmente con n<br />

Nodi liberi


Intorno di una <strong>per</strong>mutazione<br />

• Data una posizione pari, i due nodi adiacenti (posizioni dispari) sono noti .<br />

• Esempio: la posizione 2 è adiacente al nodo a e al nodo c<br />

• Indichiamo con p vi <strong>il</strong> costo di inserimento di un nodo<br />

“libero” v in una posizione “libera” i.<br />

• Quanto costa inserire <strong>il</strong> nodo b in posizione 2?<br />

p b2 = c ab + c bc = 2 + 5 = 7<br />

a ? c<br />

1 2 3<br />

• Quanto costa inserire <strong>il</strong> nodo d in posizione 2?<br />

p d2 = c ad + c dc = 7 + 6 = 13<br />

a ? c<br />

1 2 3<br />

2 5<br />

a b c<br />

1 2 3<br />

7 6<br />

a d c<br />

1 2 3<br />

• Quanto costa inserire <strong>il</strong> nodo b in posizione 4?<br />

p b4 = c ad + c dc = 5 + 1 = 6<br />

6<br />

f<br />

e<br />

3<br />

?<br />

e<br />

3<br />

6<br />

5<br />

a<br />

d<br />

a<br />

1<br />

4<br />

?<br />

2 5<br />

5<br />

7<br />

3<br />

?<br />

2<br />

c<br />

c<br />

2<br />

3 b<br />

1<br />

6<br />

5<br />

4<br />

7<br />

6<br />

c ? e<br />

3 4 5<br />

5 1<br />

c b e<br />

3 4 5


Ottimizzare nell’intorno<br />

• Sia U l’insieme dei nodi liberi (quelli in posizione pari) di T<br />

• Sia W l’insieme <strong>del</strong>le posizioni pari di T.<br />

• Per ogni v U e ogni i W calcoliamo <strong>il</strong> costo p vi di assegnare <strong>il</strong> nodo v<br />

alla posizione i.<br />

• Sia u <strong>il</strong> nodo in posizione i-1 e z <strong>il</strong> nodo in posizione i+1 (mod |V|), allora<br />

pvi = cuv + cvz. • Trovare la soluzione ottima in NA(T ) equivale a risolvere <strong>il</strong> seguente<br />

• Problema: assegnare ogni nodo v U ad esattamente una posizione i W<br />

in modo da minimizzare <strong>il</strong> costo complessivo <strong>del</strong>l’assegnamento<br />

• Equivalente al <strong>problema</strong> di matching <strong>per</strong>fetto sul grafo bipartito completo<br />

H (U W,A) con pesi p uw <strong>per</strong> ogni uw A


G(V,E)<br />

7<br />

6<br />

f<br />

e<br />

3<br />

3<br />

Cicli ham<strong>il</strong>toniani e <strong>per</strong>mutazioni<br />

a<br />

2 5<br />

5<br />

7<br />

d<br />

2<br />

3 b<br />

1<br />

6<br />

5<br />

4<br />

7<br />

6<br />

b d f<br />

13 7 6<br />

c<br />

f<br />

e<br />

9 10<br />

10 3 9<br />

2 4 6<br />

6<br />

5<br />

T<br />

M * = {b6, d4, f2} p(M * ) = 19<br />

1<br />

a<br />

1<br />

4<br />

d<br />

b<br />

e<br />

3<br />

b<br />

2<br />

c<br />

2 a 3<br />

6<br />

1<br />

f<br />

2<br />

5<br />

3<br />

T *<br />

4<br />

d<br />

U= {b, d, f}<br />

3<br />

W= {2, 4, 6}<br />

6<br />

c(T) = 25<br />

c<br />

4<br />

c(T * ) = 19


Qualità <strong>del</strong>le soluzioni euristiche<br />

• Gli algoritmi euristici cercano buone soluzioni ammissib<strong>il</strong>i <strong>per</strong> un<br />

<strong>problema</strong> di ottimizzazione (Q) : min {c(F): F S } = v(Q)<br />

• Come definire la qualità <strong>del</strong>la soluzione prodotta da un algoritmo?<br />

• Sia A un algoritmo <strong>per</strong> (Q) che produce la soluzione F S<br />

• Diciamo che A è un algoritmo che garantisce un’approssimazione<br />

(l’algoritmo A è -approssimato) se<br />

c(F) v(Q)<br />

• Illustreremo un algoritmo 2-approssimato <strong>per</strong> <strong>il</strong> TSP metrico


Il TSP metrico<br />

• Grafo G(V,E) non orientato, completo<br />

• c uv 0 costo arco uv E<br />

• c 0 è una (semi)metrica, ovvero soddisfa la disuguaglianza triangolare:<br />

5<br />

5<br />

<strong>per</strong> ogni tripla di nodi distinti u, v, z, si ha che<br />

2<br />

2<br />

4<br />

3<br />

1<br />

3<br />

4<br />

c uv c uz + c zv (disuguaglianza triangolare)<br />

4<br />

3<br />

5<br />

6<br />

2<br />

2<br />

u<br />

c uv<br />

c uz z<br />

• Trova <strong>il</strong> ciclo Ham<strong>il</strong>toniano di costo minimo in<br />

G(V,E) con vettore dei costi c semimetrica<br />

v<br />

c zv


Cicli euleriani<br />

• Per descrivere l’euristica 2-approssimata di Christofides <strong>per</strong> <strong>il</strong> TSP<br />

metrico dobbiamo introdurre <strong>il</strong> concetto di ciclo eureliano<br />

Dato un (multi)grafo non orientato, si definisce Ciclo Eureliano un<br />

walk chiuso che passa esattamente una volta <strong>per</strong> ogni arco.<br />

1<br />

2<br />

3<br />

5<br />

4<br />

1 5 4 3<br />

Teorema di Eulero. Un (multi)grafo ammette un ciclo eurleriano se<br />

e solo se è connesso e ogni nodo ha grado pari.<br />

Un (multi) grafo connesso e con ogni nodo di grado pari è<br />

detto grafo euleriano.<br />

5<br />

4<br />

1<br />

2


L’algoritmo di Christofides<br />

L’agoritmo di Christofides<br />

• Grafo G(V,E) non orientato, completo, con costi c semimetrica<br />

• L’algoritmo di Christofides trova un ciclo ham<strong>il</strong>toniano di costo al più<br />

doppio rispetto al ciclo di costo minimo<br />

1. Trova <strong>il</strong> minimo albero ricoprente T di G.<br />

2. Raddoppia ogni arco di T ottenenendo un grafo euleriano<br />

3. Costruisci un ciclo euleriano T di questo grafo<br />

4. Scegli un nodo iniziale u in T e visita T a partire da u<br />

5. Costruisci una <strong>per</strong>mutazione dei nodi V sequenziando i nodi<br />

nell’ordine <strong>del</strong>la loro prima apparizione in T nella visita<br />

6. Restituisci <strong>il</strong> ciclo ham<strong>il</strong>toniano H associato a


5<br />

5<br />

G(V,E)<br />

2<br />

2<br />

4<br />

3<br />

1<br />

3<br />

4<br />

4<br />

3<br />

5<br />

6<br />

2. Raddoppia ogni arco di T<br />

ottenenendo un grafo euleriano<br />

5<br />

2<br />

2<br />

2<br />

2<br />

1<br />

3<br />

3<br />

3<br />

3<br />

3<br />

2<br />

2<br />

2<br />

4<br />

Esempio<br />

1. Trova <strong>il</strong> minimo albero ricoprente T di G.<br />

5<br />

5<br />

2<br />

2<br />

4<br />

3<br />

1<br />

3<br />

4<br />

4<br />

3<br />

T<br />

5<br />

6<br />

2<br />

2<br />

4<br />

3 3<br />

1<br />

2<br />

1<br />

2<br />

5<br />

3<br />

5 2<br />

2 3<br />

3<br />

2<br />

5<br />

5<br />

T<br />

3. Costruisci un ciclo euleriano T<br />

<strong>del</strong> grafo euleriano<br />

2<br />

2<br />

3<br />

1<br />

3<br />

3<br />

2<br />

4


Esempio<br />

4. Scegli un nodo iniziale u in T e visita T a partire da u<br />

5. Costruisci una <strong>per</strong>mutazione dei nodi V sequenziando i nodi nell’ordine<br />

<strong>del</strong>la loro prima apparizione in T nella visita<br />

4<br />

3 3<br />

1<br />

2<br />

1<br />

2<br />

T Permutazione associata = {1,5, 2, 3, 4}<br />

5<br />

3<br />

5 2<br />

2 3<br />

3<br />

2<br />

5<br />

Sequenza di visita di T : {1,5, 2, 5, 3, 5, 1, 4}<br />

6. Ciclo ham<strong>il</strong>toniano<br />

associato a<br />

5<br />

5<br />

2<br />

2<br />

4<br />

3<br />

1<br />

3<br />

4<br />

4<br />

3<br />

5<br />

6<br />

2<br />

2


T<br />

5<br />

5<br />

2<br />

2<br />

4<br />

4<br />

3 3<br />

1<br />

2<br />

3<br />

1<br />

3<br />

4<br />

4<br />

1<br />

2<br />

5<br />

3<br />

5 2<br />

2 3<br />

3<br />

2<br />

5<br />

3<br />

5<br />

6<br />

2<br />

2<br />

Scorciatoie<br />

Sequenza di visita di T : {1,5, 2, 5, 3, 5, 1, 4}<br />

Permutazione associata = {1,5, 2, 3, 4}<br />

6. Ciclo ham<strong>il</strong>toniano H associato a<br />

4<br />

3 3<br />

1<br />

2<br />

1<br />

2<br />

5<br />

3<br />

5 2<br />

2 3<br />

3<br />

2<br />

5<br />

H è ottenuto da T sostituendo<br />

cammini con archi<br />

Poiché c soddisfa la<br />

disuguaglianza triangolare si ha<br />

c(H ) c(T)


5<br />

5<br />

2<br />

2<br />

4<br />

3<br />

1<br />

3<br />

4<br />

4<br />

3<br />

5<br />

6<br />

2<br />

2<br />

Esempio<br />

Th. 9.1 Sia H * <strong>il</strong> ciclo ham<strong>il</strong>toniano di costo minimo, e sia T * l’albero<br />

ricoprente di G di costo minimo. Allora c(H * ) c(T * ).<br />

Sia P <strong>il</strong> cammino semplice ottenuto<br />

da H * rimuovendo un arco.<br />

P c(H * ) c(P) (costi non negativi)<br />

P cammino P albero<br />

P contiene tutti i nodi di G P albero ricoprente<br />

P albero ricoprente, T * albero ricoprente a costo minimo c(P) c(T * )<br />

c(H * ) c(P) c(H * ) c(T * )


Esempio<br />

Th. 9.2 Sia H * <strong>il</strong> ciclo ham<strong>il</strong>toniano di costo minimo, e sia H <strong>il</strong> ciclo<br />

ritornato dall’algoritmo di Christofides. Allora c(H) 2c(H * ).<br />

T ottenuto dall’albero ricoprente di<br />

costo minimo T * raddoppiando gli archi<br />

H ottenuto dal ciclo euleriano T<br />

sostituendo cammini con archi<br />

Dal Teorema 9.1<br />

c(H) 2c(T * ) 2c(H * )<br />

c(T * ) c(H * )<br />

c(T) = 2c(T * ).<br />

c(H) c(T) = 2c(T * )

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

Saved successfully!

Ooh no, something went wrong!