Euristiche per il problema del commesso viaggiatore
Euristiche per il problema del commesso viaggiatore
Euristiche per il problema del commesso viaggiatore
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 * )