Algoritmi e Strutture Dati
Algoritmi di Approssimazione
Giuseppe Persiano
Dipartimento di Informatica ed Appl. Renato M. Capocelli
Università di Salerno
Indice
Capitolo 1. Algoritmi di Approssimazione
1. Problemi di Ottimizzazione
2. Vertex cover
3. MaxCut
4. Set cover
5. TSP
6. MaxSAT
7. Vertex Cover pesato
8. Zaino 0/1
9. Minimo makespan
10. Primale Duale
11. Esercizi
5
5
6
8
9
9
9
12
13
15
18
18
Capitolo 2. Algoritmi On-Line
1. Il problema dello sciatore
2. Ritrovare l’auto
3. Gestione online di liste
21
21
22
22
Bibliografia
25
3
4
INDICE
Sommario1
Questo documento contiene note per il secondo corso di Algoritmi e Strutture Dati che
l’autore tiene presso la Facoltà di Scienze dell’Università di Salerno.
La versione aggiornata di questo documento si trova http://libeccio.dia.unisa.it/ASDnote/apx.pdf.
1
Piacere! Mi chiamo Francesco.
CAPITOLO 1
Algoritmi di Approssimazione
1. Problemi di Ottimizzazione
Iniziamo con il definire un problema di approssimazione.
Definizione 1.1. Un problema di ottimizzazione Π è una quadrupla Π = (I, S, µ, Goal)
where
(1) I è un insieme di istanze;
(2) per ogni istanza I, S(I) è l’insieme delle soluzioni ammissibili per I;
(3) per ogni soluzione ammissibile S dell’istanza I, µ(I, S) è la misura della soluzione S.
(4) Goal∈ {min,MAX}.
Definiamo inoltre, per un’istanza I, Opt(I) nel modo seguente
Opt(I) = GoalS∈S(I) µ(I, S).
Se Goal=min diciamo che Π è un problema di minimizzazione e la misura µ di una soluzione
ammissible S è anche chiamata costo di S ed indicato con cost(I, S). Se invece Goal=MAX
diciamo che Π è un problema di massimizzazione e la misura µ di una soluzione ammissible S
è anche chiamata valore di S ed è indicato con val(I, S).
Diciamo che un algoritmo A risolve un problema di ottimizzazione Π se, per ogni istanza
I di Π, A(I) è una soluzione ammissibile per I ed inoltre
µ(I, A(I)) = Opt(I).
In queste note studieremo algoritmi che approssimano problemi di ottimizzazione nel senso che
danno in output soluzioni ammissibili la cui misura non si discosta troppo da Opt.
Definizione 1.2 (Min). Sia Π un problema di minimizazzione. L’algoritmo A k-approssima
Π se per ogni istanza I di Π
(1) A(I) ∈ S(I);
(2) cost(I, A(I)) ≤ k · Opt(I).
Definizione 1.3 (Max). Sia Π un problema di massimizazzione. L’algoritmo A k-approssima
Π se per ogni istanza I di Π
(1) A(I) ∈ S(I);
(2) val(I, A(I)) ≥ Opt(I) .
k
1.1. Problemi di decisione e di ottimizzazione. Nella prima parte abbiamo studiato
la complessità computazionale id problemi di decisione in cui il compito dell’algoritmo è di decidere se l’input x appartiene al linguaggio L. Un problema di minimizzazione Π = (I, S, µ, min)
5
6
1. ALGORITMI DI APPROSSIMAZIONE
può essere naturalmente associato ad un problema di decisione LΠ definito nel modo seguente
LΠ = {(I, k) : ∃S ∈ S(I) tale che µ(S) ≤ k}.
Una simile definizione può essere data per problemi di massimizzazione. Il seguente teorema è
immediato.
Teorema 1.4. Sia Π un problema di ottimizzazione per cui è possibile decidere in tempo
polinomiale se una soluzione S è ammissibile per un’istanza I e la funzione µ è calcolabile in
tempo polinomiale. Allora LΠ ∈ NP.
In queste note studieremo algoritmi di approssimazione per problemi di ottimizzazione Π
il cui associato linguaggio LΠ è NP − COMPLETE. Abbiamo il seguente teorema.
Teorema 1.5. Sia Π un problema di ottimizzazione per cui LΠ ∈ NP − COMPLETE e per
cui esiste un algoritmo polinomiale che risolve Π. Allora P = NP.
2. Vertex cover
In questo capitolo analiziamo la performance di alcuni algoritmi per il problema del vertex
cover. Come vedremo nessuno di questi algoritmi riesce ad approssimare il problema del vertex
cover a meno di 2. Un algoritmo che ottiene esattamente 2 può essere trovato in [1].
2.1. Definizione del problema. Il problema di ottimizzazione Vertex Cover è cosi definito.
Istanze: Un’istanza del problema del vertex cover è costituita da un grafo non diretto
G = (V, E).
Soluzioni Ammissibili: Un soluzione ammissibile per G = (V, E) è un sottoinsieme
C ⊆ V dei vertici tali che per ogni arco (u, v) ∈ E abbiamo che u ∈ C oppure v ∈ C.
Misura di una soluzione ammissibile.: La misura di una soluzione ammissibile C è
la sua cardinalità |C|.
Goal: Minimizzare.
In altre parole il problema di ottimizzazione del vertex cover consiste nel coprire tutti gli archi
di G usando il minor numero possibile di vertici.
2.2. Un algoritmo 2 approssimato. Vedi [1].
2.3. Algoritmo greedy. Consideriamo il seguente algoritmo.
Greedy(G)
01. A ← ∅;
02. while E 6= ∅ do
03.
Scegli arbitrariamente un vertice v di G che ha almeno un arco;
04.
A ← A ∪ {v};
05.
E ← E \ {e ∈ E|e = (u, v) per qualche vertice u};
06. end ;
07. return A;
2. VERTEX COVER
7
È facile convincersi che l’algortimo Greedy restituisce sempre un vertex cover di G.
Mostriamo ora che esiste un grafo di n vertici ed una scelta dei vertici al passo 03. per cui
l’algoritmo Greedy calcola un vertex cover di cardinalità Ω(n) volte il vertex cover ottimo.
Consideriamo il grafo stella Sn con n vertici; l’insieme di vertici di Sn consiste dei vertici
(v, u1 , · · · , un−1 ) e Sn contiene gli archi (v, ui ) per i = 1, · · · , n − 1. Se al passo 03 sono scelti i
vertici u1 , · · · , un−1 , l’algoritmo Greedy restituisce un vertex cover di cardinalità n−1 mentre
il vertice v da solo costituisce un vertex cover.
2.4. Analisi dell’euristica del prof. Nixon. Questa sezione presenta una differente
euristica per il calcolo del vertex cover. L’euristica è attribuita (scherzosamente) a tale professor
Nixon da [1]. Risponderemo ad un quesito di [1] che chiede un esempio in cui l’euristica
di Nixon costruisce un vertex cover di taglia maggiore del doppio del vertex cover ottimo.
Mostreremo poi un altro esempio in cui l’euristica del professor Nixon restituisce un vertex
cover di taglia Ω(log n) volte il vertex cover ottimo.
Il professor Nixon propone la seguente euristica per approssimare il problem del vertex
cover su un grafo G = (V, E).
Nixon(G = (V, E))
1. A = ∅;
2. while E 6= ∅
3.
sia u vertice di grado massimo in (V, E);
4.
E ← E \ {archi incidenti a u};
5.
V = V \ {u};
6.
A = A ∪ {u};
7. endwhile;
8. return A;
Primo controesempio. Mostreremo ora un grafo G su cui l’algoritmo Nixon restituisce
un vertex cover di taglia maggiore del doppio dell’ottimo. Quindi l’algoritmo Nixon ha una
garanzia di approssimazione peggiore dell’algoritmo presentato a lezione.
Il grafo G = (V1 ∪ V2 , E) è un grafo bipartito. L’insieme V1 consiste di 8 vertici v1 , · · · , v8
di grado 6. L’insieme V2 è l’unione (disgiunta) di 4 insiemi: A, B, C e D. L’insieme A consiste
di 3 vertici a1 , a2 , a3 di grado 8, l’insieme B consiste di 2 vertici b1 , b2 di grado 4, l’insieme C
consiste di 4 vertici c1 , c2 , c3 , c4 di grado 2, l’insieme D consiste di 8 vertici d1 , · · · , d8 di grado
1.
Gli archi di G sono come segue:
(1) ogni vertice di V1 ha un arco ad ogni vertice di A;
(2) vertici v1 , · · · , v4 hanno ciascuno un arco incidente a b1 ; vertici v5 , · · · , v8 invece hanno
ciascuno un arco incidente a b2 ;
(3) vertici v1 e v2 hanno un arco a c1 ; vertici v3 e v4 hanno un arco a c2 ; vertici v5 e v6
hanno un arco a c3 ; vertici v7 e v8 hanno un arco a c4 .
(4) per i = 1, · · · , 8 il vertice vi ha una arco a di .
L’algoritmo Nixon sceglie i vertici nel modo seguente.
(1) i 3 vertici di A che hanno grado 8 mentre gli atri vertici hanno tutti grado al più 6.
Dopo l’eliminazione dei vertici di A, i vertici di V1 hanno grado 6 − 3 = 3;
8
1. ALGORITMI DI APPROSSIMAZIONE
(2) i 2 vertici di B che hanno grado 4 mentre tutti gli altri hanno grado al più 3. Dopo
l’eliminazione dei vertici di B, i vertici di V1 hanno grado 2;
(3) i 4 vertici di C che hanno grado 2. Tutti gli altri vertici ancora presenti nel grafo
hanno o grado 2 (i vertici di V1 ) o grado 1 (i vertici di D);
(4) a questo punto il grafo consiste di 8 coppie di vertici di grado 1; l’algoritmo per
terminare ne sceglie 8;
Quindi l’algoritmo Nixon restituisce un vertex cover di cardinalità 17. È facile convincersi che
gli 8 vertici di V1 costituiscono un vertex cover.
Secondo controesempio. Consideriamo il grafo bipartito B(L, R, E). L’insieme L consiste
di r vertici. L’insieme R è suddiviso in r insiemi R1 , · · · , Rr . Ogni vertice in Ri ha un arco
verso i vertici di L e due vertici di Ri non hanno archi verso lo stesso vertice di L. Pertanto
l’insieme Ri contiene br/ic vertici. L’insieme R ha quindi
r
X
i=1
br/ic = Θ(r log r)
vertici. Il numero di vertice n è Θ(r log r).
Se l’algoritmo Greedy considera i vertici di R a partire dai vertici di Rr fino a i vertici di
R1 , il cover calcolato coincide con R ed ha cardinalità Θ(r log r). Osserviamo invece che L è
un cover ed ha cardinalità r. Quindi |R|/|L| = Ω(log r) = Ω(log n).
3. MaxCut
Il problema MaxCut è definito come segue.
Istanze: Un’istanza del problema MaxCut è costituita da un grafo non diretto G =
(V, E).
Soluzioni Ammissibili: Un soluzione ammissibile per G = (V, E) è una partizione di
V in due sottoinsiemi S1 e S2 tali che S1 ∪ S2 = V e S1 ∩ S2 = ∅.
Misura di una soluzione ammissibile: La misura di una soluzione ammissibile c(S1 , S2 )
è il numero di archi che hanno un estremo in S1 e l’altro in S2 .
Goal: Massimizzare.
Osserviamo che il problema di minimizzazione è risolvibile in tempo polinomiale.
L’algoritmo che presentiamo consiste nel partire da una qualsiasi partizione S 1 ed S2 e
controllare se esiste un vertice x ∈ S1 tale che c(S1 \ {x}, S2 ∪ {x}) > c(S1 , S2 ) nel qual caso
si aggiorna la soluzione corrente a (S1 \ {x}, S2 ∪ {x}) oppure se esiste un vertice x ∈ S2
tale che c(S1 ∪ {x}, S2 \ {x}) > c(S1 , S2 ). nel qual caso si aggiorna la soluzione corrente a
(S1 ∪ {x}, S2 \ {x}). Se invece nessun vertice esiste x l’algoritmo si ferma e dà in output la
soluzione corrente (S1 , S2 ).
Abbiamo il seguente teorema.
Teorema 1.6. Esiste un algoritmo polinomiale che 2-approssima MaxCut.
Dimostrazione. Osserviamo che per ogni (S1 , S2 ) abbiamo che c(S1 , S2 ) ≤ |E| e poiché
ad ogni iterazione il valore di c(S1 , S2 ) è incrementato di almeno 1 l’algoritmo effettua al più
|E| iterazioni ed è pertanto polinomiale.
6. MaxSAT
9
Osserviamo che nella soluzione data in output dall’algoritmo per ogni vertice x almeno
metà dei suoi vicini appartengono all’altro sottoinsieme. Pertanto, se denotiamo con d x il
grado del vertice x, abbiamo che
X dx
2 · c(S1 , S2 ) ≥
2
x
= |E|
Il teorema segue dall’osservazione che Opt ≤ |E|.
4. Set cover
Vedi [1].
5. TSP
5.1. Definizione. Vedi [1].
5.2. Approssimabilità del caso generale. Vedi [1].
5.3. Algoritmo 2 approssimato per il caso euclideo. Vedi [1].
5.4. Algoritmo 3/2 approssimato per il caso euclideo.
6. MaxSAT
In questo capitolo discutiamo algoritmi di approssimazione per MaxSat. L’esposizione è
basata su [2].
6.1. Ripasso di calcolo delle probabilità. Useremo la seguente proprietà della media
di una variabile casuale
(1) Se E[X] ≥ µ allora esiste almeno un risultato r tale che X(r) ≥ µ.
6.2. Definizione. Il problema MaxSAT consiste nel calcolare, avendo in input una formula Φ in forma congiuntiva normale Φ = C1 ∧ · · · ∧ Cm sulle variabili x1 , · · · , xn , il numero
massimo di clausole che possono essere simultaneamente soddisfatte da un assegnamento di
verità. Ovviamente se esiste un algoritmo che risolve MaxSAT allora P=NP.
6.3. Esiste sempre un assegnamento buono. Supponiamo di scegliere un assegnamento casuale assegnando alla variabile xi il valore VERO con probabilità 1/2. È facile vedere
def
che la probabilità che una clausola con k letterali sia soddisfatta è α k = 1 − 2−k . Definiamo
quindi la variabile casuale X Φ come la variabile casuale che conta il numero di clausole di Φ soddisfatte da un assegnamento casuale. Definiamo inoltre la variabile casuale X iΦ , i = 1, · · · , m,
nel modo seguente
(
1, se Ci soddisfatta;
XiΦ =
0, altrimenti;
10
1. ALGORITMI DI APPROSSIMAZIONE
ed abbiamo che E[XiΦ ] = αk . Quindi il numero medio E(X Φ ) di clausole di Φ soddisfatte da
un assegnamento casuale è dato da
"m
#
X
X
Φ
E
Xi =
αl m l
i=1
l
ove ml denota il numero di clausole con l letterali. Poichè αl ≥ 1/2 possiamo concludere che il
numero medio di clausole soddisfatte è almeno m/2 e quindi, per la proprietà della media nel
Paragrafo 6.1, esiste sempre un assegnamento di verità che soddisfa almeno metà delle clausole.
Notiamo che la qualità dell’approssimazione cresce con il numero di letterali che compaiono
in una clausola. Se ogni clausola ha almeno due letterali abbiamo che per l ≥ 2, α l ≥ 3/4 e
possiamo quindi concludere che esiste sempre un assegnamento che soddisfa almeno 3/4 delle
clausole. Se tutte le clausole invece hanno almeno 3 letterali allora possiamo concludere che
esiste almemo un assegnamento che soddisfa almeno 7/8 delle clausole.
6.4. Cerchiamo un assegnamento buono. In questa sezione mostriamo come riusciamo a trovare un assegnamento che soddisfi almeno 1/2m delle m clausole della formula Φ.
Poiché l’assegnamento che soddisfa il maggior numero di clausole non ne soddisfa più di m,
abbiamo un algoritmo che 1/2-approssima MaxSAT.
Calcoliamo un assegnamento una variabile per volta partendo da x1 usando il metodo
delle medie condizionate. Consideriamo le formule Φ(x1 = 1) e Φ(x1 = 0) ottenendo ponendo
x1 = 1 e x1 = 0 nella formula Φ. Assegnamo quindi alla variabile x1 il valore b che massimizza
E(X Φ |x1 = b). Osserviamo che siccome E(X Φ ) = 12 (E(X Φ |x1 = 1) + E(X Φ |x1 = 0) e poiché
E(X Φ ) ≥ 1/2 abbiamo che E(X Φ |x1 = b) ≥ 1/2. Il valore di x2 è determinato allo stesso
modo considerando la formula Φ(x1 = b) invece che la formula Φ e cosı̀ via.
Abbiamo quindi il seguente teorema.
Teorema 1.7. Esiste un algoritmo polinomiale che 1/2 approssima MaxSAT.
6.5. Programmazione lineare. MaxSAT può essere formulato come il seguente problema di programmazione lineare intera.
P
max W = m
j=1 zj
con vincoli
P
P
j = 1, · · · , m
i∈I + yi +
i∈I − (1 − yi ) ≥ zj
j
yi ∈ {0, 1}
0 ≤ zj ≤ 1
j
i = 1, · · · , n
j = 1, · · · , m
dove abbiamo indicato con Ij+ l’insieme delle variabili che compaiono in forma non negata nella
clausola Cj e con Ij− le variabili che compaiono in forma negata. Per ogni assegnamento di
verità (x1 , · · · , xn ) alle variabili della formula Φ il problema ha come valore massimo il numero
delle clausole soddisfatte. Infatti la soluzione che assegna a yi il valore di verità della varibaile
xi e a zj assegna 1 se la j-esima clausola è soddisfatta e 0 altrimenti è ammissibile ed ottima.
Denotiamo con ZI∗ il valore del problema intero e con ZL∗ il valore del problema che si
ottiene rilassando il vincolo di interezza sulle variabili yi . Ovviamente, ZL? ≥ ZI? = Opt.
Consideriamo quindi il seguente semplice algoritmo
Passo 1.: Risolvere il problema rilassato ottendo soluzione (y ? , z ? ).
6. MaxSAT
11
Passo 2.: Applicare il metodo della sezione precedente usando yi∗ come probabilità di
porre a VERO la variabile xi .
Lemma 1.8. Se per una la soluzione ottima (y ∗ , z ∗ ) al problema lineare rilassato vale che
per ogni clausola Cj
1 − Πi∈I + (1 − yi? ) · Πi∈I − yi? ≥ αzj?
j
j
allora
E[X Φ ] ≥ αZI? .
P
Dimostrazione. Abbiamo che E[X Φ ] = m
j=1 Pr(zj = 1). La variabile zj ha valore 0 se
e solo se tutte le varibaili che compaiono nella j-esima clausola in forma non negata hanno
valore falso (evento con probabilità Πi∈I + (1 − yi? )) e tutti le variabile che compaiono in forma
j
negata hanno valore vero (evento con probabilità Πi∈I − yi? ). Pertanto abbiamo che
j
Φ
E[X ] =
m X
j=1
Πi∈I + (1 −
j
yi? )
·
Πi∈I − yi?
j
≥
m
X
j=1
αzj∗ = αZL? ≥ αZI? .
Quindi se l’ipotesi del teorema è soddisfatta l’algoritmo descritto garantisce una α-approssimazione.
Per il prossimo lemma usiamo la seguente ben nota diseguaglianza tra la media geometrica e
la media aritmentica di una sequenza (a1 , · · · , ak ) di numeri non negativi
√
a1 + a 2 + · · · + a k
≥ k a1 · · · ak .
k
Lemma 1.9. Per ogni soluzione ammissibile (y, z) del problema lineare rilassato e per ogni
clausola Cj con k letterali abbiamo
1 − Πi∈I + (1 − yi ) · Πi∈I − yi ≥ βk zj
j
con
j
1
βk = 1 − 1 −
k
k
.
Dimostrazione. Supponiamo che la clausola Cj contenga solo letterali in forma non negata. Se xi appare in forma negata in Cj allora basta sostituire xi con x̄i e viceversa in tutte le
clausole della formula e yi con 1−yi ed ottenere una formula ed un problema lineare equivalenti.
Inoltre possiamo assumere che la clausola Cj contenga le variabile x1 , · · · , xk .
P
Se (y, z) è una soluzione ammissibile allora il problema lineare comprende il vincolo ki=1 yi ≥
zj . Quindi
!k
Pk
k
i=1 (1 − yi )
1 − Πi=1 (1 − yi ) ≥ 1 −
k
!k
Pk
i=1 yi
= 1− 1−
k
zj k
≥ 1− 1−
.
k
12
1. ALGORITMI DI APPROSSIMAZIONE
Osserviamo ora che la funzione
zj k
f (zj ) = 1 − 1 −
k
è concava e poichè f (0) = 0 e f (1) = βk abbiamo che, per ogni 0 ≤ zj ≤ 1, f (zj ) ≥ βk zj .
Abbiamo quindi il seguente teorema.
Teorema 1.10. Esiste un algoritmo che 1 −
1
e
≈ .63099... approssima MaxSAT.
Dimostrazione. Per il Lemma 1.8 e il Lemma 1.9 abbiamo che se la formula contiene clausole ciascuna con almeno k letterali allora esiste un assegnamento che soddisfa almeno β k Opt
clausole. Poiché per ogni k abbiamo che βk < 1 − 1e per ogni formula esiste un assegnamento
che soddisfa almeno (1 − 1e )Opt clausole. Usando il metodo delle medie condizionate possiamo
in tempo polinomiale calcolare un assegnamento che soddisfa (1 − 1e )Opt clausole.
6.6. Un algoritmo 3/4-approssimato. Combiniamo i due algoritmi nel modo seguente.
Scegliamo b ← {0, 1} a caso. Se b = 0 eseguiamo l’algoritmo del Teorema 1.7. Se b = 1
eseguiamo l’algoritmo del Teorema 1.10.
Calcoliamo per la clausola Cj che ha kj letterali la probabilità pj che Cj sia soddisfatta.
Denotiamo con (y ? , z ? ) la soluzione ottima al problema di programmazione lineare. Sappiamo
che se b = 0 allora la probabilità che Cj sia soddisfatta è αkj ≥ αkj zj? (poiché zj? ≤ 1). Se
invece b = 1 allora la probabilità che Cj sia soddisfatta è βkj zj? . Quindi
E[X Φ ] ≥
m
X
α kj + β kj ?
zj
2
j=1
e siccome αk + βk ≥ 3/2 per ogni k abbiamo che E[X Φ ] ≥ 3/4zj? . Questo dimostra che esiste
un assegnamento che soddisfa almeno 3/4m clausole.
Consideriamo quindi il seguente algoritmo: calcoliamo assegnamenti t1 e t2 usando rispettivamente l’algoritmo 1/2 approssimato e l’algoritmo 1 − 1e approssimato. Diamo in output
l’assegnamento ta con a ∈ {1, 2} che soddisfa il maggior numero di clausole. Siccome sappiamo
che se scegliamo uno dei due assegnamenti a caso sono soddisfatte in media 3/4m clausole,
allora ta soddisfa almeno 3/4m clausole.
7. Vertex Cover pesato
Il problema del vertex cover pesato è definito nel modo seguente. Un’istanza consiste di
un grafo G = (V, E) in cui ad ogni vertice v è associato un peso w(v) > 0. Una soluzione
ammissibile è un sottoinsieme S ⊆ V dei vertici tale che perP
ogni arco (u, v) ∈ E uno tra u e
v appartiene ad S. Il costo di una soluzione S è la somma v∈S w(v) dei pesi dei vertici di
S. L’obiettivo è di minimizzare il costo. Questo problema puó essere scritto sotto forma di
problema di programmazione lineare intera nel modo seguente.
P
min v∈V x(v) · w(v)
con vincoli
x(u) + x(v) ≥ 1
∀(u, v) ∈ E
x(v) ∈ {0, 1}
∀v ∈ V
8. ZAINO 0/1
13
Denotiamo con Opt(G, w) il valore dell’ottimo del problema di programmazione lineare intera
per l’istanza (G, w) e con L(G, w) il valore del problema di programmazione lineare ottenuto
rilassando il vincolo di interezza x(v) ∈ {0, 1} al vincolo 0 ≤ x(v) ≤ 1 e sia x ? una soluzione
che ottiene L(G, w). Partendo da x? costruiamo il vettore x nel modo seguente
(
1, se x? (v) ≥ 1/2;
x(v) =
0, altrimenti;
e sia S l’insieme dei vertici v per cui x(v) = 1. Osserviamo che S è una soluzione ammissibile.
Infatti siccome x? è una soluzione ammissibile abbiamo che per ogni arco (u, v) abbiamo
x? (u) + x? (v) ≥ 1 e quindi o x? (u) ≥ 1/2 (e quindi x(u) = 1) oppure x? (v) ≥ 1/2 (e quindi
x(v) = 1).
Calcoliamo il peso di S.
X
X
x(u)w(u) ≤
2x? (u)w(u) = 2L(G, w) ≤ 2Opt(G, w).
u∈V
u∈V
Quindi abbiamo il seguente teorema.
Teorema 1.11. Esiste un algoritmo polinomiale 2-approssimante per il problema del vertex
cover pesato.
8. Zaino 0/1
Un’istanza I del problema dello zaino 0/1 è costituita da n oggetti e da una capacità massima B. L’i-esimo oggetto ha peso (volume) ci e valore (prezzo) vi . Lo scopo è di individuare
il sottoinsieme di prezzo massimo tra quelli che hanno volume complessivo non maggiore di B.
Formalmente, una soluzione ammissibile per un’istanza I = ((v1 , · · · , vn ), (c1 , · · · , cn ), B)
è costituita da una sequenza S = (b1 , · · · , bn ) ∈ {0, 1}n tale che
n
X
i=1
bi · ci ≤ B.
Il nostro compito è quello di trovare, tra tutte le soluzioni ammissibili per un’istanza I, una
soluzione S ∗ = (b∗1 , · · · , b∗n ) che massimizzi il profitto V al(S ∗ , I) di S ∗ definito come
V al(S ∗ , I) =
n
X
i=1
b∗i · vi .
8.1. Hardness dell’approssimazione. In questa sezione proviamo che, se P 6= NP, nessun algoritmo polinomiale A può risolvere il problema dello zaino garantendo un’approssimazione assoluta costante; cioè tale che per una costante k e per ogni istanza I, Opt(I) − A(I) ≤
k.
Teorema 1.12. Se P 6= NP allora per ogni costante k, nessun algoritmo polinomiale A
può risolvere il problema dello zaino garantendo Opt(I) − A(I) ≤ k.
Dimostrazione. Supponiamo per assurdo che l’algoritmo polinomiale A sia tale che, per
ogni istanza I, Opt(I) − A(I) ≤ k. Costruiamo un altro algoritmo A 0 che risolve il problema
dello zaino in tempo polinomiale, contradicendo l’ipotesi che P 6= NP.
14
1. ALGORITMI DI APPROSSIMAZIONE
L’algoritmo A0 riceve in input un istanza I = ((v1 , · · · , vn ), (c1 , · · · , cn ), B) e costruisce
l’istanza I 0 = (((k + 1)v1 , · · · , (k + 1)vn ), (c1 , · · · , cn ), B). Notiamo che, non avendo variato
i pesi ci e la capacità B dello zaino, l’insieme delle soluzioni ammissibili delle due istanze
coincidono. L’algoritmo A0 esegue l’algoritmo A sull’istanza I 0 ottenendo una soluzione S.
Notiamo che V al(S, I 0 ) = (k + 1)V al(S, I) e Opt(I 0 ) = (k + 1)Opt(I). Inoltre per ipotesi vale
che Opt(I 0 ) − V al(S, I 0 ) ≤ k. Quindi
k
Opt(I) − C(S, I) ≤
.
k+1
Poiché Opt(I) e V al(S, I) sono interi e poiché
k
k+1
< 1, abbiamo che
Opt(I) − V al(S, I) = 0
e quindi S è una soluzione ottima per I.
8.2. Algoritmo pseudopolinomiale. Data un’istanza I = ((v1 , · · · , vn ), (c1 , · · · , cn ), B)
denotiamo con C(j, v) il piú piccolo valore b per cui l’istanza ((v1 , · · · , vj ), (c1 , · · · , cj ), b) ha
valore ottimo almeno v. Abbiamo
C(j, v) = 0, v ≤ 0 e j = 0, 1, · · · , n,
C(0, v) = +∞ per v > 0,
e
C(j, v) = min{C(j − 1, v − vj ) + cj , C(j − 1, v)}.
La tabella C viene calcolata (ogni entry prende tempo O(1)) per ottenere il massimo v tale
=
P
che C(n, v) ≤ B. Poiché vale che Opt(I) ≤
vi def V ? , calcoliamo le entri di C(j, v) con
v = 0, · · · , V ? . L’algoritmo quindi prende tempo O(nV ? ). Notiamo che quindi l’algoritmo non
è polinomiale.
8.3. Uno schema di approssimazione. Data un’istanza I = ((v1 , · · · , vn ), (c1 , · · · , cn ), B)
ed un intero k consideriamo l’istanza k-scalata I 0 (k) = ((v1 (k), · · · , vn (k)), (c1 , · · · , cn ), B) dove
jv k
i
vi (k) =
.
k
Calcoliamo la soluzione ottima S 0 (k) dell’istanza I 0 (k) usando l’algoritmo della sezione precedente.
P
Il tempo d’esecuzione dell’algoritmo è O(nV 0 (k)) ove V 0 (k) =
i vi (k). D’altro canto
abbiamo V 0 (k) ≤ nVmax (k) ≤ nVmax /k, ove Vmax e Vmax (k) sono il valore massimo di un
oggetto nell’istanza originale e nell’istanza scalata. Quindi il tempo d’esecuzione dell’algoritmo
che risolve ottimamente la versione scalata del problema è O(n2 Vmax /k).
Valutiamo ora la bontà della soluzione ottenuta. Sia S 0 l’insieme di oggetti in una soluzione
ottima di I. Abbiamo
X
X j vi k
X j vi k
X vi
X
V al(S 0 (k), I) =
vi ≥ k
≥k
≥k
( −1) ≥
(vi − k) ≥ Opt(I)−k|S 0 |.
k
k
k
0
0
0
0
0
i∈S (k)
Quindi
essendo Opt(I) ≥ Vmax
i∈S (k)
i∈S
i∈S
k|S 0 |
nk
V al(S 0 (k), I)
≥1−
≥1−
Opt(I)
Opt(I)
Vmax
e |S ∗ | ≤ n.
i∈S
9. MINIMO MAKESPAN
15
In conclusione, se desideriamo che l’algoritmo approssimato restituisca una soluzione che
valga almeno (1 − ) volte l’ottimo scegliamo k nel modo seguente.
Se b Vmax
n c = 0 allora Vmax < n/ e quindi l’algoritmo della sezione precedente prende
tempo O(n2 Vmax ) = O(n3 /) e dà la soluzione ottima. Se b Vmax
n c > 0 allora poniamo k =
c.
In
questo
caso
la
soluzione
ottenuta
è
(1−)-approssimata
e l’algoritmo prende tempo
b Vmax
n
2
3
O(n Vmax /k) = O(n /).
9. Minimo makespan
Un’istanza consiste di un insieme J di n job di lunghezza p1 , · · · , pn da eseguire su m
macchine identiche. Una soluzione ammissibile consiste in uno schedule; cioè una partizione
S = hS1 , · · · , Sm i di J in m insiemi. Il costo M S(S) di uno schedule S è il suo makespan
definito come
m X
M S(S) = max
pj .
i=1
j∈Si
9.1. Algoritmo List Scheduling. Esiste un algoritmo molto semplice che approssima
il problema dello schedule con minimo makespan. L’algoritmo ListScheduling considera i
job uno per volta ed assegna ciascun job alla macchina che ha il minor carico.
ListScheduling(p1 , · · · , pn , m)
1. l1 , · · · , lm ← 0;
2. for i = 1 to n
3.
sia j tale che lj = minh {lh };
4.
S(i) = j;
5.
l j = l j + pi ;
6. end;
7. output S;
Teorema
1.13. L’algoritmo ListScheduling ottiene un rapporto di approssimazione
1
2 − m , ove m è il numero delle macchine.
Dimostrazione. Sia i l’ultimo job a terminare nello schedule prodotto dall’algoritmo
ListScheduling. Sia τ l’istante in cui il job i inizia. Abbiamo quindi che lo schedule calcolato
da ListScheduling ha lunghezza τ + pi .
Osserviamo che per il makespan ottimo vale
n
Opt(p1 , · · · , pn , m) ≥
ed inoltre che
1 X
ph
m
h=1
Opt(p1 , · · · , pn , m) ≥ pi .
Fino all’istante τ le macchine sono tutte occupate (altrimenti il job i-esimo sarebbe stato
schedulato su una macchina non occupata) ad eseguire job diversi da i e quindi abbiamo che
1 X
ph ≥ τ.
m
h6=i
16
1. ALGORITMI DI APPROSSIMAZIONE
Possiamo quindi concludere che
n
1
1 X
1 X
1
ph + 1 −
τ + pi ≤
ph + p i =
pi ≤ 2 −
Opt(p1 , · · · , pn , m).
m
m
m
m
h6=i
h=1
Mostriamo ora che esiste una sequenza di job per cui l’algoritmo ListScheduling resti1
) volte quello ottimo. Infatti, se abbiamo m(m − 1)
tuisce uno schedule che ha makespan (2 − m
job di lunghezza 1 ed 1 di lunghezza m, ListScheduling produce uno schedule con makespan
2m − 1 mentre lo schedule ottimo ha makespan m.
9.2. Job ordinati. In questa sezione studiamo l’algoritmo LongestFirst che considera
i job in ordine non decrescente di lunghezza e poi applica l’algortimo ListScheduling.
Abbiamo il seguente teorema.
Teorema 1.14. Per ogni istanza I del problema dello scheduling abbiamo che
4
1
LongestFirst(I) ≤
−
· Opt(I),
3 3m
ove m è il numero di macchine.
cui
Dimostrazione. Sia (p1 , · · · , pn ) una sequenza di job con il minimo numero di job per
(1)
LongestFirst(I) >
4
1
−
3 3m
· Opt(I).
Assumiamo che p1 ≥ p2 ≥ · · · ≥ pn .
Osserviamo che se lo schedule ottimo assegna al piú due job per macchina (e pertanto
n ≤ 2m) allora LongestFirst calcola una soluzione ottima.
Supponiamo che l’ultimo job a terminare sia pk , con k < n, e consideriamo l’istanza Ik che
consiste dei primi k job di I. Allora abbiamo che LongestFirst(Ik ) = LongestFirst(I) e
Opt(Ik ) ≤ Opt(I). Per l’ipotesi fatta abbiamo
4
4
1
1
−
−
LongestFirst(Ik ) = LongestFirst(I) >
· Opt(I) ≥
· Opt(Ik )
3 3m
3 3m
contraddicendo la minimalità di I. Pertanto abbiamo che l’ultimo job a terminare è p n .
Il job pn ha iniziato al tempo LongestFirst(I) − pn e a quell’istante tutte le macchine
sono occupate. Quindi abbiamo che
n−1
1 X
pi
LongestFirst(I) − pn ≤
m
i=1
da cui
n−1
n
1 X
1 X
m−1
LongestFirst(I) ≤ pn +
pn .
pi =
pi +
m
m
m
i=1
i=1
1 Pn
Poiché abbiamo che Opt(I) ≥ m
i=1 pi possiamo concludere che
(2)
LongestFirst(I) − Opt(I) ≤
m−1
pn .
m
9. MINIMO MAKESPAN
17
Per l’Equazione 1 abbiamo
(3)
LongestFirst(I) − Opt(I) >
m−1
Opt(I).
3m
Usando Eq. 2 ed Eq. 3, otteniamo
Opt(I) <
3m m − 1
pn < 3pn .
m−1 m
Quindi se assumiamo che esiste un’istanza I su cui LongestFirst ha una rapporto di
approssimazione peggiore di 4/3 − 1/3m allora possiamo concludere che l’ottimo su I assegna
al piú due job per macchina. Su questa classe di istanze però LongestFirst produce uno
schedule di makespan minimo. Contraddizione.
Il bound ottenuto nel teorema precedente è tight. Per ogni m, consideriamo 2m + 1 job
di lunghezza pi = 2m − b(i + 1)/2c per i = 1, 2, · · · , 2m e p2m+1 = m. I primi 2m job sono
assegnati da LongestFirst nel modo seguente: la macchina i riceve i job i e 2m − i + 1 per
un carico totale di 3m − 1. In piú ad una macchina viene assegnato il job p 2m+1 di lunghezza
m. Quindi LongestFirst ottiene un makespan 4m − 1.
L’ottimo invece è 3m e si ottiene assegnando alla macchina n i tre job piú corti (di lunghezza
m). Ciascuna delle restanti macchine invece riceve due job; piú precisamente la macchina i
riceve i job i e 2m − i − 1 per un carico totale di 3m.
9.3. Uno schema di approssimazione polinomiale. Uno schema di approssimazione
polinomiale (PTAS in breve) è una famiglia S = {S } di algoritmi. In questa sezione mostreremo, che ogni numero m fissato di macchine, un PTAS tale che l’algoritmo S ha tempo di
esecuzione polinomiale in n (numero di job) e produce uno schedule di makespan al piú (1 + )
volte l’ottimo.
Consideriamo il seguente algoritmo Ak che riceve in input le lunghezze di n job ordinate
in ordine non decrescente (cioè, p1 ≥ p2 ≥ · · · ≥ pn ) e il numero m di macchine:
Fase I.: Calcola uno schedule di makespan minimo per i primi k job.
Fase II.: Partendo dallo schedule parziale prodotto nella Fase I, utilizza ListScheduling sui rimanenti n − k job.
Abbiamo il seguente risultato.
Teorema 1.15. L’algoritmo Ak ottiene un rapporto di approssimazione minore o uguale a
1+
m−1
k
ove m è il numero delle macchine.
Dimostrazione. Lo schedule prodotto alla fine della Fase I ha makespan Opt(p 1 , · · · , pk , m)
e denotiamo, con leggero abuso di notazione, con Ak il makespan prodotto dall’algoritmo Ak .
Se Ak = Opt(p1 , · · · , pk , m) allora, poichè Opt(p1 , · · · , pk , m) ≤ Opt(p1 , · · · , pn , m), lo
schedule prodotto dall’algoritmo Ak è ottimo e il teorema vale.
Se, invece, Ak > Opt(p1 , · · · , pk , m) allora esiste un job i > k che termina al tempo Ak .
Sia τ l’istante di inizio del job i e quindi abbiamo che Ak = τ + pi . Per gli stessi argomenti
18
1. ALGORITMI DI APPROSSIMAZIONE
usati nella prova del Teorema 1.13 abbiamo che
(4)
Ak = τ + p i
n
1 X
ph + 1 −
≤
m
h=1
n
X
1
ph + 1 −
≤
m
(5)
(6)
h=1
1
m
pi
1
m
pk ,
ove l’ultima diseguaglianza
segue dal fatto che i > k e quindi pi ≤ pk . Ora abbiamo che
1 Pn
Opt(p1 , · · · , pn , m) ≥ m
h=1 ph . Inoltre, osserviamo che nello schedule ottimo per (p1 , · · · , pk , m)
k
e job ciascuno di
calcolato nella Fase I, esiste almeno una macchina che riceve almeno d m
lunghezza almeno pk . Pertanto abbiamo che
k
Opt(p1 , · · · , pn , m) ≥ Opt(p1 , · · · , pk , m) ≥
pk
m
da cui abbiamo
Opt(p1 , · · · , pn , m)
Opt(p1 , · · · , pn , m)
≤
.
k
k
dme
m
Sostituendo nell’Equazione 6 abbiamo il teorema.
pk ≤
L’algoritmo S esegue l’algoritmo Ak con k = d m
e. Per il teorema precedente Ak restituisce
una soluzione (1+)-approssimata. Calcoliamo un limite al tempo di esecuzione dell’algoritmo.
La Fase I prende tempo O(mk ) mentre Fase II prende tempo m · n per cui, essendo m ≤ n, il
m
tempo di esecuzione dell’algoritmo è O(n ) che è polinomiale in n per m fissato.
9.4. Nota bibliografica. Gli algoritmi discussi in questo capitolo sono stati presentati
per la prima volta in [3, 4]. Lo schema presentato nella Sezione 9.3 è polinomiale per un
numero fissato di macchine. In [5] è presentato uno schema che è polinomiale per un qualsiasi
numero di macchine.
10. Primale Duale
10.1. Set Cover Pesato. Vedi [6] pag. 15-17.
10.2. Primale e Duale. Vedi [6] pag. 93-97.
10.3. Primale Duale per Set Cover Pesato. Vedi [6] pag. 108-111.
11. Esercizi
Esercizio 1.1. Dimostrare il Teorema 1.4.
Esercizio 1.2. Dimostrare il Teorema 1.5.
Esercizio 1.3. Provare che il seguente algoritmo 1/2-approssima MaxSAT: sia t l’assegnamento che pone tutte le variabili a VERO e sia t̂ l’assegnamento che pone tutte le variabili
a FALSO. L’algoritmo restituisce l’assegnamento che tra t e t̂ soddisfa il maggior numero di
clausole.
11. ESERCIZI
19
Esercizio 1.4. Si consideri il seguente algoritmo per MaxCut: ogni vertice è assegnato
con probabilità 1/2 a S1 e con probabilità 1/2 a S2 . Dimostrare che il numero medio di archi
che hanno un estremo un S1 e l’altro in S2 è almeno Opt/2.
Esercizio 1.5. Argomentare perché l’algoritmo di Sezione 8.2 non è polinomiale.
Versione: 1.13 del 6 gennaio 2007.
CAPITOLO 2
Algoritmi On-Line
In un algoritmo on-line l’input non è mostrato nella sua interezza, bensı̀ ad ogni passo
viene svelato una parte dell’input. Un algoritmo on-line ad ogni passo deve compiere una
scelta. La bontà di un algoritmo on-line è stimata confrontando la soluzione ottenuta con la
soluzione ottima calcolata dall’algoritmo off-line che conosce l’intero output. Più precisamente
denotiamo con CostA (σ) il cost della soluzione prodotta dall’algoritmo on-line A per l’istanza
σ e con Opt(σ) il costo della soluzione ottima prodotta dall’algoritmo off-line. Definiamo la
competitive ratio (rapporto di competività) ρA di A come
ρA = sup
σ
CostA (σ)
.
Opt(σ)
Alternativamente, diciamo che l’algoritmo A ha competitive ratio c se esiste una costante a ≥ 0
tale che per ogni istanza σ
CostA (σ) ≤ c · Opt(σ) + a.
1. Il problema dello sciatore
Uno sciatore deve decidere se comprare o fittare gli sci. Il costo dell’affitto degli sci per un
giorno è 1 mentre comprare gli sci costa B. Ovviamente se lo sciatore conosce il numero T di
volte in cui andrà a sciare la decisione è semplice. Il primo giorno che andrà a sciare lo sciatore
comprerà gli sci se B < T ; se invece B ≥ T allo sciatore conviene prendere gli sci in affitto.
La versione off-line del problema (quando l’intero input è noto) è quindi di facile soluzione ed
il costo della soluzione è min{T, B}.
Consideriamo invece il caso più realistico in cui lo sciatore non conosce T . Un algoritmo online deve decidere ogni volta che lo sciatore va a sciare se comprare gli sci o fittarli. Ovviamente
una volta comprati il problema non si pone. Consideriamo quindi il seguente algoritmo che
decide se lo sciatore compra o fitta gli sci l’i-esima volta che va a sciare avendo in input i, B e
T.
A(i, B, T )
if i ≤ B − 1 then affitta;
if i = B then compra;
if i > B then comprati in precedenza;
end
Calcoliamo ρA . Se T ≤ B − 1 l’algoritmo A spende T in quanto fitta gli sci per T volte
cosı̀ come l’algoritmo off-line. Se invece T ≥ B l’algoritmo spende 2B − 1 in quanto fitta gli
sci per B − 1 volte e poi li compra. In questo caso invece l’algoritmo ottimo compra gli sci il
21
22
2. ALGORITMI ON-LINE
primo giorno per un costo totale di B. Pertanto abbiamo che
2B − 1
1
ρA ≤
=2− .
B
B
Mostriamo ora che nessun algoritmo on-line ha un rapporto di competività migliore di A.
Osserviamo che un algoritmo S on-line è determinato univocamente dal numero s di giorni
dopo i quali decide di comprare gli sci. Abbiamo due casi:
(1) s ≤ B − 1. In questo caso se T = s + 1, l’algoritmo on-line spende s + B e l’algoritmo
ottimo spende s + 1. Abbiamo quindi
s+B
B−1
1
1
ρS ≥
≥1+
≥2−
≥2− .
s+1
s+1
s+1
B
(2) s > B − 1. In questo caso se T = s + 1, l’algoritmo on-line spende s + B e l’algoritmo
ottimo spende B. Abbiamo quindi
s+B
ρS ≥
≥ 2.
B
2. Ritrovare l’auto
Supponiamo di abitare su una retta. Ogni mattina dobbiamo cercare la nostra auto percheé
dimentichiamo puntualmente dove l’abbiamo parcheggiata la sera prima. Ovviamente se l’auto
si trova a distanza d dalla nostra casa l’algoritmo (off-line) che conosce la posizione impiega
tempo d per trovarla. Mostriamo ora un algoritmo (on-line) che non conosce la posizione
dell’auto e per trovare l’auto impiega al più 9d.
TrovaAuto
d = 1;
dir=sx;
repeat
vai fino a distanza d nella direzione dir;
se trovi l’auto, fine;
ritorna a casa;
d = d ∗ 2;
dir=-dir;
Il caso peggiore di questo algoritmo è quando l’auto si trova alla distanza d = 2 j + ε e
abbiamo cercato su questo lato fino a 2j e poi abbiamo cercato fino a 2j+1 dall’altro lato. In
questo caso il costo dell’algoritmo è
2(1 + 2 + 4 + · · · + 2j+1 ) + 2j + ε ≤ 9 · 2j .
3. Gestione online di liste
In questa sezione studiamo il seguente problema. Abbiamo un certo numero n di oggetti
che sono organizzati in una lista. Ad ogni passo riceviamo una richiesta per uno degli n
oggetti. Se l’oggetto richiesto si trova nella posizione i, soddisfare la richiesta ci costa i. Una
volta recuperato l’oggetto richiesto possiamo spostarlo in una qualsiasi delle posizioni tra la
testa della lista e la sua posizione originale i. Inoltre possiamo scambiare di posto due oggetti
adiacenti al costo di 1. Il nostro scopo è progettare un algoritmo on-line (e che quindi non
conosce la sequenza di richieste che dovrà soddisfare) che organizza gli elementi nella lista (e
3. GESTIONE ONLINE DI LISTE
23
cioé decide dove spostare un oggetto una volta che è stato richiesto e quali oggetti adiacenti
scambiare id posto) in modo da rendere il costo di soddisfare una sequenza di richieste il
più piccolo possibile. Osserviamo che in questo caso l’analisi worst-case non ha molto senso:
infatti il caso peggiore è ottenuto dalla sequenza che richiede sempre l’ultimo elemento della
lista e nessun algoritmo può soddisfare una sequenza di m richieste spendendo meno di O(mn).
Un’analisi piú interessante si ottiene invece confrontando il costo di un algoritmo con il costo
dell’algoritmo ottimo che conosce tutte le richieste. Assumiamo che entrambi gli algoritmi
partano con la stessa lista.
3.1. Move to Front Heuristics. In questa sezione analiziamo il seguente semplice algoritmo che chiamiamo MoveToFront: ogni volta che un oggetto è richiesto, viene spostato
all’inizio della lista. Notiamo che MoveToFront è un algoritmo om-line: ogni rischiesta è
soddisfatta senza avere alcuna conoscenza delle richieste future.
Consideriamo una sequenza R = r1 , · · · , rm di m sequenze ed indichiamo con MTF(t)
il costo di MoveToFront per soddisfare rt e con MTF(R) il costo di MoveToFront per
soddisfare la sequenza R. Indichiamo con Opt l’algoritmo ottimo che conosce l’intera sequenza
R di richieste e Opt(t) e Opt(R) sono definiti analogamente. Diciamo che una coppia (x, y)
di oggetti costituisce un’inversione se si trovano in ordine diverso tra Opt e MoveToFront.
Denotiamo inoltre con Φ(t) il numero di inversioni dopo che la richiesta rt è stata soddisfatta.
Abbiamo il seguente lemma.
Lemma 2.1. Per ogni t,
MTF(r) + Φ(t) − Φ(t − 1) ≤ 2 · Opt(t).
Prima di dimostrare Lemma 2.1 mostriamo come esso implichi il seguente teorema.
Teorema 2.2. Per ogni sequenza R di richieste MTF(R) ≤ 2 · Opt(R).
Dimostrazione.
MTF(R) =
≤
m
X
t=1
m
X
t=1
MTF(t)
(2Opt(t) − Φ(t) + Φ(t − 1))
= Φ(0) − Φ(m) + 2
m
X
Opt(t)
t=1
= Φ(0) − Φ(m) + 2 · Opt(R).
La dimostrazione è conclusa dalle osservazioni che Φ(0) = 0 e Φ(m) ≥ 0.
Passiamo ora alla dimostrazione di Lemma 2.1.
Dimostrazione. Consideriamo l’i-esima richiesta ri e denotiamo con ti la posizione dell’oggetto richiesto nella lista di MoveToFront e con si la posizione dell’oggetto richiesto nella
lista di Opt. Abbiamo quindi che MTF(i) = ti e Opt(i) = si + pi , dove pi denota il numero
di scambi effettuati dopo aver soddisfatto ri dall’algoritmo Opt (nota che MoveToFront
non effettua alcuno scambio). Abbiamo due casi.
24
2. ALGORITMI ON-LINE
Caso I: si < ti . Studiamo prima il caso in cui pi = 0. In questo caso osserviamo che il
numero di inversione che coinvolgono l’oggetto ri prima che la richiesta venga soddisfatta è
almeno ti − si . Mentre invece, siccome ri è spostato in testa alla lista, dopo che ri è stata
soddisfatta il numero di inversioni che coinvolgono ri è al più si − 1. Inoltre in questo caso
il numero di inversioni che non coinvolgono ri (essendo questo l’unico elemento spostato sia
da MoveToFront che da Opt) resta invariato. Quindi denotando con I questo numero
abbiamo che
Φ(i − 1) ≥ ti − si + I
e
Φ(i) ≤ si − 1 + I.
Da cui
MTF(i) + Φ(i) − Φ(i − 1) ≤ ti + si − 1 + I − ti + si − I
= 2si − 1
≤ 2Opt(i).
Supponiamo ora che pi > 0. Osserviamo che ciascuno dei pi scambi effettuati da Opt
incrementa Φ(i) − Φ(i − 1) al più di 1 e quindi
Quindi abbiamo
Φ(i) − Φ(i − 1) ≤ (si − 1) − (ti − si ) + pi .
MTF(i) + Φ(i) − Φ(i − 1) ≤
=
≤
=
t i + si − 1 − t i + si + pi
2si − 1 + pi
2si + 2pi
2Opt(i).
Caso II: si ≥ ti . Per ragionamenti simili a quelli usati nel caso precedente, abbiamo che
Φ(i − 1) ≥ si − ti + I e che Φ(i) ≤ si − 1 + I. Quindi abbiamo
MTF(i) + Φ(i) − Φ(i − 1) ≤
≤
≤
≤
Versione: 1.6 del 6 gennaio 2007.
t i + si − 1 + t i − si + pi
2 · t i + pi
2 · si + 2 · pi
Opt(i)
Bibliografia
[1] T. Cormen, C. Leiserson, R. Rivest, and C. Stein. Introduction to Algorithms. MIT Press, 2001.
[2] Michel X. Goemans and David Williamson. New 34 -approximation algorithms for MAX SAT. SIAM Journal
on Discrete Mathematics, 7:656–666, 1994.
[3] R. L. Graham. Bounds for certain multiprocessing anomalies. Bell System Technical Journal, 45:1563–1581,
1966.
[4] R. L. Graham. Bounds on multiprocessing timing anomalies. SIAM Journal on Applied Mathematics, 17:416–
429, 1969.
[5] D.S. Hochbaum and D.B. Shmoys. Using dual approximation algorithms for scheduling problems: theoretical
and practical results. Journal of the ACM, 34:144–162, 1987.
[6] Vijay V. Vazirani. Approximation Algorithms. Springer, 2003.
25
Scarica

Algoritmi e Strutture Dati--Lecture Notes