Algoritmi di approssimazione. - Università degli Studi di Padova

Algoritmi di approssimazione.
Livio Colussi
9 dicembre 2014
2
Introduzione
La soluzione di un problema computazionale consiste nel trovare un procedimento
automatico (l’algoritmo) per calcolare dei risultati (l’output) a partire dai dati
del problema (l’input) utilizzando una quantit`a limitata di risorse (tempo calcolo,
spazio di memoria, ecc.).
Per essere pi`u precisi dovremmo far riferimento a qualche particolare nozione
formale di procedimento automatico; normalmente, nei testi di computabilit`a, si
usano le Macchine di Turing. Dovremmo anche parlare non di dati e risultati ma
di rappresentazioni dei dati e dei risultati; infatti ogni nozione formale di procedimento automatico assume che i dati e i risultati siano rappresentati in qualche
modo particolare, ad esempio come sequenze di simboli: cifre decimali o binarie
(bit) o caratteri di un qualche altro alfabeto.
Normalmente si richiede che un algoritmo soddisfi le seguenti tre condizioni:
(1) calcoli esattamente i risultati voluti (2) utilizzi una quantit`a di risorse limitata
e (3) faccia questo per ogni possibile input. Vi sono per`o situazioni in cui non e`
possibile soddisfare tutte e tre queste condizioni.
Un caso in cui non e` possibile calcolare esattamente i risultati voluti e` quando
dati e/o risultati sono oggetti che non ammettono una rappresentazione finita. Ad
esempio i numeri reali non si possono rappresentare
√ in modo finito e quindi non
possiamo calcolare in modo esatto il valore di 2 o di π. E` quindi giocoforza
lavorare con dei valori approssimati che risultino finitamente rappresentabili, ad
esempio quelli rappresentabili in virgola mobile con un certo numero di cifre per
la mantissa ed un certo numero di cifre per l’esponente.
Lo studio di algoritmi di approssimazione sui numeri reali e` talmente importante da costituire un’intera disciplina: il Calcolo Numerico.
Noi ci interesseremo invece di problemi computazionali in cui sia i dati in
ingresso che i risultati sono finitamente rappresentabili. In particolare considereremo problemi di ottimizzazione discreta in cui non solo vogliamo trovare una soluzione che soddisfi tutte le condizioni poste dal problema ma tra di esse vogliamo
trovarne una di ottima rispetto ad un qualche parametro di ottimalit`a.
Problemi di questo tipo sono molto comuni nelle applicazioni informatiche.
Per citarne soltanto alcuni: ”Trovare le pagine web che sono maggiormente correlate ad una particolare parola chiave” che e` alla base di ogni motore di ricerca;
”Trovare la strada pi`u breve tra due punti di una mappa” che e` alla base di ogni
navigatore satellitare; ”Trovare il miglior modo per inviare un pacchetto da un
nodo ad un altro di una rete” che e` alla base di ogni router di rete; ecc.
3
Purtroppo la maggior parte di questi problemi e` NP-difficile e quindi ogni
algoritmo che li risolve richiede un tempo di esecuzione almeno esponenziale
nella dimensione dell’input (a meno che P=NP). Anche la soluzione di problemi
che si risolvono esattamente con algoritmi di complessit`a polinomiale pu`o risultare troppo costosa (un algoritmo di complessit`a Θ(n10 ) non pu`o certo dirsi poco
costoso).
Non e` quindi possibile soddisfare contemporaneamente tutte e tre le condizioni e dovremo pertanto rilasciarne almeno una delle tre.
Talvolta viene rilasciata la condizione (3) e ci si accontenta di un algoritmo
che risolve esattamente il problema computazionale in un tempo ragionevole soltanto per una particolare classe di input. Possiamo dire di aver risolto in modo
soddisfacente il problema soltanto se siamo in grado di specificare esattamente la
classe di input su cui l’algoritmo funziona e se siamo sicuri che l’algoritmo verr`a
usato soltanto con input appartenenti a tale classe. Questo e` normalmente molto
difficile da ottenere.
Un approccio pi`u comune e` rilasciare la condizione (2) e accettare che per
alcuni input l’algoritmo possa richiedere una quantit`a eccessiva di risorse. Per
controllare che l’algoritmo funzioni bene nelle applicazioni pratiche ci si limita
ad eseguirlo su di un insieme opportunamente scelto di input tipici verificando
che su questi input esso fornisca il risultato in un tempo ragionevole. Se funziona bene sugli input tipici possiamo sperare che esso funzioni bene con tutti gli
input che si presenteranno nella pratica. Questo e` l’approccio generalmente usato per risolvere problemi complessi di ricerca operative, intelligenza artificiale,
programmazione con vincoli, ecc. Il problema con questo approccio e` che abbiamo soltanto la speranza ma non la garanzia che l’algoritmo funzioni bene nelle
applicazioni pratiche.
Noi adotteremo un approccio diverso rilasciando la condizione (1). Ci accontenteremo quindi di un algoritmo di approssimazione che per ogni possibile input
sia in grado di calcolare con risorse limitate dei risultati approssimati che non si
discostino troppo dai risultati esatti.
Questo approccio ci consente inoltre di gestire situazioni in cui il problema
richiede di elaborare i dati in tempo reale, ossia i dati vengono forniti all’algoritmo uno alla volta e si richiede che essi vengano elaborati immediatamente senza
conoscere i dati successivi. E` quindi giocoforza calcolare una soluzione che, a
posteriori, conoscendo tutti i dati potrebbe essere migliorata. Un algoritmo di
approssimazione di questo tipo si dice algoritmo on-line.
Vedremo come sia talvolta possibile trovare degli algoritmi di approssimazione che calcolano una soluzione accettabilmente approssimata con un costo spesso
4
molto ma molto inferiore.
In questo corso illustreremo le principali tecniche usate per ottenere algoritmi
di approssimazione. Illustreremo queste tecniche studiando un certo numero di algoritmi di approssimazione proposti nella letteratura specializzata per la soluzione
di certi problemi classici.
Cominceremo con problemi che richiedono il tempo reale illustrando gli algoritmi on-line per i problemi della paginazione e dei k-server.
Vedremo poi alcuni algoritmi di approssimazione per problemi NP-completi o
anche polinomiali ma troppo costosi quali, ad esempio, il problema del commesso
viaggiatore, il problema della copertura di vertici di costo minimo, il problema del
matching di costo minimo e il problema del taglio massimo.
Infine introdurremo il concetto di schemi di approssimazione studiando le soluzioni approssimate per i due problemi dell’impacchettamento e della schedulazione.
Vedremo che talvolta ci sar`a utile usare la randomizzazione la quale spesso
ci permette di ottenere algoritmi di approssimazione molto pi`u semplici ed efficienti e la cui soluzione risulta accettabilmente approssimata con altissima probabilit`a. Ai fini pratici possiamo spesso accettare una minima probabilit`a che
l’approssimazione ottenuta non sia sufficientemente buona.
Capitolo 1
Algoritmi on-line
1.1
Introduzione
Il concetto di algoritmo on-line e` abbastanza vecchio. Esso e` gi`a presente negli
anni settanta, ad esempio, nella letteratura relativa al problema dell’impacchettamento (bin-packing) [28, 36], ma e` diventato una importante area di ricerca
soltanto dopo la pubblicazione del fondamentale articolo di Sleator e Tarjan [35]
nel 1985.
Normalmente, quando risolviamo dei problemi e progettiamo degli algoritmi
noi assumiamo che tutti i dati siano noti a priori. Ma in molte comuni situazioni
questo pu`o non essere vero: invece di conoscere tutti i dati in anticipo essi ci
vengono forniti man mano che procediamo. Vediamo alcuni esempi.
1.1.1
Problema dell’investimento
Consideriamo un investitore avente a disposizione una certa somma che desidera
investire in modo tale da massimizzare il suo guadagno alla fine di un certo periodo di tempo. Egli pu`o scegliere tra varie possibilit`a: pu`o acquistare dei fondi
in valuta nazionale o in valuta estera, pu`o acquistare certificati di deposito oppure investire in azioni. Pu`o tenere un portafoglio misto e pu`o modificarne la
composizione durante tutto il periodo di investimento.
Se l’investitore conoscesse l’andamento dei mercati finanziari per tutto il periodo di tempo potrebbe certamente calcolare la soluzione che rende massimo il
suo guadagno. Purtroppo questa conoscenza la potr`a avere soltanto alla fine quando le sue scelte di investimento le avr`a gia fatte. A quel punto l’investitore pu`o
5
6
CAPITOLO 1. ALGORITMI ON-LINE
soltanto togliersi la soddisfazione di calcolare quanto avrebbe potuto guadagnare
e confrontarlo con il guadagno da lui effettivamente ottenuto. In questo modo egli
pu`o anche valutare la bont`a della strategia on-line usata.
Un algoritmo on-line per il problema dell’investimento e` quindi semplicemente una strategia che ad ogni istante decide la composizione del portafoglio sulla
base soltanto delle informazioni sul passato ma senza avere alcuna conoscenza
del futuro. Il guadagno ottenuto dipende dalla qualit`a della strategia on-line adottata. Vedremo in seguito come si possa quantificare esattamente questa qualit`a
introducendo la nozione di analisi competitiva.
1.1.2
Problema del noleggio degli sci
Consideriamo la seguente situazione: ogni giorno uno sciatore pu`o scegliere di
prendere a noleggio gli sci al costo di 5 euro oppure decidere di acquistare al
costo di T euro un paio di sci che poi utilizzer`a per tutto il resto della stagione.
Sfortunatamente egli non sa quanto duri la stagione sciistica. Se sapesse a priori
che la stagione durer`a n giorni (situazione off-line) la soluzione sarebbe ovvia:
compera gli sci se 5n > T , li prende sempre a noleggio altrimenti. D’altra parte
una strategia on-line per questo problema non pu`o che scegliere un intero k e
quindi noleggiare gli sci per i primi k giorni per poi acquistare gli sci al (k +
1)-esimo giorno se la stagione sciistica dovesse durare pi`u di k giorni.
A questo punto dobbiamo fermarci un momento e chiederci: come possiamo
valutare la bont`a degli algoritmi on-line? Un modo per analizzare un tale algoritmo e` quello di assumere che l’input sia generato casualmente secondo una determinata distribuzione di probabilit`a e calcolare il comportamento atteso rispetto a
tale distribuzione di probabilit`a. Noi vogliamo invece evitare di fare assunzioni
sulla distribuzione di probabilit`a degli input (che e` normalmente molto difficile da
stimare). Lo strumento che svilupperemo non richiede la conoscenza della distribuzione di probabilit`a degli input ma si limita a confrontare il risultato ottenuto
con l’algoritmo on-line con il miglior risultato possibile ottenibile con un algoritmo off-line. Questo tipo di confronto viene detto analisi competitiva ed e` stato
introdotto da Sleator e Tarjan [35].
Definizione 1.1.1 Un algoritmo on-line A e` α-competitivo se per ogni possibile
sequenza ρ di input succede che CA (ρ) ≤ αCO PT (ρ), dove CA (ρ) e` il costo
della strategia on-line A per la sequenza ρ mentre CO PT (ρ) e` il costo, per la
medesima sequenza ρ, di un algoritmo off-line ottimo O PT.
1.2. PROBLEMA DELLA PAGINAZIONE
7
Riconsideriamo l’esempio del noleggio degli sci alla luce della precedente definizione. Una strategia e` quella di acquistare gli sci il primo giorno. Questa
strategia e` (T /5)-competitiva e la sequenza di input peggiore si ha quando la stagione dura un solo giorno, ossia n = 1. Un’altra possibile strategia e` noleggiare
gli sci per i primi T /5 − 1 giorni e comperare gli sci al (T /5)-esimo giorno (se la
stagione dura abbastanza). Se n < T /5 il costo della strategia on-line e di quella
ottima off-line e` lo stesso. Se n ≥ T /5 il costo della strategia on-line e` 2T − 5 e il
costo della strategia off-line ottima e` T . Pertanto questo algoritmo on-line risulta
(2 − 5/T )-competitivo ed e` facile mostrare che esso e` anche il migliore algoritmo
on-line possibile dal punto di vista dell’analisi competitiva.
In alcuni casi la definizione di competitivit`a viene indebolita leggermente richiedendo che CA (ρ) ≤ αCO PT (ρ) + c per una qualche costante c indipendente
da ρ.
1.2
Problema della paginazione
Questo e` un problema che sorge nello sviluppo del software di sistema. Abbiamo
una memoria a due livelli divisa in pagine di lunghezza prefissata. Vi sono k
pagine nella memoria pi`u veloce mentre tutte le rimanenti pagine risiedono nella
memoria pi`u lenta.
La sequenza degli input per il nostro problema e` una sequenza
ρ = r1 , r2 , . . . , rn
di richieste di pagine a cui il programma in esecuzione deve accedere. Quando
viene richiesta una pagina ri se essa si trova nella memoria veloce non dobbiamo fare nulla, altrimenti abbiamo un page-fault e dobbiamo decidere quale pagina in memoria veloce dobbiamo rimpiazzare con la pagina ri richiesta. Il costo
dell’algoritmo di paginazione e` quindi il numero totale di page-fault.
Un algoritmo on-line per questo problema deve decidere la pagina da sostituire
quando avviene un page-fault senza avere nessuna informazione sulle pagine che
verranno richieste in seguito. Ecco alcune possibili strategie on-line:
L IFO (Last-In-First-Out): sostituisci la pagina che e` stata messa nella memoria
veloce per ultima.
F IFO (First-In-First-Out): sostituisci la pagina che e` stata messa nella memoria
veloce per prima.
8
CAPITOLO 1. ALGORITMI ON-LINE
L RU (Least-Recently-Used): sostituisci la pagina usata meno di recente (quella
inutilizzata da pi`u tempo).
L FU (Least-Frequently-Used): sostituisci la pagina che e` stata usata meno volte.
F WF (Flush-When-Full): sostituisci una pagina non marcata qualsiasi e marca
la pagina richiesta. Quando tutte le pagine in memoria veloce risultano
marcate, togli la marcatura a tutte.
Consideriamo la strategia L IFO per il problema della paginazione. Se la sequenza di input e` costituita dalla richiesta alternata di due sole pagine p e q che
all’inizio non stanno in memoria veloce con la strategia L IFO abbiamo un pagefault per ogni pagina mentre una strategia off-line ottima richiede al massimo due
page-fault. Dunque L IFO non e` α-competitiva per nessun α. Diciamo quindi che
L IFO e` non competitiva. Un ragionamento simile mostra che anche L FU e` non
competitiva.
Il seguente teorema mostra che esistono strategie k-competitive (dove k e` la
dimensione della memoria veloce, misurata in pagine). In seguito mostreremo che
questo e` il meglio possibile.
Teorema 1.2.1 (Sleator e Tarjan) L RU e` k-competitivo.
Dimostrazione. Sia B un qualsiasi algoritmo off-line. All’inizio L RU e B hanno
la stessa configurazione nella memoria veloce (ossia partono avendo le stesse k
pagine nella memoria veloce). Dobbiamo dimostrare che, qualunque siano le k
pagine presenti in memoria veloce all’inizio e qualunque sia la sequenza ρ di
pagine richieste abbiamo sempre CL RU (ρ) ≤ kCB (ρ).
Considerando il comportamento di L RU su una sequenza ρ = r1 , r2 , . . . , rn
possiamo suddividerla in fasi f0 , f1 , . . . , f , f +1 nel modo seguente:
ρ = [r1 , . . . , ri0 ], [ri0 +1 , . . . , ri1 ], . . . , [ri −1 +1 , . . . , ri ], [ri
f0
f1
f
+1 , . . . , rn ],
f
+1
dove ogni fase fj termina con un page-fault rij e contiene esattamente k pagefault tranne la prima fase f0 che ne pu`o contenere meno e l’ultima fase f +1 che
non contiene nessun page-fault. La suddivisione si pu`o fare agevolmente partendo
dalla fine della sequenza.
Dimostriamo che il rapporto di competitivit`a k vale per ciascuna fase.
Tale rapporto vale banalmente per f +1 in cui L RU non effettua alcun pagefault. Vale anche per f0 in quanto essa contiene il primo page-fault della sequenza
1.2. PROBLEMA DELLA PAGINAZIONE
9
(che e` anche un page-fault per B visto che i due algoritmi partono con le stesse k
pagine in memoria veloce) e termina con un page-fault ri avendone effettuati un
certo numero h minore o uguale a k.
Consideriamo il costo di una singola fase intermedia fj per L RU e per B. Per
definizione CL RU (fj ) = k. Se dimostriamo che CB (fj ) ≥ 1, ossia che B effettua
almeno un page-fault, abbiamo dimostrato il teorema.
Osserviamo intanto che se L RU effettua due page-fault su due richieste ri e ri
per la stessa pagina p allora, tra le richieste ri+1 , . . . , ri devono essercene almeno
k + 1 relative a pagine distinte. Infatti tra tali richieste ce ne deve essere una rt
per una pagina q (non presente) che sostituisce la pagina p. Subito prima di rt
la memoria veloce conteneva quindi p ed altre k − 1 pagine q1 , . . . , qk−1 diverse
da p ed usate pi`u recentemente di p. Quindi ciascuna delle pagine q1 , . . . , qk−1
deve essere stata richiesta in ri+1 , . . . , rt−1 (vedi Figura 1.1). Siccome q viene
richiesta in rt e p viene richiesta in ri e le pagine q1 , . . . , qk−1 , q, p sono tutte
distinte possiamo concludere che in ri+1 , . . . , ri vengono richieste almeno k + 1
pagine distinte.
p
q1 , . . . , qk−1
ri
p q
rt
p
ri
Figura 1.1: Se p viene scaricata per soddisfare la richiesta rt le altre pagine
q1 , . . . , qk−1 presenti in memoria devono essere state richieste pi`u di recente, ossia
nella zona rossa.
Consideriamo quindi due casi:
Caso 1 nella fase fj l’algoritmo L RU ha un page-fault due volte per la stessa
pagina oppure contiene un page-fault per l’ultima pagina p richiesta nella
fase fj−1 . In questo caso in fj vengono richieste almeno k+1 pagine distinte
(vedi Figura 1.2) e pertanto B deve avere almeno un page-fault in fj .
Caso 2 nella fase fj l’algoritmo L RU ha un page-fault su k pagine distinte e diverse dall’ultima pagina p richiesta nella fase fj−1 . In questo caso all’inizio
della fase fj l’algoritmo B ha in memoria la pagina p e altre k − 1 pagine.
Siccome nella fase vengono richieste k pagine distinte e diverse da p l’algoritmo B deve sostituire almeno una pagina con una nuova pagina e quindi
ha almeno un page-fault nella fase fj .
10
CAPITOLO 1. ALGORITMI ON-LINE
p
fj−1
p
fj
p
fj−1
fj+1
p
fj
fj+1
Figura 1.2: Se in una fase vi e` un page-fault per la richiesta di una pagina p e
questo e` preceduto, nella stessa fase o nell’ultima richiesta della fase precedente,
da un altro page-fault per la stessa pagina p allora devono essere richieste almeno
k + 1 pagine distinte nella zona rossa e quindi all’interno della fase.
Siccome questo vale per ogni algoritmo off-line vale, in particolare, anche per un
algoritmo off-line ottimo O PT e quindi L RU e` k-competitivo.
In modo del tutto analogo si pu`o dimostrare che anche F IFO e` k-competitivo.
La morale di questa tecnica si pu`o riassumere nel seguente modo: possiamo
vedere la competitivit`a come un gioco tra l’algoritmo A ed un avversario B che
cerca di costruire degli input cattivi per A conoscendo a priori la strategia usata
da A. Possiamo cio´e vedere la cosa come un gioco tra un giocatore A ed un
avversario B. L’avversario B fa la prima mossa scegliendo la prima pagina r1 da
richiedere dopo di che il giocatore A deve processare tale richiesta. Quindi B fa
la seconda mossa scegliendo r2 ed A processa r2 , e cos`ı via. Siccome B conosce
la strategia di A esso pu`o simulare il gioco e scegliere ancor prima dell’inizio del
gioco la sequenza di richieste pi`u ostica per A. L’algoritmo B inoltre calcola il
numero di page-fault CA (ρ) effettuato da A e, alla fine, esegue un algoritmo offline ottimo O PT sulla sequenza ρ calcolando CO PT (ρ) e quindi comunica ad A il
rapporto di competitivit`a CA (ρ)/CO PT (ρ) da esso raggiunto.
Un’altra cosa da notare nella dimostrazione del teorema precedente e` che non
abbiamo usato esplicitamente un algoritmo ottimale O PT. Ci siamo limitati a
confrontare il costo dell’algoritmo on-line con un limite inferiore per il costo di
qualsiasi algoritmo off-line. Questa osservazione pu`o sembrare ovvia ma la comparazione con un limite inferiore e` una tecnica abbastanza comune nell’analisi
1.3. ALGORITMO OFF-LINE DI PAGINAZIONE OTTIMO
11
degli algoritmi (non soltanto per gli algoritmi on-line ma anche per gli algoritmi
approssimati che vedremo in seguito).
1.3
Un algoritmo di paginazione off-line ottimo
In questa sezione mostriamo un algoritmo di paginazione off-line ottimo. L’algoritmo che consideriamo e` l’algoritmo L FD (per Longest Forward Distance) che
quando deve rimuovere una pagina per sostituirla con quella richiesta ne sceglie
una che non verr`a pi`u richiesta se ce ne sono, altrimenti sceglie la pagina che
verr`a successivamente richiesta per ultima tra tutte le pagine attualmente presenti
in memoria veloce. Ricordiamo che L FD, essendo un algoritmo off-line, conosce
tutta la sequenza delle richieste comprese quelle che non ha ancora processato.
Teorema 1.3.1 (Belady) L FD e` un algoritmo di paginazione off-line ottimo.
Dimostrazione.
La dimostrazione e` per assurdo. Supponiamo esista un algoritmo off-line
A migliore di L FD e sia ρ = r1 , r2 , . . . , rn una sequenza di pagine tale che
CL FD (ρ) > CA (ρ). Possiamo supporre che A sia ottimo sulla sequenza ρ nel
senso che CB (ρ) ≥ CA (ρ) per ogni altro algoritmo off-line B (altrimenti potremmo modificare A in modo che verifichi preventivamente se il suo input e` ρ e in tal
caso si comporti come B).
Sia L0 = A0 l’insieme iniziale delle pagine in memoria veloce (che e` lo
stesso per i due algoritmi) e siano Li ed Ai gli insiemi di pagine che si trovano in memoria veloce dopo l’elaborazione della richiesta ri da parte di L FD e A
rispettivamente.
Ad un certo punto nell’elaborazione della sequenza ρ i due algoritmi divergono. Sia i il primo indice tale che Li = Ai . Prima di processare ri i due algoritmi
hanno le stesse pagine in memoria veloce per cui ri origina un page-fault per entrambi. Siccome i due algoritmi si comportano diversamente su ri essi scaricano
due pagine diverse per servire ri . Dunque Li ed Ai hanno esattamente k − 1 pagine in comune, ossia |Li ∩ Ai | = k − 1. Inoltre, il costo per processare le prime i
richieste e` lo stesso per i due algoritmi.
Mostreremo come sia possibile modificare l’algoritmo off-line A per ottenere
un altro algoritmo off-line B che diverge da L FD su di una richiesta successiva a
ri e tale che CB (ρ) = CA (ρ).
12
CAPITOLO 1. ALGORITMI ON-LINE
Ripetendo questa operazione arriveremo quindi all’assurdo di un algoritmo
che non diverge mai da L FD sulla sequenza ρ pur avendo un costo su ρ uguale a
CA (ρ), da cui CL FD (ρ) = CB (ρ) = CA (ρ) contro l’ipotesi CL FD (ρ) > CA (ρ).
Sia dunque q la pagina scaricata da L FD per rispondere alla richiesta ri e p
quella scaricata da A. Osserviamo che nelle richieste successive a ri , la pagina
q pu`o essere richiesta soltanto dopo che sia stata richiesta la pagina p (altrimenti
L FD avrebbe scaricato p invece di q).
L’algoritmo B si comporta come A per processare le prime i − 1 richieste e
quindi si comporta come L FD nel processare ri (scarica la pagina q invece della
p). Osserviamo che il numero di page-fault eseguiti da B per processare le prime
i richieste e` lo stesso di A (ossia CB (ρi ) = CA (ρi ) dove ρi = r1 , . . . , ri e` la
sequenza delle prime i richieste di ρ) e che le configurazioni di memoria di B
sono le stesse di L FD per ogni j = 1, . . . , i e di conseguenza |Bi ∩ Ai | = k − 1.
A
B
p
Ai = [q1 , . . . , qk−1 , q]
q r Bi = Li = [q1 , . . . , qk−1 , p]
i
CB (ρi ) = CA (ρi )
Da questo punto in poi l’algoritmo B si comporta in modo che dopo aver
processato le prime j richieste ρj esso si trovi in uno dei seguenti tre casi:
Caso 1 CB (ρj ) = CA (ρj ) e Bj = Aj .
Caso 2 CB (ρj ) = CA (ρj ), Bj = {q1 , . . . , qk−1 , p} e Aj = {q1 , . . . , qk−1 , q}
differiscono per una sola pagina e tra le successive richieste rj+1 , . . . , rn
una eventuale richiesta della pagina q potr`a comparire soltanto dopo che sia
stata richiesta la pagina p.
Caso 3 CB (ρj ) < CA (ρj ), Bj = {q1 , . . . , qk−1 , p} e Aj = {q1 , . . . , qk−1 , q}
differiscono per una sola pagina.
Osserviamo che dopo aver processato la richiesta ri ci si trova nel Caso 2.
Vediamo dunque come l’algoritmo B si comporta quando deve processare una
richiesta rj successiva a ri a seconda del caso in cui si trova dopo aver processato
la richiesta precedente rj−1 .
1.3. ALGORITMO OFF-LINE DI PAGINAZIONE OTTIMO
13
Se dopo aver processato rj−1 l’algoritmo B si trova nel Caso 1 esso si comporta come A rimanendo quindi nel Caso 1 fino alla fine della sequenza ρ per cui
CB (ρ) = CA (ρ).
Se rj non causa un page-fault per nessuno dei due algoritmi non ci sono problemi: si prosegue rimanendo nello stesso caso. Vediamo quindi come procedere
nei casi 2 e 3 quando almeno uno dei due algoritmi ha un page-fault su rj .
Se dopo aver processato rj−1 l’algoritmo B si trova nel Caso 2 abbiamo le
seguenti due possibilit`a a seconda della pagina richiesta da rj (che sappiamo non
poter essere q):
1. rj = s diversa sia da p che da q. In questo caso se A scarica q, B scarica p
e i due algoritmi convergono a Bj = Aj (Caso 1). Se invece A scarica una
pagina comune, ad esempio q1 , anche B scarica la stessa pagina q1 in modo
da rimanere nella stessa situazione precedente (Caso 2).
A
Aj−1 = [q1 , . . . , qk−1 , q]
q s
Aj = [q1 , . . . , qk−1 , s]
B
Bj−1 = [q1 , . . . , qk−1 , p]
pr s
Bj = [q1 , . . . , qk−1 , s]
CB (ρj−1 ) = CA (ρj−1 )
j
CB (ρj ) = CA (ρj )
A
Aj−1 = [q1 , . . . , qk−1 , q]
q1 s
Aj = [s, . . . , qk−1 , q]
B
Bj−1 = [q1 , . . . , qk−1 , p]
q1 r s
Bj = [s, . . . , qk−1 , p]
CB (ρj−1 ) = CA (ρj−1 )
j
CB (ρj ) = CA (ρj )
2. rj = p. In questo caso B non ha page-fault mentre A scarica una pagina.
A non pu`o scaricare q altrimenti avremmo Bj = Aj con costo CB (ρj ) <
CA (ρj ) e dunque B potrebbe continuare come A per processare l’intera
sequenza con costo CB (ρ) < CA (ρ) contro l’ipotesi di minimalit`a di A su
ρ.
Quindi A scarica una pagina comune, diciamo q1 , sostituendola con p. Rimane quindi vero |Bj ∩ Aj | = k − 1 ma non e` pi`u necessariamente vero
che vi sia un ordine obbligato tra le successive richieste delle due pagine
non comuni. In compenso CB (ρj ) risulta strettamente minore di CA (ρj ) e
quindi siamo nel Caso 3.
14
CAPITOLO 1. ALGORITMI ON-LINE
A
Aj−1 = [q1 , . . . , qk−1 , q]
B
Bj−1 = [q1 , . . . , qk−1 , p]
CB (ρj−1 ) = CA (ρj−1 )
q1 p
rj
Aj = [p, q2 , . . . , qk−1 , q]
Bj = [p, q2 , . . . , qk−1 , q1 ]
CB (ρj ) < CA (ρj )
Supponiamo quindi che dopo aver processato rj−1 l’algoritmo B si trovi nel
Caso 3. Abbiamo le seguenti tre possibilit`a:
1. rj = s diversa sia da p che da q. In questo caso A non pu`o scaricare q
altrimenti B potrebbe scaricare p convergendo a A con un costo strettamente
inferiore, contro l’ipotesi di minimalit`a di A su ρ.
Quindi A scarica una pagina comune, diciamo q1 , e B si comporta allo
stesso modo mantenendosi nel Caso 3.
A
Aj−1 = [q1 , . . . , qk−1 , q]
q1 s
Aj = [s, q2 , . . . , qk−1 , q]
B
Bj−1 = [q1 , . . . , qk−1 , p]
q1 r s
Bj = [s, q2 , . . . , qk−1 , p]
CB (ρj−1 ) < CA (ρj−1 )
j
CB (ρj ) < CA (ρj )
2. rj = p. In questo caso B non ha page-fault e A non pu`o scaricare q altrimenti B convergerebbe a A con un costo strettamente inferiore, contro
l’ipotesi di minimalit`a di A su ρ.
Quindi A scarica una pagina comune, diciamo q1 , rimanendo nel Caso 3.
A
Aj−1 = [q1 , . . . , qk−1 , q]
B
Bj−1 = [q1 , . . . , qk−1 , p]
CB (ρj−1 ) < CA (ρj−1 )
q1 p
rj
Aj = [p, q2 , . . . , qk−1 , q]
Bj = [p, q2 , . . . , qk−1 , q1 ]
CB (ρj ) < CA (ρj )
3. rj = q. In questo caso A non ha page-fault e B scarica p per sostituirla
con q. I due algoritmi convergono con costi CB (ρj ) ≤ CA (ρj ). Siccome,
per la minimalit`a di A su ρ, non pu`o essere CB (ρj ) < CA (ρj ) avremo che
CB (ρj ) = CA (ρj ) e quindi siamo nel Caso 1.
1.4. LIMITE INFERIORE PER LA COMPETITIVITA`
A
Aj−1 = [q1 , . . . , qk−1 , q]
B
Bj−1 = [q1 , . . . , qk−1 , p]
CB (ρj−1 ) < CA (ρj−1 )
15
Aj = [q1 , . . . , qk−1 , q]
pr q
j
Bj = [q1 , . . . , qk−1 , q]
CB (ρj ) ≤ CA (ρj )
Alla fine dell’intera sequenza ρ non si pu`o essere nel Caso 3 in quanto A e` ottimo
sulla sequenza ρ. Quindi avremo CB (ρ) = CA (ρ) con B che diverge da L FD su
di una richiesta successiva a ri .
1.4
Limite inferiore per la competitivit`a degli algoritmi di paginazione
In questa sezione mostriamo che k e` un limite inferiore per il rapporto di competitivit`a α di ogni algoritmo deterministico di paginazione on-line, il che ci permette di concludere che L RU e` un algoritmo deterministico on-line ottimo per il
problema della paginazione.
Per la dimostrazione ci serve il seguente:
Lemma 1.4.1 Per ogni sequenza ρ di richieste di pagine scelte in un insieme di
k + 1 pagine distinte l’algoritmo off-line ottimo L FD non pu`o originare page-fault
su due richieste a distanza minore di k.
Dimostrazione. Siano ri e rj due richieste che originano due page-fault consecutivi e dimostriamo che j − i ≥ k.
Siccome abbiamo soltanto k + 1 pagine, abbiamo un page-fault soltanto se la
pagina richiesta e` l’unica pagina non residente in memoria veloce. Sia p la pagina
richiesta in ri e sia q la pagina scaricata. Il prossimo page-fault avviene soltanto
quando viene richiesta q (che e` quindi la pagina richiesta in rj ). Per processare ri
l’algoritmo L FD sceglie la pagina q che verr`a richiesta per ultima tra tutte quelle
presenti in memoria. Di conseguenza ciascuna delle altre k − 1 pagine dovr`a
comparire tra le richiesta ri+1 , . . . , rj−1 e dunque j − i − 1 ≥ k − 1, ovvero
j − i ≥ k.
Possiamo quindi dimostrare il seguente:
16
CAPITOLO 1. ALGORITMI ON-LINE
Teorema 1.4.2 Per ogni algoritmo di paginazione on-line deterministico A esiste
una sequenza ρ di richieste tale che CA (ρ) ≥ kCL FD (ρ).
Dimostrazione. L’avversario di A costruisce una sequenza ρ = r1 , . . . , rk di lunghezza k usando un insieme di k + 1 pagine distinte: ognuna delle richieste della
sequenza richiede l’unica pagina non presente in memoria veloce di A prima della
richiesta stessa. Tranne la prima volta la pagina non presente in memoria e` quella appena scaricata dall’algoritmo per soddisfare la richiesta precedente (e che
l’avversario conosce in quanto conosce la strategia di A).
Chiaramente A effettua k page fault, uno per ogni richiesta mentre, per il
lemma precedente, L FD non pu`o avere pi`u di un page-fault. Quindi CA (ρ) ≥
kCL FD (ρ).
Osserviamo che siccome anche F IFO e` k-competitivo e` anch’esso un algoritmo deterministico on-line ottimo per il problema della paginazione.
1.5
Algoritmi on-line randomizzati
Gli algoritmi on-line di cui abbiamo discusso finora sono deterministici. Un difetto di questi algoritmi e` che l’avversario pu`o sempre determinare esattamente il
loro comportamento su di una sequenza ρ. Questo permette all’avversario di trovare degli input diabolici del tipo di quelli che abbiamo visto nella dimostrazione
del teorema precedente.
Questo motiva l’introduzione della classe degli algoritmi on-line randomizzati
che si comportano meglio da questo punto di vista. Informalmente un algoritmo
on-line randomizzato e` soltanto un algoritmo on-line A che ha a disposizione una
monetina da lanciare. Ogni volta che deve servire una richiesta esso lancia una
o pi`u volte la monetina ed in base all’esito di tali lanci decide come servire la
richiesta.
Per dare una definizione formale di algoritmo on-line randomizzato osserviamo che se fissiamo a priori una sequenza infinita x di risultati dei lanci di monetina
effettuati dall’algoritmo allora l’algoritmo diventa deterministico. Se indichiamo
con 0 e 1 i due possibili esiti di un lancio possiamo interpretare una sequenza di
esiti come una sequenza b1 b2 b3 . . . di cifre binarie.
Questo giustifica la seguente:
Definizione 1.5.1 Un algoritmo on-line randomizzato A e` una famiglia di algoritmi on-line deterministici {Ax : x ∈ {0, 1}∞ }.
1.5. ALGORITMI ON-LINE RANDOMIZZATI
17
Notiamo che, quando parliamo di competitivit`a degli algoritmi on-line randomizzati, dobbiamo decidere quali informazioni sono a disposizione dell’avversario.
Definizione 1.5.2 Un avversario ignaro e` un avversario che conosce gli algoritmi
on-line deterministici {Ax } che costituiscono A, ma non ha accesso alle scelte
casuali di A (e quindi non conosce il particolare algoritmo deterministico Ax
scelto).
La definizione precedente implica, tra l’altro, che l’avversario non conosce
il contenuto della memoria di A. Quindi l’avversario deve poter decidere tutta
la sequenza di richieste prima che il gioco tra lui e l’algoritmo A abbia inizio.
Dunque la randomizzazione permette di nascondere ad un avversario ignaro lo
stato dell’algoritmo on-line. La nozione di competitivit`a per gli algoritmi on-line
randomizzati e` la seguente:
Definizione 1.5.3 Un algoritmo on-line randomizzato A = {Ax : x ∈ {0, 1}∞ }
si dice α-competitivo contro un avversario ignaro se esiste una costante c ≥ 0
tale che per ogni sequenza ρ di richieste:
E[CAx (ρ)] ≤ αCO PT (ρ) + c
(1.1)
dove il valore atteso e` calcolato rispetto alla scelta casuale della sequenza x ∈
{0, 1}∞ .
La costante addizionale c e` introdotta per poter tener conto di eventuali differenze tra le configurazioni iniziali dell’algoritmo e dell’avversario.
Per poter calcolare il valore atteso E[CAx (ρ)] dobbiamo definire la distribuzione di probabilit`a sulle sequenze infinite di esiti dei lanci di monetina, ossia sulle sequenze infinite b1 b2 b3 . . . di cifre binarie. Possiamo interpretare una
sequenza infinita di cifre binarie come la parte frazionaria di un numero reale
x = 0.b1 b2 b3 . . . scritto in base 2. Il numero reale x = 0.b1 b2 b3 . . . e` ovviamente
compreso tra 0 e 1. Viceversa sappiamo che ogni numero reale compreso tra 0 e
1 pu`o essere rappresentato in base 2 in modo essenzialmente unico1 . Possiamo
quindi identificare una sequenza infinita b1 b2 b3 . . . di esiti di lanci di monetine con
un numero reale 0 ≤ x ≤ 1.
1
essenzialmente significa che i numeri che non hanno rappresentazione unica sono un insieme di misura nulla. Infatti i numeri tra 0 e 1 che in base 2 hanno due rappresentazioni distinte
0.b1 . . . bk 10000 . . . e 0.b1 . . . bk 01111 . . . sono soltanto i numeri razionali il cui denominatore e`
potenza di 2.
18
CAPITOLO 1. ALGORITMI ON-LINE
Se ogni cifra binaria bi viene scelta casualmente ed indipendentemente dalle scelte precedenti il numero reale x = 0.b1 b2 b3 . . . e` un numero reale estratto
casualmente dall’intervallo [0, 1] con distribuzione uniforme.
Dunque, ai fini del calcolo del valore atteso, possiamo considerare un algoritmo randomizzato come una famiglia di algoritmi deterministici indicizzata sui
numeri reali dell’intervallo [0, 1]. Scriveremo quindi A = {Ax : x ∈ [0, 1]}.
Definiremo come probabilit`a di una sequenza finita b1 b2 . . . bn la probabilit`a
di tutte le sue estensioni infinite. Le estensioni infinite di b1 b2 . . . bn sono rappresentate dall’intervallo di numeri reali [a, b] con a = 0.b1 b2 . . . bn 000 . . . e
b = 0.b1 b2 . . . bn 111 . . . .
Siccome tale intervallo ha ampiezza b − a = 1/2n e la distribuzione di probabilit`a e` uniforme in [0, 1], la probabilit`a di b1 b2 . . . bn e` pari all’ampiezza dell’intervallo [a, b], ossia 1/2n .
Ricordiamo che il valore atteso Ex∈X (Z(x)) di una variabile casuale continua
Z(x) con densit`a di probabilit`a {p(x) : x ∈ X} e` definito come
E [Z(x)] =
x∈X
p(x)Z(x)dx
x∈X
Nel nostro caso X = [0, 1] e p(x) = 1 per cui
1
E [CAx (ρ)] =
x∈[0,1]
0
CAx (ρ)dx
Se indichiamo con n = n(ρ) il numero massimo di lanci di monetina effettuati
dall’algoritmo per rispondere alla sequenza di richieste ρ allora due algoritmi deterministici Ax ed Ax relativi a sequenze infinite x e x aventi i primi n elementi
uguali si comportano allo stesso modo sulla sequenza di richieste ρ.
Sia B n = {0, 1}n l’insieme delle sequenze finite di cifre binarie di lunghezza
n e per ogni y ∈ B n indichiamo con Ay un qualsiasi algoritmo deterministico
Ax ottenuto estendendo la sequenza finita y ad una sequenza infinita x. Possiamo
riscrivere l’equazione precedente come:
E [CAx (ρ)] =
x∈[0,1]
y∈B n
1
C (ρ) =
2n Ay
y∈B n
CAy (ρ)
2n
dove la sommatoria e` estesa all’insieme B n delle sequenze di cifre binarie di
lunghezza n e 2n e` il numero di tali sequenze.
Vediamo due particolari algoritmi on-line randomizzati:
1.6. ANALISI DELL’ALGORITMO MARKING
19
R ANDOM L’algoritmo R ANDOM serve ogni page-fault scaricando dalla memoria
veloce una pagina scelta casualmente tra tutte quelle presenti.
M ARKING Inizialmente tutte le pagine in memoria veloce sono marcate. Quando
viene richiesta una pagina p:
• Se la pagina p e` in memoria veloce ma non era marcata l’algoritmo la
marca.
• Se la pagina p non e` in memoria veloce l’algoritmo controlla se ci sono
pagine non marcate e in caso contrario toglie la marcatura da tutte le
pagine. Dopo di che scarica una pagina scelta casualmente fra tutte
quelle non marcate e infine carica p e la marca.
Nelle prossime sezioni ci concentreremo sull’algoritmo M ARKING per dimostrare che:
• Mediante la randomizzazione l’algoritmo M ARKING raggiunge un rapporto
di competitivit`a 2Hk contro un avversario ignaro, dove Hk = 1 + 12 + 31 +
. . . + k1 e` il k-esimo numero armonico.
• Il rapporto di competitivit`a di M ARKING e` quasi ottimale nel senso che nessun algoritmo randomizzato ha un rapporto di competitivit`a migliore di Hk .
Per dimostrare questo useremo un metodo generale per dimostrare limiti
inferiori per algoritmi on-line randomizzati contro un avversario ignaro.
Questi due risultati sono dovuti a Fiat, Karp, Luby, McGeoch e Sleator [24].
1.6
Analisi dell’algoritmo M ARKING
Teorema 1.6.1 M ARKING e` 2Hk -competitivo contro qualsiasi avversario ignaro,
dove Hk = 1 + 21 + 13 + . . . + k1 e` il k-esimo numero armonico.
Dimostrazione. Dobbiamo dimostrare che per ogni sequenza ρ di richieste e per
una opportuna costante c indipendente da ρ vale la disuguaglianza
E[CM ARKING (ρ)] ≤ 2Hk CO PT (ρ) + c
(1.2)
dove il valore atteso viene calcolato sulla famiglia {M ARKINGx : x ∈ [0, 1]} degli
algoritmi deterministici che costituiscono M ARKING.
20
CAPITOLO 1. ALGORITMI ON-LINE
L’avversario ignaro non conosce il contenuto iniziale della memoria veloce
dell’algoritmo M ARKING e pertanto nell’analisi dobbiamo tener conto del fatto
che i due algoritmi partono con configurazioni di memoria distinte. D’altra parte
la configurazione iniziale di memoria pu`o contribuire per una differenza di al pi`u
k page-fault.
Possiamo dunque usare la costante c nella disuguaglianza 1.2 per tener conto della differenza dovuta alla configurazione iniziale e assumere quindi che le
configurazioni iniziali siano uguali.
Suddividiamo la sequenza di richieste ρ in fasi f0 , f1 , . . . , ft , ft+1 in corrispondenza dei punti in cui l’algoritmo M ARKING smarca tutte le pagine.
Possiamo suddividere una sequenza di richieste ρ nelle fasi f0 , f1 , . . . , ft , ft+1
nel modo seguente.
Siccome all’inizio le pagine sono tutte marcate, la fase f0 non contiene nessun
page-fault e la fase f1 inizia con il primo page-fault che fa smarcare tutte le pagine.
Anche le fasi successive iniziano con un page-fault che fa smarcare tutte le
pagine ossia con il primo page-fault che avviene dopo che nella fase precedente
siano state marcate tutte le pagine.
Per come si comporta M ARKING, partendo con tutte le pagine non marcate si
arriva ad averle tutte marcate soltanto dopo che siano state richieste, e quindi marcate, esattamente k pagine distinte. Quindi se una fase fi inizia con una richiesta
rj , la fase successiva fi+1 inizia precisamente con la prima richiesta rj successiva
ad rj tale che in rj , . . . , rj vengano richieste esattamente k + 1 pagine distinte
ossia rj e` la (k + 1)-esima pagina distinta richiesta a partire dall’inizio della fase
fi .
Quindi ognuna delle fasi intermedie f1 , . . . , ft richiede esattamente k pagine
distinte e l’ultima ft+1 richiede al pi`u k pagine distinte.
Le richieste della prima fase f0 non provocano page-fault mentre le richieste
dell’ultima fase ft+1 provocano al pi`u k page-fault che possono essere conteggiati
nella costante c della disuguaglianza 1.2.
Possiamo quindi limitarci a considerare i costi delle fasi intermedie f1 , . . . , ft .
Prima di continuare cerchiamo di chiarire il comportamento di M ARKING su
di una fase mediante le seguenti osservazioni.
Osservazione 1 Quando una pagina viene richiesta in una fase essa viene marcata
e rimane in memoria veloce fino alla fine della fase. Quindi paghiamo un costo 1
per la richiesta di una pagina soltanto se e` la prima volta che essa viene richiesta
nella fase e se essa non e` gi`a in memoria.
1.6. ANALISI DELL’ALGORITMO MARKING
21
Osservazione 2 Alla fine di ogni fase la memoria contiene esattamente le k pagine distinte richieste nella fase ed esse sono tutte marcate.
La cosa si dimostra facilmente per induzione. Quando inizia la prima fase in
memoria ci sono le k pagine iniziali che sono tutte marcate (poich´e nessun pagefault e` ancora avvenuto). La prima fase inizia con un page-fault che provoca la
smarcatura di tutte le pagine preesistenti, dopo di che le k pagine richieste durante
la fase verranno marcate e rimarranno in memoria fino alla fine della fase. Supposto quindi la cosa vera per la fase i-esima, la fase (i + 1)-esima deve iniziare con
un page-fault in quanto la prima pagina richiesta nella fase successiva e` diversa
dalle k pagine richieste nella fase i-esima e che risiedono in memoria alla fine di
tale fase. Dunque la fase (i + 1)-esima inizia con un page-fault che provoca la
smarcatura di tutte le pagine preesistenti, dopo di che le k pagine richieste durante
la fase verranno marcate e rimarranno in memoria fino alla fine della fase.
Osservazione 3 La suddivisione di ρ in fasi non dipende dalle scelte casuali dell’algoritmo M ARKING ma dipende soltanto dalla configurazione iniziale della
memoria e dalla sequenza ρ stessa.
In altre parole, data la configurazione iniziale, la sequenza ρ viene divisa in
fasi nello stesso modo qualunque siano le scelte casuali di M ARKING. Inoltre, per
l’osservazione precedente, neppure l’insieme Mi di pagine presente in memoria
all’inizio di una fase fi dipende dalle scelte casuali di M ARKING: infatti M1 e`
l’insieme di pagine presenti in memoria nella configurazione iniziale mentre per
le fasi successive Mi e` semplicemente l’insieme delle pagine distinte richieste
nella fase precedente fi−1 .
Sia Mi l’insieme di pagine presenti in memoria all’inizio della fase fi ed Mi+1
l’insieme delle pagine presenti in memoria alla fine della fase fi e quindi all’inizio
della fase successiva fi+1 . Chiamiamo pagine stabili le pagine che sono presenti
sia in Mi che in Mi+1 , pagine vecchie quelle presenti in Mi ma non in Mi+1 e
pagine nuove quelle presenti in Mi+1 ma non in Mi .
Per l’osservazione 1, nel calcolare il costo di una fase possiamo limitarci a
considerare soltanto la prima richiesta di ciascuna delle k pagine distinte richieste
nella fase. Per l’osservazione 2, le k pagine distinte richieste durante la fase sono
le pagine stabili e le pagine nuove.
Quando viene richiesta per la prima volta una pagina nuova essa provoca un
page-fault e quindi la prima richiesta di una pagina nuova costa 1.
22
CAPITOLO 1. ALGORITMI ON-LINE
Sfortunatamente non e` certo che le pagine stabili siano ancora in memoria al
momento in cui vengono richieste per la prima volta, possono essere state scaricate precedentemente per far posto ad un’altra pagina. Se la pagina e` ancora in
memoria il costo e` 0 altrimenti il costo e` 1. Quindi il nostro problema principale
e` determinare il costo atteso della prima richiesta di ciascuna pagina stabile.
1.6.1
Il costo atteso della prima richiesta di una pagina stabile
Sia r la prima richiesta di una pagina stabile p durante la fase fi . Supponiamo
che prima di r nella fase siano state richieste n pagine nuove ed s pagine stabili.
Per poter calcolare il costo atteso di r ci serve la probabilit`a che la pagina p sia
ancora in memoria dopo le richieste delle n pagine nuove e delle s pagine stabili.
Osserviamo che siccome r e` la prima richiesta della pagina p se p e` in memoria
essa non e` marcata.
Che cosa sappiamo? Per definizione di pagina stabile sappiamo che le s pagine
stabili erano in Mi . Inoltre, siccome le pagine richieste vengono marcate, le s
pagine stabili richieste prima di p rimangono in memoria fino alla fine della fase e
quindi quando p viene richiesta esse sono in memoria e marcate. Dunque, quando
viene richiesta p le n pagine nuove richieste sono andate a rimpiazzare n delle
altre k − s pagine presenti in memoria all’inizio della fase (vedi Figura 1.3).
pagine stabili
stabili marcate
stabili non marcate
pagine stabili
pagine vecchie
pagine nuove pagine vecchie
pagine nuove
Figura 1.3: Contenuto della memoria all’inizio di una fase, alla prima richiesta di
una pagina stabile ed alla fine della fase.
Siccome le pagine da scaricare vengono scelte casualmente, ognuna delle k−s
pagine presenti in memoria all’inizio della fase e diverse dalle s pagine stabili
richieste prima di p ha la stessa probabilit`a n/(k − s) di essere stata rimossa.
Siccome la pagina p e` una di tali k − s pagine la probabilit`a che la sua richiesta
provochi un page-fault e` n/(k − s) e pertanto il suo costo atteso e` :
n
k−s−n
n
+0·
=
k−s
k−s
k−s
Possiamo sintetizzare questo risultato nel seguente:
E[CM ARKING (r)] = 1 ·
1.6. ANALISI DELL’ALGORITMO MARKING
23
Lemma 1.6.2 Il costo atteso della richiesta della (s + 1)-esima pagina stabile
e` n/(k − s) dove n e` il numero di pagine nuove richieste precedentemente nella
fase.
1.6.2
Limite superiore per il costo di M ARKING su una fase
Vogliamo dimostrare che il costo atteso di M ARKING su di una fase soddisfa la
diseguaglianza
E[CM ARKING (fi )] ≤ ni Hk
dove ni e` il numero totale di pagine nuove richieste nella fase.
Se ni = 0 la cosa e` ovvia: E[CM ARKING (fi )] = 0 = 0Hk . Supponiamo
quindi che nella fase fi vengano richieste ni ≥ 1 pagine nuove.
Ricordiamo che, per l’Osservazione 3, il numero ni non dipende dalle scelte
casuali dell’algoritmo ma soltanto dalla sequenza di richieste. Debbono esserci
quindi esattamente k − ni prime richieste di una pagina stabile durante la fase.
Chiaramente il numero n di pagine nuove richieste prima della richiesta di una
pagina stabile e` minore o uguale ad ni . Usando questo fatto ed il Lemma 1.6.2
possiamo maggiorare la somma dei costi attesi delle k − ni pagine stabili con:
ni
ni
ni
+
+ ... +
k
k−1
k − (k − ni − 1)
1
1
1
= ni
+
+ ... +
k k−1
ni + 1
1
1
1
+
+ ... +
≤ ni
k k−1
2
E[CM ARKING (stabili)] ≤
Siccome ogni pagina nuova costa 1, il costo delle ni pagine nuove e` ni e quindi il
costo atteso dell’intera fase risulta limitato superiormente da
E[CM ARKING (fi )] = E[CM ARKING (stabili)] + ni
1
1
1
≤ ni
+
+ . . . + + 1 = ni Hk
k k−1
2
Vale quindi il seguente:
Lemma 1.6.3 Il costo atteso di M ARKING in una fase intermedia fi e` limitato
superiormente da ni Hk dove Hk = 1 + 12 + . . . + k1 e` il k-esimo numero armonico.
24
1.6.3
CAPITOLO 1. ALGORITMI ON-LINE
Limite inferiore per algoritmi off-line su una fase
Sia A un qualsiasi algoritmo off-line e confrontiamo A con M ARKING sulla stessa
sequenza ρ. Immaginiamo la sequenza ρ suddivisa in fasi come abbiamo fatto
precedentemente e confrontiamo i due algoritmi su di una fase. Sia di il numero
di pagine che all’inizio della fase i-esima stanno nella memoria di A ma non nella
memoria di M ARKING. Notiamo che di dipende soltanto dal comportamento di
A e dalla sequenza ρ ma non dalle scelte casuali di M ARKING in quanto, per
l’Osservazione 3, le pagine in memoria di M ARKING all’inizio di una fase sono
esattamente le pagine richieste nella fase precedente (quelle iniziali per la prima
fase).
Sia ni il numero di pagine nuove richieste all’algoritmo M ARKING durante
la fase fi . Per definizione queste ni pagine non stanno in memoria di M ARKING
all’inizio della fase e quindi almeno ni −di di tali pagine non stanno nella memoria
di A all’inizio della fase. Dunque la fase fi ha un costo CA (fi ) di almeno ni − di
page-fault. Quindi:
CA (fi ) ≥ ni − di
(1.3)
Alla fine della fase fi l’algoritmo A ha in memoria di+1 pagine che non stanno
nella memoria di M ARKING. Siccome alla fine della fase M ARKING ha in memoria esattamente tutte le pagine richieste nella fase, le di+1 pagine che non stanno in
memoria di A devono essere state prima caricate in memoria da A e poi scaricate.
Quindi la fase fi costa almeno di+1 page-fault. Quindi:
CA (fi ) ≥ di+1
(1.4)
Sommando membro a membro le due diseguaglianze 1.3 e 1.4 otteniamo il
seguente limite inferiore per CA (fi )
2CA (fi ) ≥ ni − di + di+1
(1.5)
e sommando su tutte le fasi complete f1 , . . . , ft
t
2CA (f1 , . . . , ft ) ≥
t
(ni − di + di+1 ) = dt+1 − d1 +
i=1
ni
i=1
Siccome d1 = 0 (la configurazione iniziale e` la stessa) e dt+1 ≥ 0 possiamo
concludere che:
t
2CA (f1 , . . . , ft ) ≥
ni
i=1
(1.6)
1.7. UN LIMITE INFERIORE PER ALGORITMI RANDOMIZZATI
1.6.4
25
Il rapporto di competitivit`a di M ARKING
Per il Lemma 1.6.3 il costo atteso E[CM ARKING (f1 , . . . , ft )] per le fasi intermedie e`
t
E[CM ARKING (f1 , . . . , ft ) ≤ Hk
ni
(1.7)
i=1
Mettendo assieme la 1.6 con la 1.7 otteniamo la
E[CM ARKING (f1 , . . . , ft ) ≤ 2Hk CA (f1 , . . . , ft )
(1.8)
e, siccome A e` un algoritmo off-line qualsiasi, questo vale anche per A = O PT e
dunque M ARKING e` 2Hk -competitivo.
1.7
1.7.1
Un limite inferiore per algoritmi randomizzati
Un’utile tecnica
Come possiamo trovare un limite inferiore per il rapporto di competitivit`a α di un
algoritmo randomizzato contro un avversario ignaro?
Possiamo farlo scegliendo arbitrariamente una distribuzione di probabilit`a per
le sequenze ρ in input e valutando il costo atteso del miglior algoritmo on-line
(deterministico) ed il costo atteso del miglior algoritmo off-line O PT rispetto alla
distribuzione di probabilit`a scelta. Illustriamo questo metodo.
Abbiamo visto che un algoritmo randomizzato A pu`o essere definito come
una famiglia {Ax : x ∈ [0, 1]} di algoritmi on-line deterministici. Quindi, quando
diciamo che A e` α-competitivo contro un avversario ignaro intendiamo che per
ogni input ρ vale la diseguaglianza
E [CAx (ρ)] ≤ α CO PT (ρ) + c
x∈[0,1]
dove c e` una costante introdotta per tener conto della differenza nei contenuti iniziali della memoria veloce. Questo ci permette di assumere che O PT e A partano
con le stesse pagine nella memoria veloce.
Siccome questa diseguaglianza e` vera per ogni ρ essa deve essere vera anche
se consideriamo i valori attesi rispetto ad una arbitraria distribuzione di probabilit`a
p(ρ) su di un insieme qualsiasi di sequenze. In particolare, se prendiamo l’insieme
26
CAPITOLO 1. ALGORITMI ON-LINE
Rm di tutte le sequenze di richieste ρ di lunghezza |ρ| = m con una arbitraria
distribuzione di probabilit`a p(ρ) otteniamo
E [ E [CAx (ρ)]] ≤ α Em [CO PT (ρ)] + c
ρ∈R
ρ∈Rm x∈[0,1]
Se CO PT (ρ) = 0 la sequenza ρ contiene soltanto richieste per le k pagine
presenti nella configurazione iniziale di memoria e quindi anche CAx (ρ) = 0 per
ogni x e la disuguaglianza e` soddisfatta per ogni valore di α.
Consideriamo quindi soltanto sequenze ρ tali che CO PT (ρ) = 0 e quindi anche
Eρ∈Rm [CO PT (ρ)] = 0.
Possiamo trovare un limite inferiore esplicitando la diseguaglianza rispetto ad
α ottenendo
Eρ∈Rm [Ex∈[0,1] [CAx (ρ)]] − c
α≥
Eρ∈Rm [CO PT (ρ)]
Sia n = n(m) il numero massimo di lanci di monetina necessari a processare una
sequenza ρ ∈ Rm e sia B n = {0, 1}n l’insieme delle sequenze di cifre binarie
di lunghezza n. Discretizzando il calcolo del valore atteso sulle sequenze finite
y ∈ B n si ottiene:
α≥
Eρ∈Rm [ 21n
y∈B n
CAy (ρ)] − c
Eρ∈Rm [CO PT (ρ)]
e quindi, per la linearit`a del valore atteso
α≥
1
2n
Eρ∈Rm [CAy (ρ)] − c
Eρ∈Rm [CO PT (ρ)]
y∈B n
Se Ay∗ e` quello tra gli algoritmi deterministici {Ay : y ∈ B n } che rende
minimo il valore atteso Eρ∈Rm [CAy (ρ)] allora a maggior ragione abbiamo
α≥
Eρ∈Rm [CAy∗ (ρ)]
Eρ∈Rm [CO PT (ρ)]
−
c
Eρ∈Rm [CO PT (ρ)]
In particolare, se la distribuzione di probabilit`a p(ρ) scelta e` tale per cui2
lim
E [CO PT (ρ)] = ∞
m→∞ ρ∈Rm
2
Una tale distribuzione esiste sempre: ad esempio una distribuzione in cui p(ρ) = 0 soltanto
per le sequenze che richiedono a turno k + 1 pagine distinte. In realt`a Eρ∈Rm [CO PT (ρ)] pu`o non
tendere a ∞ soltanto per distribuzioni di probabilit`a p(ρ) molto particolari.
1.7. UN LIMITE INFERIORE PER ALGORITMI RANDOMIZZATI
27
allora
α ≥ m→∞
lim
Eρ∈Rm [CAy∗ (ρ)]
Eρ∈Rm [CO PT (ρ)]
ossia, per stringhe sufficientemente lunghe il rapporto di competitivit`a di un algoritmo randomizzato contro un avversario ignaro e` almeno grande quanto il rapporto tra il costo atteso del miglior algoritmo deterministico on-line ed il costo atteso
del miglior algoritmo deterministico off-line.
Notiamo che, al fine di determinare un limite inferiore di α, siamo liberi di
scegliere una distribuzione di probabilit`a p(ρ) che massimizza tale rapporto con
l’unico vincolo che limm→∞ Eρ∈Rm [CO PT (ρ)] = ∞.
1.7.2
Applicazione della tecnica al problema della paginazione
Usando il metodo generale dimostreremo il seguente risultato:
Teorema 1.7.1 Per il problema della paginazione, se A e` un algoritmo on-line
randomizzato α-competitivo contro un avversario ignaro allora α ≥ Hk .
Dimostrazione. Per il problema della paginazione sappiamo che L FD e` un algoritmo off-line ottimo. Calcoliamo quindi il limite inferiore
α ≥ m→∞
lim
Eρ∈Rm [CAy∗ (ρ)]
Eρ∈Rm [CL FD (ρ)]
nel modo seguente: scegliamo un insieme Γ di k + 1 pagine distinte e attribuiamo
uguale probabilit`a a tutte le sequenze ρ ∈ Γm ⊆ Rm costituite soltanto da richieste
di pagine in Γ e probabilit`a 0 a tutte le altre sequenze.
Quando un qualsiasi algoritmo on-line si trova a rispondere ad una generica
richiesta ri la pagina richiesta e` , con uguale probabilit`a, una delle k + 1 pagine
dell’insieme Γ. Siccome k di tali pagine stanno in memoria, la probabilit`a di un
page fault e` 1/(k + 1) e quindi, per ogni algoritmo on-line, il costo atteso per
servire ri e` 1/(k + 1) ed il costo atteso per servire tutta la sequenza ρ ∈ Rm e`
Eρ∈Rm [CAy∗ (ρ)] = m/(k + 1).
Abbiamo quindi il limite inferiore
m/(k + 1)
m→∞ E
ρ∈Rm [C L FD (ρ)]
α ≥ lim
28
CAPITOLO 1. ALGORITMI ON-LINE
Se dimostriamo che
lim
m→∞
m
(k + 1) Eρ∈Rm [CL FD (ρ)]
= Hk
(1.9)
possiamo concludere che α ≥ Hk e quindi il teorema e` dimostrato.
Per dimostrare il limite 1.9 dobbiamo studiare il comportamento di L FD sulle
sequenze ρ ∈ Γm che richiedono soltanto pagine nell’insieme prescelto Γ di k + 1
pagine. Per come abbiamo scelto la distribuzione di probabilit`a, tali sequenze
hanno tutte la stessa probabilit`a.
Dividiamo ρ in fasi stocastiche nel modo seguente: la fase i-esima e` costituita
dalle richieste di indici ji , ji + 1, . . . , ji+1 − 1 dove ji e` l’indice della richiesta con
cui inizia la fase i-esima (in particolare j1 = 1 e` l’indice della prima richiesta r1
con cui inizia la prima fase) e la fase (i + 1)-esima inizia con la richiesta di indice
ji+1 , il primo indice successivo a ji tale che in rji , . . . , rji+1 vengano richieste tutte
le k + 1 pagine distinte dell’insieme prescelto.
Notiamo che le ji sono delle variabili casuali in quanto ρ ∈ Γm e` scelta casualmente. Una fase richiede soltanto k pagine distinte e dunque se L FD effettua
un page-fault in una fase, il prossimo page-fault non pu`o avvenire prima della fase
successiva. Quindi il costo di L FD per servire ρ e` minore o uguale al numero di
fasi in cui e` suddivisa ρ. Pertanto, il costo atteso di L FD su ρ ∈ Rm rispetto alla
distribuzione di probabilit`a p(ρ) e` al pi`u pari al numero atteso di fasi in cui sono
suddivise le sequenze ρ ∈ Γm . Quindi
E [CL FD (ρ)] ≤ Em [numero fasi]
ρ∈Γ
ρ∈Rm
Siccome le variabili casuali Yi = ji+1 − ji , che rappresentano la lunghezza
delle fasi, sono indipendenti ed hanno uguale distribuzione, esse costituiscono un
processo di arrivi detto anche di Poisson e pertanto per una elementare propriet`a
dei processi di Poisson
lim
m→∞
m
= E[lunghezza di una fase]
Eρ∈Γm [numero fasi]
= E[j2 − j1 ] = E[j2 ] − 1
Intuitivamente questo dice che il numero atteso di fasi e` asintoticamente uguale
alla lunghezza della sequenza diviso la lunghezza attesa di una fase.
Abbiamo dunque dimostrato che
α≥
E[j2 ] − 1
k+1
1.7. UN LIMITE INFERIORE PER ALGORITMI RANDOMIZZATI
29
Ci resta ora soltanto da calcolare E[j2 ]. Per definizione
j2 = min{t : |{r1 , . . . , rt }| = k + 1}
Ogni ri e` uniformemente distribuito tra le k + 1 pagine dell’insieme Γ prescelto
ed e` indipendente da rj per ogni j = i. Il calcolo di E[j2 ] in questa situazione e`
noto come il problema del raccoglitore di figurine: Data una collezione di k + 1
figurine distinte, E[j2 ] rappresenta il numero atteso di figurine che un collezionista
deve acquistare prima di ottenere la serie completa di figurine, nell’ipotesi che ad
ogni acquisto tutte le figurine siano ugualmente probabili e che il risultato di un
acquisto sia indipendente da quello degli altri acquisti.
Per risolvere questo problema introduciamo le variabili casuali Zt per 1 ≤ t ≤
k + 1 ponendo
Zt = min{i : |{r1 , . . . , ri }| = t}
per cui in particolare Z1 = 1 e Zk+1 = j2 .
Tra Zt e Zt+1 la probabilit`a p di ottenere una nuova pagina e` sempre la stessa
p=
k+1−t
k+1
ad ogni passo.
Possiamo dimostrare che il valore atteso della variabile casuale Y = Zt+1 −Zt
(il numero di figurine da acquistare tra Zt e Zt+1 ) e` l’inverso dalla probabilit`a,
ossia
1
k+1
E[Y ] = =
p
k+1−t
La dimostrazione e` la seguente: Y = 1 con probabilit`a p mentre Y > 1 con
probabilit`a 1 − p. Siccome la probabilit`a di estrarre una nuova pagina e` la stessa
ad ogni passo, il valore atteso del tempo da aspettare per una nuova pagina dopo
aver effettuata una estrazione senza successo rimane sempre lo stesso3 .
Dunque E[Y ] = p · 1 + (1 − p)(1 + E[Y ]) che risolta rispetto ad E[Y ] fornisce
E[Y ] = 1/p.
Quindi
E[j2 ] = E[Zk+1 ]
k
(E[Zt+1 ] − E[Zt ])
= E[Z1 ] +
t=1
3
come non sanno quelli che continuano a scommettere al lotto sui numeri ritardatari.
30
CAPITOLO 1. ALGORITMI ON-LINE
k
(E[Zt+1 − Zt ])
= 1+
t=1
k
= 1+
k+1
t=1 k + 1 − t
k
= 1 + (k + 1)
1
j=1 j
= 1 + (k + 1)Hk
e quindi
1 + (k + 1)Hk − 1
= Hk
k+1
e questo completa la dimostrazione del teorema.
α≥
Dal teorema precedente possiamo desumere che M ARKING e` ottimale a meno di un fattore 2. McGeoch e Sleator in [33] danno un algoritmo on-line randomizzato ottimo (ossia con rapporto di competitivit`a uguale ad Hk ) contro un
avversario ignaro.
1.8
Tipi di avversari
In questa sezione vedremo altri tipi di avversari per gli algoritmi on-line e discuteremo della loro potenza relativa. Le definizioni ed i risultati sono dovuti a
Ben-David, Borodin, Karp, Tardos e Wigderson [18].
Finora abbiamo analizzato il comportamento di un algoritmo on-line randomizzato A contro un avversario ignaro B. B conosce la distribuzione di probabilit`a
degli algoritmi deterministici che costituiscono A ma deve generare una sequenza
ρ di richieste senza conoscere a priori i risultati delle scelte casuali di A e neppure
le pagine presenti in memoria di A all’inizio (in altre parole senza conoscere l’algoritmo deterministico Ax scelto da A). Abbiamo analizzato il comportamento
di A pensandolo come un gioco tra A e B. All’inizio del gioco B sceglie la lunghezza n della sequenza di richieste ρ = r1 , . . . , rn da sottoporre all’algoritmo A
dopo di che B comincia a fare le richieste e A comincia a processare tali richieste
fornendo le risposte a1 , . . . , an . Se A e` randomizzato esso effettua dei lanci di monetina per scegliere la risposta ai da fornire. Per`o B deve fare ciascuna richiesta ri
senza conoscere le risposte a1 , . . . , ai−1 precedentemente fornite dall’algoritmo.
Il gioco non e` interattivo e quindi e` poco interessante — B pu`o scegliere tutte le
1.8. TIPI DI AVVERSARI
31
richieste da fare prima che inizi il gioco. Per rendere il gioco effettivamente interattivo dobbiamo considerare avversari pi`u forti che abbiano accesso in qualche
modo ai risultati dei lanci di monetina dell’algoritmo.
Definizione 1.8.1 Un avversario adattivo B contro un algoritmo randomizzato A
e` un avversario che ha accesso alle scelte casuali precedentemente effettuate da
A. Ossia, quando B sceglie la richiesta ri esso conosce le risposte a1 , . . . , ai−1
fornite da A fino a quel momento.
Nel gioco tra A e B l’avversario non solo deve scegliere la sequenza di richieste per massimizzare il costo CA (B) pagato da A per rispondere alle richieste
fattegli da B ma deve anche mostrare che esso e` in grado di fare meglio. Per
questa ragione anche B deve processare la stessa sequenza di richieste avendo
a disposizione le stesse risorse ed a partire dalla stessa situazione iniziale di A.
Quindi anche B deve sostenere un costo CB (A) per processare a modo suo la
sequenza di richieste che esso stesso ha sottoposto ad A.
Distinguiamo tra due diversi tipi di avversari adattivi in dipendenza del modo
in cui essi processano la sequenza di richieste.
Definizione 1.8.2 Un avversario adattivo off-line B contro un algoritmo A e` un
avversario che genera una richiesta e quindi riceve la risposta di A prima di
formulare la richiesta successiva. Soltanto dopo che A abbia risposto a tutta
la sequenza di domande l’algoritmo B processa la stessa sequenza di richieste
usando la strategia off-line ottima O PT. Quindi CB (A) = CO PT (ρ) dove ρ e` la
sequenza di richieste generata da B.
Definizione 1.8.3 Un avversario adattivo on-line B contro un algoritmo A e` un
avversario che processa la sequenza di richieste contemporaneamente all’algoritmo A. L’avversario B apprende la risposta ai di A ad ogni richiesta ri soltanto
dopo che esso stesso abbia calcolato la sua risposta bi alla richiesta ri ma prima
di formulare la richiesta successiva ri+1 .
Nota 1 O PT e` certamente migliore di ogni algoritmo on-line e quindi per ogni
avversario adattivo on-line esiste un avversario adattivo off-line che funziona almeno altrettanto bene. Quindi il concetto di avversario adattivo off-line e` pi`u forte
di quello di avversario adattivo on-line.
Nota 2 Il concetto di avversario adattivo on-line e` pi`u forte di quello di avversario
ignaro.
32
CAPITOLO 1. ALGORITMI ON-LINE
Consideriamo il caso in cui A e` un algoritmo randomizzato. In questo caso
le risposte a1 , . . . , an sono variabili casuali determinate dai lanci di monetina di
A, ossia dal particolare algoritmo deterministico Ax , con x ∈ [0, 1] scelto da
A. Siccome le risposte b1 , . . . , bn calcolate da B dipendono dalle risposte di A
anch’esse sono delle variabili casuali e dunque anche B si comporta come un
algoritmo randomizzato composto dalla famiglia di algoritmi deterministici {B x :
x ∈ [0, 1]} dove x e` la sequenza di scelte casuali effettuate da A. Anche i costi
associati alle risposte a1 , . . . , an e b1 , . . . , bn sono quindi delle variabili casuali.
Dunque CA (B) e CB (A) sono variabili casuali in quanto ottenute sommando
rispettivamente i costi delle risposte ai e delle risposte bi .
Per valutare l’efficacia di A contro l’avversario B dobbiamo quindi considerare i valori attesi Ex∈[0,1] [CAx (B x )] ed Ex∈[0,1] [CB x (Ax )] di questi costi.
Definizione 1.8.4 Un algoritmo randomizzato A si dice α-competitivo contro un
avversario adattivo B se
E [CAx (B x )] ≤ α E [CB x (Ax )]
x∈[0,1]
x∈[0,1]
Nota 3 Se A e` deterministico non ci sono differenze tra avversari ignaro, adattivi
on-line ed adattivi off-line.
1.9
Competitivit`a contro i vari tipi di avversari
Un avversario adattivo off-line e` talmente forte che un algoritmo on-line che lo
affronta non pu`o trarre alcun beneficio dalla randomizzazione.
Teorema 1.9.1 Se esiste un algoritmo on-line randomizzato A che sia α-competitivo contro ogni avversario adattivo off-line allora esiste anche un algoritmo G
on-line deterministico α-competitivo.
Dimostrazione. Consideriamo le richieste-risposte tra l’avversario B e l’algoritmo A come un gioco tra due persone Bruno e Aldo: Bruno pone le domande e
Aldo risponde.
Una posizione di gioco e` una coppia di sequenze (ρk , αk ) dove ρk = r1 , . . . , rk
sono le richieste fatte da Bruno fino a quel momento e αk = a1 , . . . , ak sono le
risposte date da Aldo.
Una posizione (ρk , αk ) e` immediatamente vincente per Bruno se
CA (ρk ) > αCO PT (ρk )
1.9. COMPETITIVITA` CONTRO I VARI TIPI DI AVVERSARI
33
dove A e` la strategia (l’algoritmo) usato da Aldo per dare a Bruno le risposte
αk = a1 , . . . , ak e O PT e` l’algoritmo off-line ottimo usato da Bruno per processare
la stessa sequenza.
Una posizione (ρk , αk ) e` vincente per Bruno se esiste una strategia per Bruno
che gli permetta di raggiungere una posizione immediatamente vincente in un
numero massimo t di passi qualunque siano le risposte date da Aldo.
Come caso particolare, la posizione iniziale (ρ0 , α0 ) e` vincente per Bruno se e
solo se esiste un algoritmo adattivo off-line B tale che per ogni algoritmo on-line
deterministico G si abbia CG (B) > α CB (G).
Supponiamo, per assurdo, che Bruno abbia una strategia vincente contro Aldo
e che questa sia l’algoritmo adattivo off-line B.
Se la strategia di Aldo consiste nell’usare l’algoritmo on-line randomizzato
A = {Ax | x ∈ [0, 1]} allora CAx (B x ) > α CB x (Ax ) per ogni Ax e quindi
E[CAx (B x )] > α E[CB x (Ax )]
e dunque nessun algoritmo on-line randomizzato pu`o essere α-competitivo contro
un avversario adattivo off-line.
Dunque Bruno non pu`o avere una strategia vincente.
Dimostriamo che allora Aldo deve avere una strategia vincente (ossia che
esiste un algoritmo deterministico che e` α-competitivo contro ogni avversario
adattivo off-line).
Una posizione (ρk , αk ) e` vincente per Bruno se e solo se o e` immediatamente vincente, oppure per qualunque risposta ak+1 che possa dare Aldo esiste una
richiesta rk+1 tale che la configurazione (ρk rk+1 , αk ak+1 ) sia vincente. La parte
solo se di questa affermazione deriva immediatamente dalla definizione di posizione vincente. La parte se invece e` vera soltanto nell’ipotesi che Aldo possa dare
soltanto un numero finito di risposte diverse (altrimenti potrebbe non esistere un
limite superiore t per il numero di passi necessari ad arrivare ad una posizione
immediatamente vincente).
Quindi, se (ρk , αk ) non e` vincente per Bruno allora per ogni possibile richiesta
rk+1 proponibile da Bruno esiste una risposta ak+1 che Aldo pu`o dare in modo
tale che anche (ρk rk+1 , αk ak+1 ) non sia vincente per Bruno. La scelta di tale ak+1
e` quindi una strategia vincente per Aldo e tale strategia e` l’algoritmo G on-line
deterministico α-competitivo cercato.
Nota 4 La dimostrazione precedente non e` costruttiva in quanto non dice come
l’algoritmo G determina effettivamente le risposte ai ma dice soltanto che tali
34
CAPITOLO 1. ALGORITMI ON-LINE
risposte esistono. La dimostrazione pu`o essere resa costruttiva (vedi [18]) ma noi
non entreremo nei dettagli tecnici di tale costruzione.
Teorema 1.9.2 Se un algoritmo on-line randomizzato A e` α-competitivo contro
ogni avversario adattivo on-line ed esiste qualche algoritmo on-line randomizzato
H che sia β-competitivo contro qualsiasi avversario ignaro allora A e` anche
αβ-competitivo contro qualsiasi avversario adattivo off-line.
Dimostrazione. Siano A = {Ax : x ∈ [0, 1]} e H = {Hy : y ∈ [0, 1]} i due
algoritmi on-line randomizzati e sia B un avversario adattivo off-line per l’algoritmo A. Scriveremo B x per ricordare che il comportamento di B dipende dai
lanci di monetina di A. Ricaveremo un paio di disuguaglianze che, prese assieme,
dimostrano il teorema.
Consideriamo dapprima B giocare contro A mentre H partecipa al gioco soltanto osservando a distanza ed elaborando la stessa sequenza di richieste che B
propone ad A. Rispetto ad H l’avversario B si comporta come un avversario
ignaro e quindi vale la diseguaglianza
E[CHy (B x )] ≤ β CB x (Ax )
y
qualunque sia la scelta di x ∈ [0, 1] effettuata da A. Prendendo i valori attesi di
entrambi i termini otteniamo la prima disuguaglianza
E E[CHy (B x )] ≤ β E[CB x (Ax )]
x y
x
(1.10)
Consideriamo ora il caso in cui B ed H si coalizzano contro A formando un
avversario adattivo on-line C che genera le richieste usando la stessa strategia di
B ma calcola le sue risposte utilizzando la strategia di H. Il costo di C contro Ax
e` quindi CHy (B x ), in quanto C usa H per calcolare le risposte; invece il costo di
Ax contro C e` CAx (B x ) dato che C usa B per generare le richieste. Siccome A e`
α-competitivo contro ogni avversario adattivo on-line, la disuguaglianza
[CAx (B x )] ≤ α E[CHy (B x )]
E
x
x
vale qualunque sia la scelta di y ∈ [0, 1] effettuata da H. Prendendo i valori attesi
di entrambi i termini otteniamo
E
E[CAx (B x )] ≤ α E
E[CHy (B x )]
y x
y x
1.9. COMPETITIVITA` CONTRO I VARI TIPI DI AVVERSARI
35
Siccome il primo termine non dipende da y possiamo eliminare l’operatore di valore atteso rispetto ad y mentre nel secondo termine possiamo scambiare l’ordine
dei due operatori ottenendo la seconda diseguaglianza
E[CAx (B x )] ≤ α E E[CHy (B x )]
x
x y
(1.11)
Mettendo assieme le disuguaglianze 1.10 e 1.11 otteniamo la disuguaglianza
E[CAx (B x )] ≤ αβ E[CB x (Ax )]
x
x
che dimostra che A e` αβ-competitivo contro qualsiasi avversario adattivo offline.
Mettendo assieme i due teoremi precedenti possiamo ricavare i seguenti corollari
Corollario 1.9.3 Nelle stesse ipotesi del teorema 1.9.2 esiste un algoritmo on-line
deterministico che e` αβ-competitivo.
Esempio 1.9.4 Per il problema della paginazione abbiamo dimostrato un limite
inferiore k per la competitivit`a di ogni algoritmo deterministico on-line ed inoltre
sappiamo che esiste un algoritmo on-line randomizzato H che e` Hk -competitivo
contro ogni avversario ignaro (McGeoch e Sleator in [33]). Sia A un qualsiasi algoritmo on-line randomizzato γ-competitivo contro ogni avversario adattivo on-line. Per il Corollario precedente esiste un algoritmo G deterministico
γHk -competitivo. Siccome k e` un limite inferiore γHk ≥ k e quindi γ ≥ k/Hk .
Dunque k/Hk e` un limite inferiore per il rapporto di competitivit`a di ogni
algoritmo di paginazione on-line randomizzato contro un avversario adattivo online.
Corollario 1.9.5 Se esiste un algoritmo A on-line randomizzato α-competitivo
contro ogni avversario adattivo on-line allora esiste anche un algoritmo on-line
deterministico α2 -competitivo.
Il Corollario 1.9.5 discende dal Teorema 1.9.2 poich´e ogni algoritmo A che risulti α-competitivo contro ogni avversario adattivo on-line e` anche α-competitivo
contro ogni avversario ignaro. Basta quindi prendere H = A e β = α nell’enunciato del Teorema.
Il Corollario 1.9.5 e` sorprendente: dice che per mostrare che esiste un algoritmo competitivo deterministico basta costruire un algoritmo randomizzato che sia
competitivo contro un avversario adattivo on-line.
36
1.10
CAPITOLO 1. ALGORITMI ON-LINE
Analisi dell’algoritmo R ANDOM
Nelle sezioni precedenti abbiamo considerato l’algoritmo di paginazione randomizzato M ARKING e abbiamo dimostrato che esso e` 2Hk -competitivo contro ogni
avversario ignaro. R ANDOM e` un algoritmo di paginazione randomizzato pi`u
semplice di M ARKING: quando incontra un page-fault sceglie casualmente la
pagina da scaricare tra tutte le pagine presenti in memoria. Mostreremo che
Teorema 1.10.1 (Raghavan e Snir [34]) R ANDOM e` k-competitivo contro ogni
avversario adattivo on-line.
Dimostrazione. Indichiamo con B un avversario adattivo on-line. La dimostrazione si basa su di una funzione di potenziale Φ che misura la similarit`a tra il
contenuto della memoria veloce di B e quello della memoria veloce di R ANDOM.
Pi`u precisamente, siano Bi ed Ri le pagine presenti nella memoria di B e
rispettivamente di R ANDOM dopo aver servito la richiesta ri e B0 ed R0 quelle
iniziali. Allora Φi = |Bi ∩ Ri | e` il numero di pagine comuni ai due algoritmi.
Poniamo
Xi = CR ANDOM (ri ) − k (CB (ri ) + Φi − Φi−1 )
Sommando gli Xi relativi a tutta la sequenza di richieste r1 , . . . , rm proposte
dall’avversario B otteniamo
m
i=1
Xi = CR ANDOM (B) − k (CB (R ANDOM) + Φm − Φ0 )
e quindi
m
CR ANDOM (B) = k CB (R ANDOM) + k (Φm − Φ0 ) +
Xi
i=1
Se assumiamo che gli algoritmi partano con la stessa configurazione iniziale
della memoria veloce allora Φ0 = k. Siccome Φm ≤ k la differenza di potenziale
Φm − Φ0 e` minore o uguale a 0. Di conseguenza
m
CR ANDOM (B) ≤ k CB (R ANDOM) +
Xi
i=1
da cui, per la linearit`a del valore atteso
m
E[CR ANDOM (B)] ≤ k E[CB (R ANDOM)] +
E[Xi ]
i=1
1.10. ANALISI DELL’ALGORITMO RANDOM
37
` kSe proviamo che m
i=1 E[Xi ] ≤ 0 avremo quindi dimostrato che R ANDOM e
competitivo contro B.
Per dimostrare la diseguaglianza m
i=1 E[Xi ] ≤ 0 dimostreremo che ciascun
addendo E[Xi ] della sommatoria e` minore o uguale a 0 indipendentemente dagli
altri addendi, ossia che
E[Xi | Bi−1 , Ri−1 ] ≤ 0
qualunque siano gli insiemi di pagine Bi−1 ed Ri−1 presenti nelle memorie veloci
dei due algoritmi prima di processare ri .
Consideriamo quattro casi distinti a seconda che la pagina p richiesta da ri
appartenga o meno a Bi−1 e/o ad Ri−1 .
1. p ∈ Bi−1 e p ∈ Ri−1 .
In questo caso CR ANDOM (ri ) = CB (ri ) = 0. Siccome nessuno dei due
algoritmi modifica la sua memoria Φi − Φi−1 = 0 e quindi
E[Xi | Bi−1 , Ri−1 ] = 0
2. p ∈ Bi−1 e p ∈ Ri−1 .
In questo caso solo R ANDOM ha un page-fault e quindi CR ANDOM (ri ) = 1
e CB (ri ) = 0. R ANDOM sceglie la pagina da eliminare casualmente tra le k
pagine di Ri−1 e quindi sceglier`a una pagina appartenente anche a Bi−1 con
probabilit`a Φi−1 /k. Se la pagina eliminata appartiene a Bi−1 viene eliminata
una pagina comune alle due memorie e ne viene aggiunta una (la pagina p
che diventa comune). Quindi Φi − Φi−1 = 0 con probabilit`a Φi−1 /k. Se
invece la pagina eliminata non appartiene a Bi−1 allora il numero di pagine
comuni aumenta di 1. Dunque Φi − Φi−1 = 1 con probabilit`a (k − Φi−1 )/k.
Pertanto
E[Φi − Φi−1 | Bi−1 , Ri−1 ] = 0 ·
k − Φi−1
Φi−1
Φi−1
+1·
=1−
k
k
k
e pertanto
E[Xi | Bi−1 , Ri−1 ] = 1 − k(0 + 1 −
Φi−1
) = 1 − k + Φi−1
k
Siccome c’`e almeno la pagina p che non e` in comune a Bi−1 ed Ri−1
sappiamo che Φi−1 < k e quindi
E[Xi | Bi−1 , Ri−1 ] ≤ 0
38
CAPITOLO 1. ALGORITMI ON-LINE
3. p ∈ Bi−1 e p ∈ Ri−1 .
In questo caso CR ANDOM (ri ) = 0 e CB (ri ) = 1. Qualsiasi cosa faccia B
il potenziale non pu`o diminuire: o rimane quello di prima oppure aumenta
di 1. Quindi Φi − Φi−1 ≥ 0 ed
Xi = 0 − k(1 + Φi − Φi−1 ) < 0
Dunque
E[Xi | Bi−1 , Ri−1 ] < 0
4. p ∈ Bi−1 e p ∈ Ri−1 .
In questo caso CR ANDOM (ri ) = 1 e CB (ri ) = 1. A differenza dei casi
precedenti, pu`o succedere che il potenziale aumenti di 1, rimanga invariato
oppure diminuisca di 1.
Stimiamo la probabilit`a che il potenziale non diminuisca. A questo scopo
sia q la pagina scaricata da B. Se la pagina q non e` in Ri−1 allora Φi −Φi−1 ≥
0 con probabilit`a 1. Se la pagina q e` in Ri−1 l’algoritmo R ANDOM pu`o
scegliere di scaricare tale pagina q con probabilit`a 1/k (nel qual caso il
potenziale non cambia).
Quindi la probabilit`a che il potenziale non diminuisca e` in ogni caso maggiore o uguale di 1/k e la probabilit`a che diminuisca e` minore o uguale di
1 − 1/k. Dunque
E[Φi − Φi−1 | Bi−1 , Ri−1 ] ≥ 0 ·
1
1
1
+ (−1) · (1 − ) = − 1
k
k
k
e tanto basta per concludere che
E[Xi | Bi−1 , Ri−1 ] ≤ 1 − k(1 +
1
− 1) = 0
k
Quindi E[Xi | Bi−1 , Ri−1 ] ≤ 0 per ogni Bi−1 ed Ri−1 e dunque tale disuguaglianza
vale anche per ogni addendo E[Xi ] della sommatoria m
i=1 E[Xi ]. Pertanto
E[CR ANDOM (B)] ≤ k E[CB (R ANDOM)]
e quindi R ANDOM e` k-competitivo contro ogni avversario adattivo on-line.
1.11. PROBLEMA DEI K SERVER
1.11
39
Problema dei k server
Finora abbiamo trattato argomenti relativi agli algoritmi on-line per il problema
della paginazione. In questa e nelle successive sezioni considereremo un altro problema famoso per la sua apparente semplicit`a, il problema dei k server. Vedremo
che si conosce molto meno per il problema dei k server di quello che si conosce
del problema della paginazione, bench´e esso sia stato intensamente studiato negli
ultimi anni.
Un esempio pratico del problema dei k server e` il seguente: k camerieri debbono servire dei clienti seduti ai tavoli di un grande ristorante. Quando un cliente
deve ordinare schiaccia un apposito pulsante sul tavolo. Il capo cameriere riceve
la richiesta e deve decidere on-line quale cameriere deve recarsi a quel tavolo a
raccogliere l’ordinazione. La funzione costo da minimizzare e` la somma delle
distanze percorse dai k camerieri.
Per dare una formulazione generale del problema dei k server dobbiamo usare
il concetto di spazio metrico:
Definizione 1.11.1 Uno spazio metrico e` un insieme V di punti dotato di una
funzione distanza d(u, v) tale che
1. d(u, v) ≥ 0 per ogni u, v ∈ V
2. d(u, v) = 0 se e solo se u = v
3. d(u, v) = d(v, u) per ogni u, v ∈ V
4. d(u, v) + d(v, w) ≥ d(u, w) per ogni u, v, w ∈ V .
In altre parole la distanza d(u, v) e` non negativa, e` positiva tra punti distinti, e` simmetrica e soddisfa la disuguaglianza triangolare. Spesso, ma non necessariamente,
nel problema dei k server lo spazio V e` finito.
Definizione 1.11.2 (Problema dei k server) I dati del problema sono uno spazio
metrico V , un insieme di k “server” posizionati in punti di V ed una successione
di richieste r1 , r2 , . . . , rn , ciascuna delle quali e` un punto di V . Ad ogni richiesta
bisogna muovere uno dei server dal punto in cui esso si trova al punto richiesto.
Lo scopo e` minimizzare la distanza totale percorsa da tutti i server per servire
tutte le richieste.
40
CAPITOLO 1. ALGORITMI ON-LINE
Diremo configurazione la lista a1 , . . . , ak delle k posizioni in cui si trovano i
server (ammetteremo la possibilit`a che pi`u server si possano trovare nello stesso
punto, ossia che ai = aj con i = j).
La soluzione ottima del problema dei k server si pu`o calcolare off-line usando
la programmazione dinamica (e quindi in tempo polinomiale). E` anche possibile
trasformare il problema in un problema di flusso su di una opportuna rete di flusso.
Asserzione 1 Per ogni sequenza di richieste, siano esse da soddisfare on-line od
off-line, basta muovere un solo server per ciascuna richiesta.
Dimostrazione. Supponiamo che per rispondere ad una richiesta rt venga mosso
il server i e che, allo scopo di minimizzare il costo totale, venga mosso anche
il server j in qualche altra posizione (ad esempio per coprire la zona lasciata
scoperta dal server i o per qualche altra considerazione strategica). Se il server j
non verr`a pi`u usato il costo del suo movimento e` certamente sprecato. Assumiamo
quindi che il server j venga usato per una successiva richiesta rs . In questo caso,
per la disuguaglianza triangolare, il server j avrebbe potuto andare direttamente
in rs partendo dalla sua posizione originaria con un costo non maggiore di quello
pagato passando per la posizione intermedia da lui raggiunta dopo la richiesta
rt .
Grazie alla disuguaglianza triangolare possiamo quindi limitarci a muovere un
solo server alla volta, anche se qualche volta, per facilitare l’analisi considereremo
algoritmi che muovono contemporaneamente pi`u di un server.
1.11.1
Casi particolari del problema dei k server
Paginazione Il problema della paginazione e` un caso particolare del problema dei
k server in cui i server sono le k posizioni in memoria veloce, V e` l’insieme
di pagine e d(u, v) = 1 per ogni u = v. In altre parole la paginazione e`
proprio il problema dei k server con la distanza uniforme.
Disco con due testine Abbiamo un disco magnetico rotante su cui sono registrate
delle tracce concentriche. Due testine di lettura/scrittura possono muoversi
radialmente sulle tracce. Le due testine sono posizionate una di fronte all’altra per cui non possono sovrapporsi o incrociarsi. Il costo e` la somma
delle distanze lineari che le due testine debbono percorrere per servire tutta
la sequenza di richieste di I/O.
1.11. PROBLEMA DEI K SERVER
1.11.2
41
Riassunto dei risultati noti
Alcuni risultati per il problema della paginazione possono essere generalizzati al
problema dei k server. I risultati positivi non si possono generalizzare direttamente
ma, siccome la paginazione e` un caso particolare del problema dei k server, i limiti
inferiori per la paginazione sono anche limiti inferiori per il problema dei k server.
Teorema 1.11.3 (Manasse-McGeoch-Sleator [32]) Per il problema dei k server
non esiste un algoritmo α-competitivo con α < k qualunque sia lo spazio metrico.
La dimostrazione generale e` simile a quella per la metrica uniforme (quella
per il problema della paginazione).
Per il problema della paginazione abbiamo un algoritmo k-competitivo. L’esistenza di un algoritmo k-competitivo per il problema generale dei k server e`
invece ancora un problema aperto. Per un certo tempo si ignorava persino se esistesse una algoritmo f (k)-competitivo per qualche funzione f (k) di k. Il primo
risultato in questo senso e` dovuto a Fiat, Rabani e David che hanno dimostrato il
seguente teorema per induzione su k
Teorema 1.11.4 (Fiat-Rabani-David [25]) Per il problema generale dei k server
esiste un algoritmo f (k)-competitivo con f (k) = O(k k ).
Sono stati proposti un gran numero di risultati parziali tra i quali:
Risultati relativi a specifici valori di k
k = 1 Questo caso e` banale in quanto non abbiamo alcuna scelta su quale server
mandare. Quindi ogni ragionevole algoritmo e` 1-competitivo.
k = 2 Esiste un algoritmo 2-competitivo per questo caso, dovuto a Manasse, McGeoch e Sleator [32]. Anche per questo piccolo valore di k l’algoritmo non
e` banale. Si sa che anche l’algoritmo della funzione lavoro e` 2-competitivo
in questo caso (vedi [22]). Per il problema dei 2 server si e` anche lavorato per sviluppare algoritmi competitivi veloci, nel senso che essi richiedono
soltanto una quantit`a costante di lavoro per ogni richiesta (vedi [27, 19, 29]).
k = |V | − 1 In questo caso esiste un algoritmo BALANCE che vedremo in seguito
e che e` k-competitivo [32]. Si sa anche che una variazione di BALANCE e`
10-competitiva per il caso k = 2 (Irani e Rubinfield [27]).
42
CAPITOLO 1. ALGORITMI ON-LINE
Risultati per spazi metrici particolari
paginazione Per la paginazione abbiamo visto un algoritmo k-competitivo.
rette, alberi, reti resistive Per tutte queste configurazioni si sa che esiste un algoritmo k-competitivo [20], [23].
cerchio Per punti su di un cerchio e` stato proposto un algoritmo k 3 -competitivo.
Ora si conosce un risultato generale dovuto a Chroback e Larmore [22] che
nel 1992 hanno proposto un algoritmo generale, detto della funzione lavoro, ed
hanno dimostrato che esso e` 2-competitivo per k = 2. Soltanto alcuni anni dopo
Koutsoupias and Papadimitriou [30] hanno dimostrato che l’algoritmo della funzione lavoro e` (2k − 1)-competitivo; e` un problema aperto se tale algoritmo sia in
realt`a k-competitivo.
1.11.3
Alcune semplici strategie.
L’algoritmo goloso G REEDY
L’algoritmo pi`u banale per il problema dei k server e` G REEDY che serve ogni
richiesta usando sempre il server pi`u vicino. Il seguente esempio illustra il principale difetto di G REEDY.
Consideriamo due server 1 e 2 e due punti a e b posti sulla retta reale (con la
metrica Euclidea) nel modo seguente:
1
2
a
b
Prendiamo la sequenza di richieste abababababab . . .. G REEDY serve tutte le
richieste usando il server 2 in quanto il server 2 e` sempre quello pi`u vicino sia ad
a che a b. Un algoritmo che muove il server 1 in a alla prima richiesta ed il server
2 in b alla seconda richiesta risponde a tutte le successive richieste con costo 0.
Quindi G REEDY non e` α-competitivo per nessun α.
L’algoritmo BALANCE
L’algoritmo BALANCE tiene conto della distanza totale Di percorsa da ciascun
server i e cerca di pareggiare tali distanze tra tutti i server. Quando arriva una
richiesta r essa viene servita da un server i per il quale la quantit`a Di + d(ai , r) e`
1.11. PROBLEMA DEI K SERVER
43
minima dove Di e` la distanza percorsa fino a quel momento dal server i e d(ai , r)
e` la distanza che il server i deve percorrere per servire la richiesta r muovendosi
dalla posizione ai in cui si trova. L’algoritmo BALANCE e` k-competitivo se |V | =
k + 1 ma in generale non e` α competitivo per nessun α. Il seguente controesempio
e` dovuto a Jon Kleingerg. Consideriamo due server (k = 2) che si muovono
sullo spazio costituito dai quattro vertici A, B, C, D di un rettangolo di altezza
h = d(A, B) = d(C, D) molto minore della base b = d(B, C) = d(A, D) come
illustrato nella seguente figura:
B
C
h
b
A
D
Se all’inizio i server sono in C e D e la sequenza di richieste e` la sequenza
ciclica ABCDABCD . . ., il costo di BALANCE e` b per ogni richiesta mentre
quello di O PT e` h per ogni richiesta tranne la prima.
Una piccola variazione di BALANCE che minimizza Di + 2d(ai , r) invece di
Di + d(ai , r) risulta invece 10-competitiva per k = 2 (vedi [27]).
L’algoritmo randomizzato H ARMONIC
Bench´e l’algoritmo G REEDY non funzioni molto bene, l’intuizione di usare il
server pi`u vicino risulta utile se la randomizziamo un po’. Invece di usare sempre
il server pi`u vicino scegliamo il server da usare in modo casuale con probabilit`a
inversamente proporzionale alla sua distanza dal punto richiesto.
Indicato con d−1 (ai , r) = d(a1i ,r) l’inverso della distanza d(ai , r) del server i
dal punto richiesto r, la probabilit`a con cui scegliamo un server i e` quindi
p(i) =
d−1 (ai , r)
k
−1
j=1 d (aj , r)
dove la sommatoria e` estesa a tutti i k server.
L’algoritmo che si ottiene in questo modo viene detto H ARMONIC ed e` competitivo come affermato nel seguente
Teorema 1.11.5 (Grove [26]) H ARMONIC e` ( 45 k2k − 2k)-competitivo rispetto ad
ogni avversario adattivo on-line.
44
CAPITOLO 1. ALGORITMI ON-LINE
Prima di questo risultato si sapeva soltanto che l’algoritmo H ARMONIC era
3
-competitivo per k = 3 e 3-competitivo per k = 2 (vedi [21]).
Si conosce inoltre un limite inferiore per questo algoritmo. Per alcuni particolari avversari B adattivi on-line si pu`o dimostrare che
17000
E[CH ARMONIC (B)] =
k+1
2
E[CB (H ARMONIC)]
`
Non possiamo quindi sperare che esso sia meglio di k+1
2 -competitivo. E un
problema aperto se il rapporto di competitivit`a di H ARMONIC sia uguale a tale
limite inferiore.
Infine, ricordiamo che se conosciamo un algoritmo randomizzato α-competitivo possiamo ricavare un algoritmo on-line deterministico α2 -competitivo. Possiamo quindi trovare un algoritmo deterministico ( 54 k2k − 2k)2 -competitivo (ma
l’algoritmo che otteniamo in questo modo e` tutt’altro che efficiente).
1.12
Un algoritmo k competitivo sugli alberi
I risultati di questa sezione sono dovuti a Chrobak e Larmore [20]. Sia (V, E) un
albero (grafo non orientato aciclico) con una lunghezza positiva d(e) associata a
ciascun arco e. Possiamo rappresentare ogni arco e con un segmento di lunghezza
d(e).
Sia V lo spazio metrico costituito dall’insieme di punti su tali segmenti con distanza d(u, v) la lunghezza del cammino da u a v misurata sulla rappresentazione
dell’albero.
Assumiamo che le richieste siano dei punti arbitrari di V . L’algoritmo che
vedremo si pu`o anche applicare al caso discreto in cui tutte le richieste sono sui
vertici dell’albero ma per comodit`a tratteremo il caso continuo.
Siccome un albero e` un grafo aciclico vi e` un unico cammino che congiunge
il punto ai in cui si trova un server i al punto in cui e` localizzata una richiesta r.
Questo fatto giustifica la seguente
Definizione 1.12.1 Un server i si dice attivo quando viene effettuata la richiesta
r se lungo il cammino da ai ad r non ci sono altri server. Nel caso in cui pi`u
server si trovino nello stesso punto (ad esempio in un vertice) soltanto uno di essi
pu`o essere attivo (la scelta pu`o essere resa deterministica ordinando i server e
prendendo il primo).
1.12. UN ALGORITMO K COMPETITIVO SUGLI ALBERI
45
L’algoritmo ATTIVI e` facile da descrivere: per servire una richiesta r tutti i
server attivi si muovono verso r alla stessa velocit`a e ciascuno di essi si ferma
quando:
1. diventa inattivo perch`e oscurato da un altro server che si frappone tra di esso
e la richiesta r;
2. raggiunge la destinazione r, nel qual caso si fermano anche tutti gli altri
server.
1.12.1
Dimostrazione della k-competitivit`a
Useremo una funzione potenziale per dimostrare che per ogni sequenza di richieste
ρ = r1 , . . . rn
vale la diseguaglianza
CATTIVI (ρ) ≤ k CO PT (ρ)
La funzione potenziale dipende dalla configurazione A = a1 , . . . , ak in cui si
trovano i server di ATTIVI e la configurazione B = b1 , . . . , bk in cui si trovano i
server di O PT ed e` definita nel modo seguente:
Φ=
d(ai , aj ) + k D(A, B)
i<j
dove i<j d(ai , aj ) misura la dispersione dei server di ATTIVI mentre D(A, B)
misura la distanza dei server di ATTIVI dai server di O PT ossia e` il costo minimo per spostare i server di ATTIVI dalla configurazione A in cui si trovano alla
configurazione B in cui si trovano i server di O PT e quindi
k
D(A, B) = min
π
d(aπ(i) , bi )
i=1
dove il minimo e` calcolato su tutte le permutazioni π di a1 , . . . , ak .
Immaginiamo che ogni richiesta rt venga processata prima da O PT e subito
˜ t il valore della funzione potenziale dopo che O PT abbia
dopo da ATTIVI. Sia Φ
processato la richiesta rt ma prima che tale richiesta sia stata processata da ATTIVI
e sia Φt il valore della funzione potenziale dopo che sia ATTIVI che O PT abbiano
processato la richiesta rt .
46
CAPITOLO 1. ALGORITMI ON-LINE
Dimostreremo che valgono le due diseguaglianze
˜ t − Φt−1 ≤ k C
Φ
O PT (rt )
e
˜ t ≤ −C
Φt − Φ
ATTIVI (rt )
dalle quali discende immediatamente che
Φt − Φt−1 ≤ k CO PT (rt ) − CATTIVI (rt )
e, sommando su tutti i t
Φn − Φ0 ≤ k CO PT (ρ) − CATTIVI (ρ)
e siccome Φn ≥ 0
CATTIVI (ρ) ≤ k CO PT (ρ) + Φ0
Assumendo che all’inizio i server dei due algoritmi si trovino tutti ammassati
nello stesso punto abbiamo Φ0 = 0 e quindi
CATTIVI (ρ) ≤ k CO PT (ρ)
che prova la k-competitivit`a di ATTIVI. Ci rimane quindi soltanto da provare il
seguente Lemma 1.12.2.
Lemma 1.12.2 Sia Φt−1 il potenziale prima che i due algoritmi abbiano proces˜ t il potenziale dopo che soltanto O PT abbia processato rt e
sato la richiesta rt , Φ
Φt il potenziale dopo che entrambi gli algoritmi abbiano processato rt . Valgono
le due disequazioni:
˜ t − Φt−1 ≤ k C
Φ
O PT (rt ),
˜ t ≤ −C
Φt − Φ
ATTIVI (rt ).
(1.12)
(1.13)
Dimostrazione. Consideriamo dapprima cosa succede quando l’algoritmo O PT
muove un server b per soddisfare la richiesta r percorrendo la distanza d =
d(b , r) (ricordiamo che possiamo assumere che O PT muova un solo server alla
volta). Siccome le posizioni dei server di ATTIVI non cambiano il primo addendo i<j d(ai , aj ) della funzione potenziale non cambia. Consideriamo quindi la
variazione ∆D del secondo addendo.
Il costo minimo D(A, B) per muovere i server di ATTIVI nelle posizioni dei
server di O PT pu`o aumentare al pi`u della distanza d percorsa dall’unico server b che si muove. Infatti prima che O PT processi r abbiamo D(A, B) =
1.12. UN ALGORITMO K COMPETITIVO SUGLI ALBERI
47
k
i=1
d(aπ(i) , bi ) dove π e` una permutazione che lo rende minimo. Dopo che
O PT ha spostato b in r esso si trova nella configurazione B = B − b + r e
D(A, B ) ≤ ki=1 d(aπ(i) , bi ) in quanto non e` detto che π sia la permutazione che
lo minimizza. Ma
k
d(aπ(i) , bi ) = D(A, B) + d(aπ( ) , r) − d(aπ( ) , b )
i=1
in quanto O PT sposta soltanto il server b in r. Per la disuguaglianza triangolare
d(aπ( ) , r) ≤ d(aπ( ) , b ) + d(b , r) = d(aπ( ) , b ) + d
e quindi ∆D = D(A, B ) − D(A, B) ≤ d(aπ( ) , r) − d(aπ( ) , b ) ≤ d.
Dunque
˜ t − Φt−1 = k ∆D ≤ k d = k C
Φ
O PT (rt )
il che prova la diseguaglianza 1.12 del Lemma 1.12.2.
Vediamo ora come cambia la funzione potenziale quando ATTIVI muove i suoi
server. Per comodit`a di esposizione numeriamo i server di ATTIVI in modo tale
che a1 , a2 , . . . , aq siano i server attivi e aq+1 , . . . , ak siano quelli inattivi. I server
attivi si muovono tutti alla stessa velocit`a verso la richiesta.
Dividiamo i percorsi in passi in corrispondenza degli istanti in cui uno o pi`u
dei server attivi diventano inattivi e calcoliamo la variazione di potenziale relativa
ad un singolo passo. La Figura 1.4 e` un esempio di tale suddivisione in passi.
Calcoliamo dapprima la variazione ∆D di D(A, B). Sia ah il server che nel
calcolo di D(A, B) e` abbinato al server b spostato da O PT per servire la richiesta
rt . Siccome b si trova in rt , possiamo assumere che ah sia un server attivo (se esso
fosse inattivo potremmo scambiarlo con il server attivo che lo copre ottenendo un
valore di D(A, B) minore o uguale).
Sia d lo spostamento dei server attivi in uno dei passi. La distanza tra ah e b
diminuisce di d mentre la distanza tra ogni altro server attivo ed il server di O PT
ad esso abbinato in D(A, B) pu`o al pi`u aumentare di d. Dunque
∆D ≤ (q − 1)d − d = (q − 2)d
Per calcolare la variazione ∆S di S =
1. La parte ∆SI = ∆
q<i<j
i<j
d(ai , aj ) dividiamola in tre parti:
d(ai , aj ) relativa alle distanze tra server inattivi.
Siccome i server inattivi non si muovono
∆SI = 0
48
CAPITOLO 1. ALGORITMI ON-LINE
3
3
5
5
2
2
r
r
4
6
1
6
1
4
stato iniziale
Passo 1
5
3
3
5
2
r
2
4
6
1
6
r
4
1
Passo 3
Passo 2
Figura 1.4: Suddivisione in passi dello spostamento contemporaneo dei server
attivi (in rosso) verso la posizione richiesta (in verde). I server inattivi (in blu)
rimangono fermi.
2. La parte ∆SA = ∆
i<j≤q
d(ai , aj ) relativa alle distanze tra server attivi.
Siccome tutti i server attivi si avvicinano alla posizione della richiesta di
una distanza d, la distanza tra due server attivi diminuisce di 2d. Quindi
∆SA = −2d
3. La parte ∆SAI = ∆
dai server inattivi.
i≤q<j
q
2
= −d q(q − 1)
d(ai , aj ) relativa alle distanze dei server attivi
1.12. UN ALGORITMO K COMPETITIVO SUGLI ALBERI
49
Per ognuno dei k − q server inattivi vi e` un server attivo che si allontana da
esso e q − 1 server attivi che gli si avvicinano. Quindi
∆SAI = (k − q)(d − (q − 1)d) = (k − q)(2 − q)d
Sommando k∆D con le tre parti ∆SI , ∆SA e ∆SAI di ∆S otteniamo la
variazione di potenziale relativa ad un passo
∆Φ ≤ d[k(q − 2) − q(q − 1) + (k − q)(2 − q)]
= d[kq − 2k − q 2 + q + 2k − kq − 2q + q 2 )]
= −dq
Siccome dq e` esattamente il costo pagato da ATTIVI per muovere i q server attivi della distanza d, possiamo dire che ad ogni passo vi e` una diminuzione del
potenziale almeno pari al costo pagato da ATTIVI. Sommando su tutti i passi p
otteniamo
˜t ≤ −
Φt − Φ
dp qp = −CATTIVI (ri )
p
che e` la disuguaglianza 1.13 del Lemma 1.12.2 che volevamo provare.
Esercizio 1 Considerare un albero a forma di stella con un vertice centrale c collegato ad n vertici periferici con n archi di lunghezza 1/2 su cui si muovono k
server. Interpretare gli n vertici periferici come l’insieme delle pagine in un problema di paginazione ed i k server come celle di memoria veloce. Descrivere
l’algoritmo di paginazione, detto F WF (per Flush When Full), che si ottiene e
compararlo con M ARKING. Dire come si possa facilmente modificare F WF per
risolvere il problema di paginazione generalizzato in cui il costo di scambiare due
pagine p e q in memoria veloce non e` 1 ma f (p) + f (q) con f (x) ≥ 0 per ogni
pagina x.
Esercizio 2 Dimostrare che
k
D(A, B) = min
π
d(aπ(i) , bi )
i=1
e` una metrica per lo spazio delle configurazioni dei k server.
50
1.13
CAPITOLO 1. ALGORITMI ON-LINE
Spazi metrici resistivi
Useremo la teoria dei circuiti elettrici per illustrare un algoritmo randomizzato
per il problema dei k-server dovuto a Coppersmith, Doyle, Raghavan e Snir [23].
Questo algoritmo risulta k-competitivo contro un avversario adattivo on-line su di
una certa classe di spazi metrici.
Un circuito elettrico e` un multigrafo non orientato G = (V, E) in cui ad ogni
arco e ∈ E e` associato un peso C(e) = 1/R(e). La quantit`a R(e) > 0 viene detta
resistenza dell’arco e il suo reciproco C(e) viene detto conduttanza.
Per comodit`a di esposizione assumiamo V = {1, 2, . . . , n}. Ci possiamo allora chiedere quale sia la resistenza effettiva ri,j tra due vertici qualsiasi i e j, ossia
la resistenza che viene opposta al passaggio della corrente quando applichiamo
una differenza di potenziale tra i due vertici i e j. La conduttanza effettiva ci,j
sar`a sempre il reciproco della resistenza effettiva.
i
R1
R2
R3
R4
j
Figura 1.5: Resistenze in serie. La resistenza effettiva tra i e j e` la somma delle
resistenze ri,j = R1 +R2 +R3 +R4 .
Per resistenze in serie la resistenza effettiva e` la somma delle resistenze dei
singoli archi (Figura 1.5) mentre per resistenze in parallelo la conduttanza effettiva
e` la somma delle conduttanze dei singoli archi (Figura 1.6).
La seconda propriet`a ci permette di considerare soltanto circuiti il cui grafo
G e` semplice. Basta infatti sostituire gli archi multipli con un solo arco la cui
conduttanza e` la somma delle conduttanze. Possiamo anche completare il grafo
aggiungendo tutti gli archi mancanti con conduttanza nulla. Un circuito rimane
quindi definito dalla sua matrice delle conduttanze dirette C = [Ci,j ] dove i vertici i e j sono connessi dalla resistenza R(ij) = 1/Ci,j se e solo se Ci,j > 0.
Convenzionalmente poniamo Ci,i = ∞.
Queste due regole non sono sempre sufficienti per determinare la resistenza
effettiva tra due vertici in un circuito elettrico qualsiasi (ad esempio il grafo completo con 4 vertici). In generale bisogna ricorrere alla relazione V = RI (che lega
la differenza di potenziale V alla resistenza R ed all’intensit`a di corrente I) ed
alla prima legge di Kirchoff (che dice che la somma delle correnti che entrano in
un vertice e` uguale alla somma delle correnti che ne escono).
1.13. SPAZI METRICI RESISTIVI
51
R1
R2
i
j
R3
R4
Figura 1.6: Resistenze in parallelo. La conduttanza effettiva tra i e j e` la somma
delle conduttanze ci,j = R11 + R12 + R13 + R14 .
j
3
i
j
11
3
4
5
k
i
11
2
11
k
Figura 1.7: A sinistra la matrice delle distanze (interpretate come resistenze
effettive). A destra le corrispondenti resistenze degli archi.
Definizione 1.13.1 Una metrica con matrice delle distanze D = [di,j ] si dice
resistiva se essa e` la matrice delle resistenze effettive di qualche circuito elettrico.
Noi useremo le resistenze effettive di un circuito elettrico come distanze di
una metrica. Questo e` giustificato dal seguente
Fatto 1 La matrice R = [ri,j ] delle resistenze effettive di un circuito elettrico e`
simmetrica e soddisfa la disuguaglianza triangolare ri,j + rj,k ≤ ri,k .
Il viceversa non e` generalmente vero. Vi sono metriche la cui matrice delle
distanze D non e` resistiva. Chiameremo metriche resistive quelle metriche la cui
matrice delle distanze e` resistiva.
Quali sono le metriche resistive? Ecco tre esempi.
1. Una matrice simmetrica D di dimensione 3 × 3 che soddisfa la disuguaglianza triangolare e` sempre resistiva. In altre parole per le matrici 3 × 3
vale anche il viceversa del Fatto 1. Come esempio consideriamo un circuito
triangolare con resistenze effettive 3, 4 e 5 (Figura 1.7). Le corrispondenti
52
CAPITOLO 1. ALGORITMI ON-LINE
resistenze degli archi sono 11
, 11
e 11. Verifichiamolo per i due vertici j
3
2
e k. Dobbiamo verificare che la resistenza effettiva sia 4. Consideriamo i
due cammini da j a k; essi hanno resistenze rispettive 11
+ 11 = 44
e 11
e
3
3
2
2
3
e 11
. Siccome tali due cammini sono in parallelo la
quindi conduttanze 44
2
3
+ 11
= 14 e quindi la resistenza effettiva
conduttanza effettiva tra j e k e` 44
e` 4.
2. Una metrica su di un albero e` sempre resistiva. Per vederlo basta porre
come resistenza di un arco e la sua lunghezza. Siccome tra due vertici i e
j vi e` soltanto un cammino la resistenza effettiva tra i e j e` la somma delle
resistenze degli archi di tale cammino.
3. Consideriamo una rete di calcolatori rappresentata con un grafo in cui i
vertici sono i calcolatori e gli archi i collegamenti di rete. A ciascun arco e` associata una velocit`a di trasmissione in Kbyte/sec (la conduttivit`a).
Il reciproco della conduttivit`a rappresenta il numero di secondi necessari
a trasmettere un Kbyte (la resistenza). E` evidente che per collegamenti in
serie si sommano le resistenze mentre per collegamenti in parallelo si sommano le conduttivit`a. Inoltre vale sicuramente la prima legge di Kirchoff (a
meno che i messaggi non si perdano per strada). Possiamo quindi usare come metrica la resistenza effettiva tra due vertici (ossia il numero di secondi
necessari per trasmettere un messaggio di 1 Kbyte da uno all’altro vertice
attraverso la rete).
Un’altra propriet`a delle metriche resistive e` la seguente
Lemma 1.13.2 Se la matrice delle distanze D e` resistiva allora anche ogni sottomatrice indotta e` resistiva.
Una sottomatrice indotta si ottiene rimuovendo alcune righe e le corrispondenti colonne, ossia rimuovendo alcuni vertici del circuito.
Osserviamo che il circuito elettrico relativo alla sottomatrice non e` generalmente uguale al circuito che si ottiene da quello relativo alla matrice D eliminando
semplicemente i nodi corrispondenti e gli archi incidenti ma occorre aggiungere
alcuni archi per tener conto delle resistenze che sono state tolte.
Come possiamo allora trovare un tale circuito data la matrice resistiva D =
[di,j ]? Noi descriveremo, senza dimostrarlo, un algoritmo che data la matrice
resistiva D = [di,j ] calcola la matrice delle conduttanze dirette C = [Ci,j ] di un
tale circuito. Gli archi del circuito saranno quindi gli archi ij tali che Ci,j > 0 e
la loro resistenza sar`a il reciproco R(ij) = 1/Ci,j .
1.13. SPAZI METRICI RESISTIVI
n
0
j
1
˜ n−1
D
i
d˜i,j
n−1
n 0 ... 0
...
j
1
n−1
1
∞
n
j
..
.
C˜i,j
0
..
.
0
˜
D
C˜
Ci,j
Ci,n
1
53
Cn,j
∞
C
Figura 1.8: Illustrazione della Procedura 1.13.3. Passo 1: calcola d˜i,j = (dn,i +
˜ n−1 )−1 . Passo 3: pone Ci,j = −C˜i,j per
dn,j − di,j )/2. Passo 2: calcola C˜ = (D
i = j. Passo 4: calcola Ci,n = Cn,i = C˜i,i − n−1
j=1 Cj,i . Passo 5: pone Ci,i = ∞.
j=i
Procedura 1.13.3 Supponiamo che la matrice D abbia dimensioni n × n. La
procedura si compone dei seguenti passi:
˜ = [d˜i,j ] ponendo d˜i,j = (dn,i + dn,j − di,j )/2.
1. Costruiamo la matrice D
Notiamo che d˜i,j ≥ 0 per la disuguaglianza triangolare. Inoltre l’ultima riga
˜ sono nulle, infatti d˜n,j = (dn,n + dn,j − dn,j )/2 = 0
e l’ultima colonna di D
e analogamente d˜i,n = (dn,i + dn,n − di,n )/2 = 0.
˜ n−1 la matrice (n−1) × (n−1) ottenuta da D
˜ eliminando l’ultima riga
2. Sia D
˜ n−1 )−1 .
e l’ultima colonna. Calcoliamo la matrice inversa C˜ = (D
3. Poniamo Ci,j = −C˜i,j per ogni i, j < n e i = j.
4. Poniamo Ci,n = Cn,i =
n−1
j=1
C˜j,i .
Osserviamo che per la simmetria di C e il punto 3 questo e` equivalente a
n−1
Cn,i = C˜i,i −
n
Cj,i
j=1
j=i
Cj,i = C˜i,i
ossia
j=1
j=i
5. Infine poniamo Ci,i = ∞ per ogni i.
Si pu`o dimostrare che se D e` resistiva la Procedura 1.13.3 fornisce la corrispondente matrice C = [Ci,j ] di conduttanze dirette non negative.
54
CAPITOLO 1. ALGORITMI ON-LINE
1.13.1
L’algoritmo RWALK
L’algoritmo RWALK per il problema dei k server opera nel modo seguente. Assumiamo, senza perdita di generalit`a, che la t-esima richiesta sia nel vertice 1 e
che prima di soddisfare la richiesta rt = 1 i server di RWALK si trovino nei vertici
2, . . . , k+1. Sia D la sottomatrice indotta della matrice delle distanze relativa ai
k+1 vertici 1, . . . , k, k+1 e supponiamo che essa sia resistiva. Possiamo allora
calcolare la corrispondente matrice delle conduttanze dirette C = [Ci,j ] usando la
Procedura 1.13.3.
L’algoritmo sceglie quindi casualmente di muovere il server in posizione i con
la probabilit`a
Ci,1
Pr[i → 1] = k+1
j=2 Cj,1
La probabilit`a Pr[i → 1] e` sempre definita in quanto il denominatore non pu`o
risultare nullo, altrimenti il punto 1 in cui si trova la richiesta non sarebbe raggiungibile da nessuno degli altri k punti in cui si trovano i server.
Osserviamo che ad una piccola distanza (resistenza) corrisponde una grande conduttanza e quindi una maggiore probabilit`a. Questo e` in accordo con
l’intuizione che suggerisce di muovere preferibilmente i server pi`u vicini.
Teorema 1.13.4 Se tutte le sottomatrici indotte D di dimensioni (k+1) × (k+1)
sono resistive RWALK e` k-competitivo contro ogni avversario adattivo on-line.
Due casi importanti coperti da questo teorema sono
• problema dei k server con k = 2 (e metrica qualsiasi). RWALK funziona ed
e` 2-competitivo.
• k server su di un albero. Sappiamo che la metrica e` resistiva e quindi anche
ogni sottomatrice indotta e` resistiva (Lemma 1.13.2). RWALK funziona ed
e` k-competitivo.
Dimostrazione. Dobbiamo dimostrare che
E[CRWALK (B)] ≤ k E[CB (RWALK)] + c
dove B e` un avversario adattivo on-line e c e` una costante. Possiamo riscrivere la
precedente disequazione come
E[CRWALK (B) − kCB (RWALK)] ≤ c
1.13. SPAZI METRICI RESISTIVI
55
Noi dimostreremo in realt`a la disequazione pi`u stretta
E[Φ + CRWALK (B) − kCB (RWALK)] ≤ c
dove Φ e` una funzione potenziale non negativa.
Per fare questo dimostreremo la diseguaglianza
E[∆Φt + CRWALK (rt ) − kCB (rt )] ≤ 0
dove CRWALK (rt ) e CB (rt ) sono i costi pagati rispettivamente da RWALK e dall’avversario B per soddisfare la richiesta t-esima rt e ∆Φt = Φt − Φt−1 e` la
differenza di potenziale corrispondente.
Sommando su tutta la sequenza di n richieste otteniamo
E[Φn − Φ0 + CRWALK (B) − kCB (RWALK)] ≤ 0
Siccome Φ ≥ 0 basta prendere c = Φ0 per concludere che RWALK e` k-competitivo contro B.
Sia A = a1 , . . . , ak la configurazione dei server di RWALK e B = b1 , . . . , bk
quella dei server dell’avversario B. La funzione potenziale da noi scelta e`
Φ(A, B) =
dai ,aj + kD(A, B)
i<j
dove la prima parte e` una misura della dispersione dei server di RWALK e la seconda parte D(A, B) e` una misura della distanza tra i server di RWALK e quelli di
B. Questa seconda parte e` k volte il costo D(A, B) di una matching minimo tra
A e B. Ricordiamo che il costo del matching minimo e`
k
D(A, B) = min
π
daπ(i) ,bi
i=1
dove il minimo e` calcolato su tutte le permutazioni π dei server della configurazione A. Osserviamo che Φ(A, B) ≥ 0 come richiesto.
Per valutare la differenza di potenziale ∆Φt assumiamo che la richiesta rt
venga soddisfatta in due fasi. Nella prima fase la richiesta viene soddisfatta dall’avversario B mentre RWALK rimane fermo. Nella seconda fase la richiesta viene
soddisfatta dall’algoritmo RWALK mentre l’avversario B rimane fermo.
˜ t il potenziale subito dopo la prima fase. Possiamo allora scomporre la
Sia Φ
˜ t − Φt−1 e ∆Φ = Φt − Φ
˜ t relative
differenza di potenziale in due parti ∆Φt = Φ
t
alle due fasi.
Consideriamo separatamente le due fasi.
56
CAPITOLO 1. ALGORITMI ON-LINE
Prima fase L’avversario muove un server b nella posizione rt .
Quindi ∆Φt ≤ kdb ,rt in quanto lo stesso matching che aveva il costo minimo D(A, B) prima dello spostamento del server, dopo lo spostamento ha
un costo aumentato al pi`u della distanza db ,rt . Dunque ∆D(A, B) ≤ db ,rt .
Il costo pagato dall’avversario per processare rt e` CB (rt ) = db
,rt
e quindi
E[∆Φt − kCB (rt )] ≤ 0
Seconda fase L’algoritmo RWALK muove un server.
Per semplicit`a di esposizione supponiamo che i server di RWALK si trovino nei vertici 2, . . . , k, k+1 (ossia che per ogni i = 1, . . . , k il server i di
RWALK si trovi nella posizione ai = i + 1), che la richiesta rt sia nel vertice
1 e che il server di B che e` stato mosso nella posizione rt sia il server k di B
per cui, dopo lo spostamento, bk = rt . Supponiamo inoltre che il matching
di costo minimo sia (a1 , b1 ), . . . , (ak , bk ). (Possiamo sempre rinumerare i
vertici ed i server in modo da soddisfare queste condizioni.)
Sia h il server mosso da RWALK dalla sua posizione iniziale ah = h + 1 alla
posizione bk = rt = 1. Consideriamo il matching ottenuto da quello di costo minimo (a1 , b1 ), . . . , (ak , bk ) sostituendo rispettivamente le due coppie
(ak , bk ) e (ah , bh ) con le due coppie (ak , bh ) e (ah , bk ) come illustrato nella
figura seguente
a1 =2
ah =h+1
ak =k+1
b1
bh
bk =rt =1
Se D(A, B) e` il costo del matching minimo prima dello spostamento del server h dalla posizione ah = h + 1 alla posizione rt = 1, dopo lo spostamento
il costo del matching modificato e`
D(A, B) + dak ,bh − dak ,bk − dah ,bh
che sar`a certamente maggiore o uguale al costo del matching minimo dopo
lo spostamento del server. Pertanto
∆D(A, B) ≤ dak ,bh − dak ,bk − dah ,bh
1.13. SPAZI METRICI RESISTIVI
57
Per la diseguaglianza triangolare dak ,bh ≤ dak ,ah + dah ,bh da cui
∆D(A, B) ≤ dak ,ah − dak ,bk
ovvero, ricordando che ak = k+1, ah = h + 1 e bk = 1
∆D(A, B) ≤ dk+1,h+1 − dk+1,1
La variazione della sommatoria i<j dai ,aj che rappresenta la dispersione
tra i server di RWALK e` dovuta alla variazione delle distanze tra il server h
che viene mosso e tutti gli altri server, ossia
k
∆
[di+1,1 − di+1,h+1 ]
dai ,aj =
i<j
i=1
i=h
e quindi la differenza di potenziale ∆Φt relativa alla seconda fase e` limitata
superiormente da
k
[di+1,1 − di+1,h+1 ] + k[dk+1,h+1 − dk+1,1 ]
∆Φt ≤
i=1
i=h
e siccome CRWALK (rt ) = dh+1,1
∆Φt + CRWALK (rt )
k
[di+1,1 − di+1,h+1 ] + k[dk+1,h+1 − dk+1,1 ] + dh+1,1
≤
i=1
i=h
k
[di+1,1 − di+1,h+1 ] + k[dk+1,h+1 − dk+1,1 ]
=
i=1
k
[di+1,1 − di+1,h+1 + dk+1,h+1 − dk+1,1 ]
=
i=1
Indicando per brevit`a l’i-esimo addendo della sommatoria con
e(i, h) = di+1,1 − di+1,h+1 + dk+1,h+1 − dk+1,1
possiamo scrivere la disuguaglianza come
k
∆Φt + CRWALK (rt ) ≤
e(i, h)
i=1
58
CAPITOLO 1. ALGORITMI ON-LINE
Sia C = [Ci,j ] la matrice (k+1) × (k+1) delle conduttanze dirette relativa
all’insieme di vertici 1, . . . , k, k+1. Prendendo i valori attesi di entrambi i
membri della disequazione precedente si ottiene
k
E[∆Φt + CRWALK (rt )] ≤ E[
e(i, h)]
i=1
k
k
Pr[h → 1]
=
h=1
k
=
h=1
=
k
j=1
e(i, h)
i=1
k
Ch+1,1
e(i, h)
k
j=1 Cj+1,1 i=1
k
k
1
Cj+1,1
e(i, h)
Ch+1,1
h=1
i=1
dove Ch+1,1 e` la conduttanza diretta tra il vertice ah = h + 1 (dove si trova
il server mosso da RWALK) e il vertice rt = 1.
Se dimostriamo che
k
k
e(i, h) = 0
Ch+1,1
(1.14)
i=1
h=1
possiamo concludere che
E[∆Φt + CRWALK (rt )] ≤ 0
Per dimostrare l’equazione 1.14 dobbiamo richiamare alcuni fatti sui circuiti elettrici che ci diano delle informazioni sui coefficienti Ch+1,1 .
Sia D la sottomatrice (k+1) × (k+1) della matrice delle distanze indotta
˜ la matrice
sull’insieme 1, . . . , k, k+1 (che sappiamo essere resistiva). Sia D
˜ k la sottomatrice k × k di D
˜
calcolata al passo 1 della Procedura 1.13.3 e D
˜
˜
ottenuta eliminando l’ultima riga e l’ultima colonna. Sia C = [Ci,j ] =
˜ k )−1 la matrice inversa calcolata al passo 2.
(D
˜k = I
Siccome C˜ · D
k
d˜i+1,j C˜j,1 = 0
j=1
per ogni i = 1, . . . , k − 1. Sommando su i = 1, . . . , k − 1 otteniamo
k−1 k
i=1 j=1
d˜i+1,j C˜j,1 = 0
(1.15)
1.13. SPAZI METRICI RESISTIVI
59
Per il passo 3 della Procedura 1.13.3 abbiamo
C˜j,1 = −Cj,1
per ogni j = 2, . . . , k e, usando l’equazione usata al passo 4
k+1
C˜1,1 =
Cj,1
j=2
e quindi sostituendo nell’equazione 1.15 otteniamo

k−1
k
d˜i+1,j Cj,1 +
−
i=1
k+1
j=2

d˜i+1,1 Cj,1  = 0
j=2
che con la sostituzione j = h + 1 diventa
k−1
k−1
−
i=1
d˜i+1,h+1 Ch+1,1 +
k
d˜i+1,1 Ch+1,1 = 0
h=1
h=1
Siccome d˜i+1,k+1 = (dk+1,i+1 + dk+1,k+1 − di+1,k+1 )/2 = 0 possiamo
estendere fino a k la prima sommatoria interna ottenendo
k−1 k
(d˜i+1,1 − d˜i+1,h+1 )Ch+1,1 = 0
i=1 h=1
Il termine tra parentesi e`
d˜i+1,1 − d˜i+1,h+1 = (dk+1,i+1 + dk+1,1 − di+1,1 )/2
−(dk+1,i+1 + dk+1,h+1 − di+1,h+1 )/2
= (dk+1,1 − di+1,1 − dk+1,h+1 + di+1,h+1 )/2
= −e(i, h)/2
Possiamo infine provare l’equazione 1.14 nel modo seguente
k
k
Ch+1,1
h=1
k
k
e(i, h) =
i=1
e(i, h)Ch+1,1
i=1 h=1
k−1 k
=
e(i, h)Ch+1,1
i=1 h=1
k−1 k
= −2
(d˜i+1,1 − d˜i+1,h+1 )Ch+1,1
i=1 h=1
= 0
60
CAPITOLO 1. ALGORITMI ON-LINE
dove la restrizione soltanto fino a k − 1 della prima sommatoria e` dovuta al
fatto che e(k, h) = dk+1,1 − dk+1,h+1 + dk+1,h+1 − dk+1,1 = 0.
Dunque per la seconda fase vale la disuguaglianza
E[∆Φt + CRWALK (rt )] ≤ 0
Mettendo assieme i risultati ottenuti per le due fasi possiamo concludere che
E[∆Φt + CRWALK (rt ) − kCB (rt )] ≤ 0
e quindi il teorema e` dimostrato ed RWALK e` k competitivo su ogni metrica
resistiva.
1.14
Algoritmo della funzione lavoro
In questa sezione descriveremo l’algoritmo W ORK per il problema dei k-server
e dimostreremo che esso e` (2k − 1)-competitivo. L’algoritmo e` stato proposto
da Chrobak e Larmore [22] che per`o riuscirono a dimostrare soltanto che esso e`
2-competitivo per k = 2. La prima dimostrazione della (2k − 1)-competitivit`a
e` dovuta a Koutsoupias e Papadimitriou [30]. Prima di questo risultato non si
conosceva nessun algoritmo con un rapporto di competitivit`a polinomiale in k per
il problema dei k server in uno spazio metrico arbitrario. Si congettura che W ORK
sia in realt`a k-competitivo ma nessuno e` ancora riuscito a dimostrarlo.
Invece della dimostrazione originale di Koutsoupias e Papadimitriou [30] deriveremo la (2k − 1)-competitivit`a di W ORK da un risultato pi`u generale dimostrato
da Koutsoupias in [31] e la cui dimostrazione risulta pi`u semplice e intuitiva.
Koutsoupias in [31] confronta il costo dell’algoritmo W ORK per soddisfare
la sequenza di richieste ρ utilizzando k server con il costo dell’algoritmo offline ottimo O PT che per soddisfare la medesima sequenza di richieste utilizza un
numero h di server non necessariamente uguale a k.
Dovendo considerare algoritmi che utilizzano un numero h di server diverso
da k annoteremo il nome A dell’algoritmo con un apice che indica il numero di
server usati e scriveremo quindi Ah per indicare l’algoritmo A con h server. Una
notazione analoga Ah = a1 , a2 , . . . , ah la useremo per denotare una configurazione di h server. Useremo anche ah , dove a e` un singolo punto dello spazio metrico,
per indicare la configurazione Ah = a, a, . . . , a di h server tutti nel punto a.
1.14. ALGORITMO DELLA FUNZIONE LAVORO
61
Per non appesantire troppo la notazione continueremo ad usare A ed A per
indicare un algoritmo e una configurazione con esattamente k server.
Koutsoupias in [31] confronta il costo CW ORK (ρ) dell’algoritmo W ORK che
soddisfa la sequenza di richieste ρ utilizzando k server con il costo CO PTh (ρ)
dell’algoritmo off-line ottimo O PTh che per soddisfare la medesima sequenza di
richieste utilizza un numero h di server non necessariamente uguale a k. Precisamente dimostreremo che per ogni h (anche h > k)
CW ORK (ρ) ≤ kCO PTh (ρ) + (h − 1)CO PT (ρ) + c
(1.16)
dove c e` una costante che tiene conto delle possibili diverse configurazione iniziali
degli algoritmi che stiamo comparando.
Per dimostrare la disequazione 1.16 sar`a quindi sufficiente dimostrare la
CW ORK (ρ) ≤ kCO PTh (ρ) + (h − 1)CO PT (ρ)
(1.17)
nell’ipotesi che tutti i server di tutti gli algoritmi coinvolti partano da un punto
iniziale comune r0 .
La disuguaglianza 1.16 e` un risultato pi`u generale della (2k − 1)-competitivit`a
in quanto, ponendo h = k si ottiene
CW ORK (ρ) ≤ (2k − 1)CO PT (ρ) + c
1.14.1
La funzione lavoro
Consideriamo l’algoritmo off-line ottimo O PT che risponde ad una sequenza di
richieste ρ. Dopo aver servito le prime t richieste i suoi k server si troveranno
in una certa configurazione Bt . Il costo per servire ρ si pu`o allora suddividere in
due parti: il costo per servire le richieste r1 , . . . , rt partendo dalla configurazione
iniziale B0 = r0k e terminando nella configurazione Bt ed il costo per servire la
sequenza rt+1 , . . . , rn a partire dalla configurazione Bt . Un algoritmo on-line A
che conosca l’algoritmo O PT non conosce la configurazione Bt (in quanto essa
pu`o dipendere dalle richieste successive che non sono note ad A) ma e` in grado,
per qualsiasi configurazione X di k server, di calcolare il costo ottimo per servire
le richieste r1 , . . . , rt a partire dalla configurazione iniziale A0 = B0 = r0k dei suoi
server e finire con i server nella configurazione X. Questo giustifica la seguente
definizione di funzione lavoro.
Definizione 1.14.1 (Funzione lavoro) Sia A0 = r0k la configurazione iniziale dei
server nello spazio metrico considerato e sia ρ = r1 , r2 , . . . , rn la sequenza di
62
CAPITOLO 1. ALGORITMI ON-LINE
richieste. Per ogni configurazione X = x1 , x2 , . . . , xk di k server definiamo la
funzione lavoro wt (X) al tempo t come il minimo costo per servire off-line le
prime t richieste partendo dalla configurazione iniziale A0 e terminando con i
server nella configurazione X.
Osserviamo che CO PT (ρ) = wn (Bn ) dove Bn e` la configurazione finale a
cui arriva l’algoritmo off-line ottimo O PT partendo dalla configurazione iniziale
B0 = r0k e dopo aver processato tutte la sequenza ρ.
Una conseguenza immediata della definizione di funzione lavoro e` che
k
w0 (X) = D(B0 , X) =
d(r0 , xi )
i=1
dove D(B0 , X) e` la distanza tra le due configurazioni B0 = r0k ed X. In generale
la distanza fra due configurazioni generiche A e B e` il minimo costo per spostare
i k server dalla configurazione A alla configurazione B ed e` definita come
k
D(A, B) = min
π
d(aπ(i) , bi )
i=1
dove il minimo e` calcolato su tutte le permutazioni π degli elementi della configurazione A = a1 , a2 , . . . , ak . Naturalmente se A = r0k le permutazioni di A sono
tutte uguali e la distanza si riduce a D(A, B) = ki=1 d(r0 , bi ).
Per t > 0, l’algoritmo off-line ottimo O PT per servire la richiesta rt e terminare nella configurazione X deve comunque passare per una configurazione Y tale
che rt ∈ Y (anche se rt ∈ X).4 Avremo quindi
wt (X) =
min {wt−1 (Z) + D(Z, Y ) + D(Y, X)}
Z,Y :rt ∈Y
Per la minimalit`a di wt−1 (Y ) possiamo limitarci al caso Z = Y e quindi
wt (X) = min {wt−1 (Y ) + D(Y, X)}
Y :rt ∈Y
In altre parole, nella ricerca del minimo, consideriamo soltanto le configurazioni
Y in cui uno dei server si trova gi`a nella posizione giusta per servire la successiva
richiesta rt .
Il lemma seguente dice che, non solo possiamo limitarci alle configurazioni Y
tali che rt ∈ Y , ma possiamo addirittura limitarci a quelle configurazioni Y =
X − x + rt che differiscono da X soltanto per la posizione di un solo server5 .
4
Se A = a1 , a2 , . . . , ah e` una configurazione di h server e x e` un punto dello spazio metrico la
notazione x ∈ A significa che esiste almeno un server i in posizione ai = x.
5
Quando x ∈ X usiamo la notazione X − x + y per indicare la configurazione ottenuta da X
spostando in posizione y uno dei server che si trovavano in posizione x.
1.14. ALGORITMO DELLA FUNZIONE LAVORO
63
Lemma 1.14.2 Per ogni t > 0 e ogni X
wt (X) = min{wt−1 (X − x + rt ) + d(rt , x)}
x∈X
Dimostrazione. Dimostreremo che valgono entrambe le diseguaglianze
wt (X) ≤ min{wt−1 (X − x + rt ) + d(rt , x)}
x∈X
e
wt (X) ≥ min{wt−1 (X − x + rt ) + d(rt , x)}
x∈X
Per la prima, abbiamo D(X, X − x + rt ) = d(rt , x) e quindi
wt (X) =
min {wt−1 (Y ) + D(Y, X)}
Y :rt ∈Y
≤ min{wt−1 (X − x + rt ) + d(rt , x)}
x∈X
Per la seconda, sia Ymin una configurazione per cui wt (X) = wt−1 (Ymin ) +
D(Ymin , X) e sia x l’elemento di X abbinato a rt nel calcolo di D(Ymin , X).
Sia Y = X − x + rt . Allora
wt (X) =
=
≥
≥
wt−1 (Ymin ) + D(Ymin , X)
wt−1 (Ymin ) + D(Ymin , Y ) + d(rt , x)
wt−1 (Y ) + d(rt , x)
min{wt−1 (X − x + rt ) + d(rt , x)}
x∈X
e dunque e` vera anche la seconda diseguaglianza.
Un’altra importante propriet`a della funzione lavoro e` la quasi-convessit`a. Per
dimostrarla ci sar`a comoda una rappresentazione grafica del modo in cui un algoritmo serve una sequenza di richieste. Chiameremo traccia una tale rappresentazione grafica. Come illustrato dalla Figura 1.9, la traccia e` un grafo i cui nodi
sono le posizioni iniziali a1 , a2 , . . . , ak dei server, le posizioni r1 , r2 , . . . , rn delle
richieste e le posizioni finali x1 , x2 , . . . , xk dei server. Gli archi rappresentano i
movimenti dei server.
Con abuso di linguaggio chiameremo traccia di wt (X) la traccia di un algoritmo off-line ottimo che, con costo wt (X), serve le prime t richieste partendo dalla
configurazione iniziale A0 e terminando con i server nella configurazione X.
La propriet`a di quasi convessit`a della funzione lavoro e` espressa dal seguente
lemma.
64
CAPITOLO 1. ALGORITMI ON-LINE
a3
x3
r2
r3
r4
r7
r9
a2
x2
r1
r5
r6
r8
r10
a1
x1
Figura 1.9: La traccia dell’esecuzione di un algoritmo che processa la sequenza di richieste ρ = r1 , r2 , . . . , r10 utilizzando 3 server che partono dalle posizioni iniziali a1 , a2 , a3 e terminano nelle posizioni finali x1 , x2 , x3 . Le posizioni
a1 , a2 , a3 , r1 , r2 , . . . , r10 , x1 , x2 , x3 non necessariamente sono distinte e quindi alcuni degli archi rappresentano spostamenti nulli. In ogni caso il costo pagato
dall’algoritmo e` la somma delle lunghezze degli spostamenti rappresentati dagli
archi.
Lemma 1.14.3 (Quasi-convessit`a) Siano X h e Y k due configurazioni qualsiasi
rispettivamente di h e k server con h ≤ k e siano wt (X h ) e wt (Y k ) i valori
delle funzioni lavoro relative alle due configurazioni iniziali Ah e B k . Assumiamo
inoltre che le configurazioni iniziali Ah e B k abbiano le posizioni dei primi h
server in comune, ossia ai = bi per i = 1, . . . , h.
Per ogni punto x ∈ X h esiste un punto y ∈ Y k tale che
wt (X h ) + wt (Y k ) ≥ wt (X h − x + y) + wt (Y k − y + x)
Dimostrazione. L’idea della dimostrazione e` quella di usare tutti e soli gli archi
delle tracce di wt (X h ) e wt (Y k ) per costruire le tracce di due algoritmi Ah e B k
che partono rispettivamente dalle configurazioni Ah e B k , entrambi servono le
richieste r1 , . . . , rt e terminano rispettivamente nelle configurazioni X h − x + y
e Y k − y + x per un y opportuno. Siccome vengono usati gli stessi archi avremo
che la somma dei costi CAh e CB k pagati dai due algoritmi e` uguale a wt (X h ) +
wt (Y k ) e quindi
wt (X h ) + wt (Y k ) = CAh + CB k ≥ wt (X h − x + y) + wt (Y k − y + x)
Per costruire le tracce di Ah e B k cominciamo con il riunire in un unico grafo
le tracce di wt (X h ) e wt (Y k ) identificando in uno stesso vertice i punti di partenza
coincidenti ai = bi per i = 1, . . . , h.
In Figura 1.10 e` rappresentata la riunione delle tracce di wt (X h ) e wt (Y k ) per
h = 2 e k = 3, con punti di partenza dei server a1 = b1 , a2 = b2 e b3 e punti
1.14. ALGORITMO DELLA FUNZIONE LAVORO
65
y3
b3
r2
a2 =b2
a1 =b1
r1
r3
r4
r7
r5
r6
x2
r9
r8
y2
r10
x1
y1
Figura 1.10: La riunione delle tracce di wt (X h ) (rosso) e wt (Y k ) (nero). Nell’esempio h = 2 e k = 3, i punti di partenza dei server sono a1 = b1 , a2 = b2 e b3
mentre i punti di arrivo sono x1 , x2 e y1 , y2 , y3 .
di arrivo x1 , x2 e y1 , y2 , y3 . Per mantenere il ricordo della provenienza degli archi
abbiamo colorato in rosso gli archi provenienti dalla traccia di wt (X h ) e in nero
quelli provenienti da wt (Y k ).
Siccome ogni richiesta viene servita da un solo server sia in wt (X h ) che in
wt (Y k ), nella riunione delle due tracce ogni vertice rj ha esattamente due archi
entranti, uno rosso proveniente da wt (X h ) ed uno nero proveniente da wt (Y k ).
Il percorso di un server di wt (X h ) inizia in un vertice ai e termina nel vertice
xi e il percorso di un server di wt (Y k ) inizia in un vertice bi e termina nel vertice
yi . Quindi ogni vertice rj ha anche esattamente due archi uscenti, uno rosso ed
uno nero. Inoltre anche i vertici ai = bi per i = 1, . . . , h hanno esattamente
due archi uscenti, uno rosso e uno nero, mentre i vertici bi per i = h + 1, . . . , k
hanno soltanto un arco uscente nero. Infine i vertici x1 , . . . , xh hanno un solo arco
entrante rosso e i vertici y1 , . . . , yh hanno un solo arco entrante nero.
Sia quindi x ∈ X h e immaginiamo di muoverci sul grafo riunione delle due
tracce nel modo seguente: Partiamo del vertice v0 = x e percorriamo all’indietro
l’unico arco rosso che entra in x arrivando in un vertice di tipo v1 = ri1 o v1 =
ai1 = bi1 . In entrambi i casi abbiamo un solo arco nero uscente da v1 ; percorriamo
in avanti tale arco nero arrivando ad un vertice di tipo v2 = rj2 o v2 = yj2 . Se ci
troviamo in un vertice v2 = yj2 ci fermiamo e poniamo y = yj2 ∈ Y k . Se invece
ci troviamo in un vertice v2 = rj2 possiamo ripetere l’operazione di percorrere un
arco rosso all’indietro e quindi un arco nero in avanti.
Siccome ogni vertice di tipo rj ha esattamente un arco rosso entrante che,
percorso all’indietro, conduce ad un vertice ri o ai = bi da cui parte un solo arco
nero, il procedimento risulta deterministico e pu`o terminare soltanto quando si
arriva ad un vertice vm = yjm nel qual caso ci fermiamo e prendiamo y = yjm ∈
Y k.
66
CAPITOLO 1. ALGORITMI ON-LINE
E` facile vedere che questo procedimento deve terminare poich´e non si ripassa
mai per un arco gi`a attraversato e quindi non ci possono essere cicli. Infatti,
supponiamo per assurdo che si ripassi per uno stesso arco e consideriamo il primo
arco vt vt+1 percorso per la seconda volta.
Se vt vt+1 e` rosso, e quindi e` percorso a ritroso, esso non pu`o essere v0 v1 perch´e
v0 = x che non ha archi neri entranti e quindi non e` possibile ritornare in x.
Quindi t > 0 e vt vt+1 e` preceduto da un arco nero vt−1 vt . Siccome in vt entra
un solo arco nero esso deve essere lo stesso sia la prima che la seconda volta che
percorriamo vt vt+1 il che contraddice il fatto che vt vt+1 sia il primo arco percorso
due volte.
Se vt vt+1 e` nero, e quindi percorso in avanti, esso non pu`o uscire da un vertice
del tipo vt = bi per qualche i = h + 1, . . . , k in quanto non ci sono archi rossi
uscenti da tali vertici e quindi non e` possibile raggiungerli percorrendo un arco
rosso all’indietro. Dunque vt vt+1 esce da un vertice del tipo vt = rjt o vt = ait =
bit . In entrambi i casi abbiamo un solo arco rosso uscente da vt e quindi anche
l’arco rosso precedente deve essere lo stesso sia la prima che la seconda volta che
percorriamo vt vt+1 il che contraddice il fatto che vt vt+1 sia il primo arco percorso
due volte.
Dunque il percorso che costruiamo con questa procedura e` unico e termina
sicuramente in un vertice y ∈ Y k .
Nella Figura 1.11 sono evidenziati i due percorsi che si ottengono partendo
rispettivamente dai vertici x = x1 e x = x2 .
y3
b3
r2
a2 =b2
a1 =b1
r1
r3
r4
r7
r5
r6
x2
r9
r8
y2
r10
x1
y1
Figura 1.11: I percorsi alternanti che partono rispettivamente da x = x1 e x = x2
sul grafo di Figura 1.10. Il percorso che parte da x = x1 e` indicato dalle frecce
blu e il percorso che parte da x = x2 e` indicato dalle frecce verdi. Il percorso che
parte da x = x1 termina in y = y2 e quello che parte da x = x2 termina in y = y3 .
A questo punto per costruire le tracce di Ah e B k ci basta scambiare i colori
degli archi del percorso alternante. In Figura 1.12 si vede il risultato di questa
operazione rispetto al percorso alternante che parte da x = x1 .
1.14. ALGORITMO DELLA FUNZIONE LAVORO
67
y3
b3
r2
a2 =b2
a1 =b1
r1
r3
r4
r7
r5
r6
x2
r9
r8
y2
r10
x1
y1
Figura 1.12: Le tracce dei due algoritmi Ah (in rosso) e B k (in nero) ottenute
scambiando i colori degli archi del cammino alternante che parte da x = x2 e
termina in y = y2 .
Scambiando i colori degli archi del cammino alternante non cambia il numero
e il tipo degli archi uscenti ed entranti in ciascun vertice, tranne il vertice finale
x = xi ed il vertice finale y = yj i cui unici archi entranti cambiano colore.
Dunque nel grafo ottenuto vi sono h cammini rossi distinti che partono dai
vertici della configurazione iniziale A = a1 , . . . , ah e terminano nei vertici della
configurazione finale X − x + y visitando una e una sola volta ciascun vertice ri ,
e questa e` la traccia dell’algoritmo Ah . Gli archi neri invece formano k cammini
distinti che partono dai vertici della configurazione iniziale B = b1 , . . . , bk e terminano nei vertici della configurazione finale Y − y + x visitando una e una sola
volta ciascun vertice ri , e questa e` la traccia dell’algoritmo B k .
Osservazione 4 Per dimostrare il Lemma 1.14.3 della quasi convessit`a non abbiamo usato la disuguaglianza triangolare. Dunque esso vale anche sui vertici di
un qualsiasi grafo pesato sugli archi.
Possiamo illustrare il lemma di quasi convessit`a mediante un gioco su di un
grafo pesato sugli archi. Supponiamo che una mossa del gioco consista nel muovere una pedina da un vertice ad un altro vertice adiacente del grafo e supponiamo
che il gioco si svolga tra il giocatore Bruno che rimane fermo nelle sue posizioni
e due avversari Vittorio e Roberto che cercano di occupare con le loro pedine le
posizioni di Bruno. Bruno ha k pedine poste nei vertici b1 , . . . , bk , Vittorio ha pure k pedine poste nei vertici y1 , . . . , yk mentre Roberto ha soltanto h ≤ k pedine
poste nei vertici x1 , . . . , xh .
Lo scopo di Vittorio e` quello di occupare tutte le k posizioni di Bruno spostando le sue pedine con il minimo costo possibile mentre Roberto si accontenta
di occupare le prime h posizioni di Bruno pagando il minimo costo possibile.
68
CAPITOLO 1. ALGORITMI ON-LINE
Supponiamo che i due avversari vogliano coalizzarsi in modo da rendere minimo il costo totale. Il lemma di quasi periodicit`a dice che per ogni pedina r di
Roberto esiste una pedina v di Vittorio tale che se i due avversari si scambiano le
due pedine il nuovo costo totale risulta minore o uguale al precedente.
1.14.2
L’algoritmo W ORK della funzione lavoro
Sia At−1 la configurazione a cui arriva un algoritmo on-line A dopo aver servito
la sequenza di richieste r1 , . . . , rt−1 partendo dalla configurazione iniziale A0 .
Probabilmente la scelta pi`u naturale per A nel servire la successiva richiesta rt
e` l’algoritmo goloso G REEDY, il quale muove i server in una configurazione At
con rt ∈ At che minimizza la distanza D(At−1 , At ). Purtroppo, come sappiamo,
l’algoritmo G REEDY non e` competitivo. Dal lato opposto delle possibilit`a vi e`
l’algoritmo retrospettivo che muove i server in una configurazione At con rt ∈ At
che minimizza wt (At ). L’idea e` che un algoritmo off-line che abbia i server in
posizione At e` il migliore possibile fino a quel momento. L’algoritmo W ORK
della funzione lavoro che andiamo a descrivere usa una combinazione di tali due
strategie e quindi sta in mezzo tra tali due estremi.
Definizione 1.14.4 (Algoritmo W ORK) L’algoritmo W ORK risponde alla richiesta rt muovendo i server dalla configurazione At−1 in cui si trovano al momento
della richiesta a quella configurazione At tale che rt ∈ At e che minimizza la
somma
wt (At ) + D(At , At−1 )
Osserviamo che wt (At ) = wt−1 (At ) (dato che rt ∈ At ) e quindi
min {wt (At ) + D(At , At−1 )} = wt (At−1 )
At :rt ∈At
Per il Lemma 1.14.2, At = At−1 − xt + rt dove xt e` quella posizione di un server
nella configurazione At−1 che minimizza la quantit`a
wt−1 (At−1 − xt + rt ) + d(xt , rt )
Dunque il costo pagato da W ORK per servire la richiesta rt e` CW ORK (rt ) =
d(xt , rt ) dove xt e` la posizione iniziale del server mosso da W ORK per servire la
richiesta rt .
Definiamo il costo aumentato C + (rt ) per servire la richiesta rt nel modo
seguente
C + (rt ) = wt (At ) − wt−1 (At−1 ) + d(xt , rt )
1.14. ALGORITMO DELLA FUNZIONE LAVORO
69
Quindi il costo aumentato C + (ρ) per servire l’intera sequenza ρ di richieste e`
n
C + (ρ) =
C + (rt )
(1.18)
t=1
n
= wn (An ) − w0 (A0 ) +
d(xt , rt )
(1.19)
= wn (An ) − w0 (A0 ) + CW ORK (ρ)
(1.20)
t=1
Se assumiamo che O PT parta dalla stessa configurazione iniziale A0 di W ORK
allora w0 (A0 ) = 0 e wn (An ) ≥ CO PT (ρ) e quindi
C + (ρ) ≥ CW ORK (ρ) + CO PT (ρ)
Se, dopo aver servito rt vogliamo che i server ritornino nella posizione precedente At−1 dovremo spostare indietro il server in rt nella posizione precedente xt
con un costo d(rt , xt ). Vale quindi l’uguaglianza
wt (At−1 ) = wt (At ) + d(rt , xt )
e quindi
C + (rt ) = wt (At−1 ) − wt−1 (At−1 )
≤ max{wt (X) − wt−1 (X)}
X
La precedente disequazione fornisce un limite superiore per il costo aumentato
C + (rt ) che e` indipendente sia dall’algoritmo che dalla posizione dei server.
In particolare se dimostriamo che
n
t=1
max{wt (X) − wt−1 (X)} ≤ kCO PTh (ρ) + hCO PT (ρ)
X
(1.21)
quando tutti i server partono dallo stesso punto iniziale r0 allora rimane dimostrata
anche la disequazione 1.17 e quindi la (2k − 1)-competitivit`a di W ORK.
Per determinare il valore di maxX {wt (X) − wt−1 (X)} ci serve una ulteriore
propriet`a della funzione lavoro: la propriet`a di dualit`a.
Lemma 1.14.5 (Dualit`a) Sia A un minimizzatore di wt−1 (A) − D(rt , A). Allora
A massimizza wt (A) − wt−1 (A).
70
CAPITOLO 1. ALGORITMI ON-LINE
Dimostrazione. Sia A una configurazione tale che
wt−1 (A) − D(rt , A) = min{wt−1 (X) − D(rt , X)}
X
Dobbiamo dimostrare
wt (A) − wt−1 (A) = max{wt (X) − wt−1 (X)}
X
ossia che
wt (B) − wt−1 (B) ≤ wt (A) − wt−1 (A)
per ogni altra configurazione B. Per il Lemma 1.14.2 questo e` equivalente a
min{wt−1 (B − b + rt ) + d(rt , b)} − wt−1 (B)
b∈B
≤ min{wt−1 (A − a + rt ) + d(rt , a)} − wt−1 (A)
a∈A
Ci basta quindi dimostrare che per ogni a ∈ A
min{wt−1 (B − b + rt ) + d(rt , b)} + wt−1 (A)
b∈B
≤ wt−1 (A − a + rt ) + d(rt , a) + wt−1 (B)
(1.22)
Per la minimalit`a di A
wt−1 (A) − D(rt , A) ≤ wt−1 (A − a + b) − D(rt , A − a + b)
ed eliminando i termini comuni tra D(rt , A) e D(rt , A − a + b) si ottiene
wt−1 (A) − d(rt , a) ≤ wt−1 (A − a + b) − d(rt , b)
che e` equivalente a
d(rt , b) + wt−1 (A) ≤ d(rt , a) + wt−1 (A − a + b)
Sommando wt−1 (B − b + rt ) da entrambe le parti e prendendo i minimi rispetto a
b si ottiene
min{wt−1 (B − b + rt ) + d(rt , b)} + wt−1 (A)
b∈B
≤ min{wt−1 (B − b + rt ) + wt−1 (A − a + b)} + d(rt , a)
b∈B
1.14. ALGORITMO DELLA FUNZIONE LAVORO
71
Se quindi dimostriamo la disuguaglianza
min{wt−1 (B − b + rt ) + wt−1 (A − a + b)}
b∈B
≤ wt−1 (A − a + rt ) + wt−1 (B)
(1.23)
a maggior ragione risulter`a vera la diseguaglianza 1.22.
Siccome rt ∈ A − a + rt , per il Lemma 1.14.3 esiste b ∈ B tale che
wt−1 (A − a + rt ) + wt−1 (B) ≥ wt−1 (B − b + rt ) + wt−1 (A − a + b)
e dunque la disuguaglianza 1.23 e` verificata ed il lemma e` dimostrato.
Il Lemma di dualit`a dice che per trovare un A che massimizza wt (A)−wt−1 (A)
basta cercare un A che minimizza wt−1 (A) − D(rt , A). (Attenzione, il lemma
vale in una sola direzione: ogni A che minimizza wt−1 (A) − D(rt , A) massimizza
wt (A) − wt−1 (A) ma non necessariamente e` vero il contrario.)
La Figura 1.13 illustra il Lemma di dualit`a nel caso semplice in cui t = 1 e tutti
i server partono dalla configurazione iniziale r0k . In questo caso la configurazione
A = ak in cui i server sono tutti in un punto a successivo ad r0 sulla semiretta con
origine in r1 e che passa per r0 e` un minimizzatore di w0 (A) − D(r1 , A). Infatti
se B e` una qualsiasi altra configurazione abbiamo che
w0 (B) − D(r1 , B) = D(r0 , B) − D(r1 , B) ≥ −kd(r0 , r1 ) = w0 (A) − D(r1 , A)
e quindi, per il Lemma 1.14.5 di dualit`a, per ogni altra configurazione B abbiamo
w1 (A) − w0 (A) = 2d(r0 , r1 ) ≥ w1 (B) − w0 (B)
Una osservazione importante e` che se A e` un minimizzatore di wt−1 (A) −
D(rt , A) e prendiamo un punto a ∈ A e lo allontaniamo da rt allora la configurazione che otteniamo e` ancora un minimizzatore. Pi`u precisamente vale il seguente
lemma.
Lemma 1.14.6 Sia a ∈ A un punto in cui si trova uno dei server nella configurazione A e sia rt la posizione della richiesta. Se spostiamo tale server in
un punto b a distanza maggiore di a nella direzione rt → a (per cui d(rt , b) =
d(rt , a)+d(a, b)) allora wt−1 (A−a+b)−D(rt , A−a+b) ≤ wt−1 (A)−D(rt , A).
In particolare, se A e` un minimizzatore di wt−1 (A) − D(rt , A) anche A − a + b e`
un minimizzatore.
72
CAPITOLO 1. ALGORITMI ON-LINE
bk
bi
r1
A=ak
r0
b1
Figura 1.13: Illustrazione del Lemma 1.14.5 nel caso semplice in cui t = 1 e tutti
i server partono dalla configurazione iniziale r0k . In questo caso la configurazione
A = ak in cui i server sono tutti in un punto a sulla retta che passa per r0 ed r1 e` sia
un minimizzatore di w0 (A) − D(r1 , A) che un massimizzatore di w1 (A) − w0 (A).
Dimostrazione. Per la minimalit`a di wt−1 (A − a + b) abbiamo
wt−1 (A − a + b) ≤ wt−1 (A) + d(a, b)
= wt−1 (A) + d(rt , b) − d(rt , a)
= wt−1 (A) + D(rt , A − a + b) − D(rt , A)
e quindi
wt−1 (A − a + b) − D(rt , A − a + b) ≤ wt−1 (A) − D(rt , A)
Se A e` un minimizzatore deve valere l’uguaglianza e quindi anche A − a + b e` un
minimizzatore.
Vi sono spazi metrici particolari, che chiameremo simmetrici, in cui ogni punto a ha un antipodo a
¯ tale che d(a, a
¯) = ∆ dove ∆ e` la massima distanza tra due
punti e inoltre d(a, b) + d(b, a
¯) = d(a, a
¯) = ∆ per ogni altro punto b. In questo
caso, per il lemma precedente, se muoviamo tutti i server nel punto r¯t antipodo
di rt allora la configurazione r¯tk in cui tutti i server sono in r¯t e` un minimizzatore
che risulta essere indipendente dalla funzione lavoro in quanto dipende soltanto
dal punto rt della richiesta.
Esempi di spazi metrici simmetrici sono il cerchio, la superficie della sfera e,
con buona approssimazione, la superficie della terra.
Uno spazio metrico V si dice limitato se le distanze tra i punti hanno un valore
massimo δ detto diametro di V .
1.14. ALGORITMO DELLA FUNZIONE LAVORO
73
Ogni spazio metrico V limitato pu`o essere esteso ad uno spazio simmetrico
W aggiungendo un antipodo a
¯ per ogni punto a dello spazio e ponendo d(¯
a, ¯b) =
d(a, b), d(a, a
¯) = ∆ e d(b, a
¯) = ∆ − d(a, b) dove ∆ = 2δ.
E` facile verificare che se V soddisfa la disuguaglianza triangolare anche W la
soddisfa. Infatti, la disuguaglianza triangolare vale banalmente quando tutti e tre
i punti sono in V oppure tutti e tre sono antipodi. Rimane quindi da verificarla
quando uno dei tre punti e` un antipodo (il caso di due antipodi e` simmetrico).
Siano a, b e c tre punti in V . Per la disuguaglianza triangolare d(b, c) ≤
d(a, b) + d(a, c) e quindi
d(a, b) + d(b, c¯) = d(a, b) + ∆ − d(b, c) ≥ ∆ + d(a, b) − d(b, c)
≥ ∆ − d(a, c) = d(a, c¯)
e
d(a, c¯) + d(¯
c, b) = 2∆ − d(a, c) − d(c, b) ≥ ∆ ≥ d(a, b)
Purtroppo non tutti gli spazi metrici sono limitati ma, ai fini della dimostrazione della disequazione 1.17
CW ORK (ρ) ≤ kCO PTh (ρ) + hCO PT (ρ)
non ci serve considerare tutti i punti dello spazio metrico ma soltanto il sottospazio finito costituito dai punti visitati dagli algoritmi W ORK, O PT e O PTh per
servire le richieste ρ, ossia il punto iniziale r0 da cui partono tutti i server e i punti
r1 , r2 , . . . , rn delle richieste. Chiameremo spazio di interesse questo sottospazio
di n + 1 punti.
Siccome uno spazio con un numero finito di punti e` sempre limitato (il diametro ∆ e` semplicemente la massima distanza tra due punti), possiamo sempre simmetrizzare lo spazio di interesse aggiungendo tutti gli antipodi. Noi lavoreremo
quindi nello spazio simmetrico W = {r0 , r1 , . . . , rn , r¯0 , r¯1 , . . . , r¯n }.
Pertanto, la disequazione 1.21
n
t=1
max{wt (X) − wt−1 (X)} ≤ kCO PTh (ρ) + hCO PT (ρ)
X
possiamo riscriverla come
n
t=1
[wt (r¯t k ) − wt−1 (r¯t k )] ≤ kCO PTh (ρ) + hCO PT (ρ)
74
CAPITOLO 1. ALGORITMI ON-LINE
in quanto sappiamo che r¯t k e` un minimizzatore di wt−1 (A) − D(rt , A) e quindi,
per il Lemma 1.14.5 di dualit`a, wt (r¯t k ) − wt−1 (r¯t k ) e` massimo.
L’idea per dimostrare quest’ultima disequazione e` molto semplice: la riscriveremo nella forma
n
n
wt (r¯t k ) ≤
t=1
s=1
ws−1 (r¯s k ) + kCO PTh (ρ) + hCO PT (ρ)
(1.24)
e quindi costruiremo le tracce di n algoritmi At , per t = 1, . . . , n, che partendo
dalla configurazione iniziale r0k servono le richieste r1 , . . . , rt e quindi terminano
nella configurazione r¯t k . Dalla minimalit`a delle wt (r¯t k ) segue
n
n
wt (r¯t k ) ≤
t=1
t=1
CAt
Mostreremo come sia possibile costruire le tracce degli algoritmi At in modo
tale che la somma dei loro costi risulti minore o uguale di quella delle tracce che
compaiono nelle parte destra della disequazione 1.24 da cui
wt (r¯t k ) ≤
t=1
n
n
n
t=1
CAt ≤
s=1
ws−1 (r¯s k ) + kCO PTh (ρ) + hCO PT (ρ)
La procedura O PTh (ρ) deve certamente servire ciascuna richiesta rt con uno
dei suoi h server. Dopo aver servito rt o il server viene riutilizzato per servire una
richiesta successiva oppure non viene pi`u utilizzato. Per ciascuno degli h server
c’`e una sola richiesta rt che e` l’ultima servita. Sia R l’insieme di tali h richieste.
Costruiremo dapprima gli algoritmi At relativi alle richieste rt ∈ R e poi
quelli relativi alle richieste rt ∈ R.
Sia quindi rt ∈ R e sia rs la richiesta successiva servita dal server che ha
servito rt . Costruiamo l’algoritmo At estendendo la traccia di ws−1 (r¯s k ) con k
archi paralleli che congiungono r¯s a r¯t (vedi Figura 1.14). I costi di tali k archi
sono uguali a quelli degli archi che congiungono rt a rs in ciascuna delle k copie
di O PTh (ρ) che abbiamo a disposizione nella parte destra della disuguaglianza
1.24.
Ci rimangono da costruire gli h algoritmi At relativi alle richieste rt ∈ R per
cui rt e` l’ultima richiesta servita da uno degli h server di O PTh (ρ).
Vediamo quali archi ci rimangono a disposizione per costruire le tracce di
questi ultimi h algoritmi.
Sia S l’insieme delle h richieste rs che sono servite per prime da uno degli h
server di O PTh (ρ).
1.14. ALGORITMO DELLA FUNZIONE LAVORO
75
r¯0
r¯n
r¯1
r¯2
r¯3
r¯t
r¯s−1
r¯s
r1
r2
r3
rt
rs−1
rs
r0
rn
Figura 1.14: Esempio della traccia di At costruita estendendo la traccia di
ws−1 (r¯s k ) con k archi paralleli che congiungono r¯s k a r¯t k . Nell’esempio abbiamo
evidenziato in verde il percorso di uno dei k server di ws−1 (r¯s k ) (quello che serve
la richiesta rs−1 ) prolungato con un arco da r¯s k a r¯t k (tratteggiato). In rosso abbiamo evidenziato il percorso di uno degli h server di O PTh (ρ) (quello che serve
la richiesta rt e poi la richiesta rs ). Le linee punteggiate indicano percorsi che
possono servire anche alcune delle richieste intermedie omesse nella figura.
• Da ns=1 ws−1 (r¯s k ) ci rimangono le h tracce delle ws−1 (r¯s k ) per cui rs ∈ S
e` la prima richiesta servita da uno degli h server di O PTh (ρ). Costo totale
maggiore o uguale a rs ∈S kd(r¯s , r0 ).
• Dalle k copie di O PTh (ρ) ci rimangono k copie degli archi che congiungono
r0 alle h richieste rs ∈ S servite per prime da uno degli h server di O PTh (ρ).
Costo totale uguale a rs ∈S kd(rs , r0 ).
• Tutte le h copie di O PT(ρ).
Il costo totale degli archi che ci rimangono a disposizione nei primi due punti
e`
k[d(r¯s , r0 ) + d(rs , r0 )] ≥ kh∆
rs ∈S
Costruiamo quindi le tracce di ciascuno degli h algoritmi At prendendo gli
archi usati per servire le prime t − 1 richieste da una delle h copie di O PT(ρ) che
ci rimangono a disposizione e aggiungendo i k archi necessari a muovere tutti i
server nella posizione r¯t finale. Il costo di questi ultimi archi e` certamente minore
e uguale a k∆ e pu`o essere pagato con i costi degli archi a disposizione nei primi
due punti.
Dunque
n
t=1
n
CAt ≤
t=1
wt−1 (r¯t k ) + kCO PTh (ρ) + hCO PT (ρ)
76
CAPITOLO 1. ALGORITMI ON-LINE
e quindi la disequazione 1.24 e` verificata e W ORK e` (2k − 1)-competitiva.
Dettagli implementativi
L’algoritmo W ORK deve ad ogni passo trovare la configurazione At che minimizza wt (At ) + D(At , At−1 ). Sappiamo che basta calcolare At = At−1 − xt + rt
dove xt e` quella posizione di un server nella configurazione At−1 che minimizza
la quantit`a
wt−1 (At−1 − xt + rt ) + d(xt , rt )
Per calcolare xt l’algoritmo deve calcolare wt (At−1 ); la posizione xt e` quindi la
posizione in At−1 del server utilizzato dall’algoritmo O PT per servire la richiesta
rt .
La situazione e` illustrata dalla figura seguente dove la traccia di W ORK e`
quella in nero mentra la traccia di wt (At−1 ) e` quella in rosso.
A0 =r0k
Ai−1
At−1
Ai
At =At−1 −xt +rt
Dalla figura possiamo osservare che wt (At ) = wt (At−1 ) − d(xt , rt ) e che vi e`
il limite superiore ovvio Lsup = wt−1 (At−1 ) + d(xt , rt ) ≥ wt (At ).
Indichiamo con X0 = r0k , X1 , . . . , Xt = At le configurazioni per cui passa
l’algoritmo O PT per servire le richieste r1 , . . . , rt e terminare nella configurazione
At e indichiamo con y1 = r0 , y2 , . . . , yt le posizioni dei server mossi da O PT per
servire le richieste r1 , . . . , rt . Il costo pagato da O PT e`
t
wt (At ) =
d(ys , rs )
s=1
Il costo parziale is=1 d(ys , rs ) per servire le prime i richieste e` limitato dal
limite inferiore Linf = d(X0 , Xi ). Se Lsup e` un limite superiore per wt (At ) deve
allora valere per ogni i la diseguaglianza Lsup − ts=i+1 d(ys , rs ) ≥ Linf .
Un limite inferiore migliore si pu`o ottenere osservando che ogni richiesta intermedia rs deve essere stata servita da un server. Sia h il server che ha servito rs
e sia xh la sua posizione in Xi . Allora
Ls,h = d(r0 , rs ) + d(rs , xh ) + d(X0 , Xi ) − d(r0 , xh )
1.14. ALGORITMO DELLA FUNZIONE LAVORO
77
e` un limite inferiore per is=1 d(ys , rs ). Siccome non sappiamo quale sia il server
h che serve rs dovremo prendere come limite inferiore
Ls = min Ls,h
1≤h≤k
e siccome per ogni s abbiamo un limite inferiore Ls possiamo prendere il massimo
Linf = max Ls
1≤s≤i−1
78
CAPITOLO 1. ALGORITMI ON-LINE
Capitolo 2
Algoritmi di Approssimazione
2.1
Introduzione
Molti dei problemi di ottimizzazione che vorremmo risolvere sono NP-difficili.
Vi sono diversi modi per affrontare una tale difficolt`a. Per molti problemi ci sono degli algoritmi di ricerca esaustiva che possono essere accelerati con tecniche
opportune. Alcune di queste tecniche sono: divide-and-conquer ed il pi`u raffinato branch-and-bound che permette di eliminare delle intere parti dell’albero di
ricerca aggiornando ad ogni passo un limite per il valore ottimo; la programmazione dinamica che talvolta conduce ad algoritmi pseudo polinomiali; la tecnica
del piano separatore (per problemi di programmazione intera) mediante la quale
si cerca di raffinare il rilassamento in programmazione lineare per ridurre la regione ammissibile all’involucro convesso delle soluzioni intere; la randomizzazione
che pu`o ridurre la complessit`a media dell’algoritmo; ecc.
Invece di cercare la soluzione ottima, possiamo anche decidere di accontentarci di una soluzione sub-ottimale. Quest’ultimo approccio si riferisce a metodi
euristici. La maggior parte di questi metodi usano un qualche tipo di ricerca locale
nello spazio delle soluzioni fornendo una soluzione localmente ottimale.
In realt`a i metodi euristici si possono anche applicare a problemi di complessit`a polinomiale quando gli algoritmi a disposizione non siano abbastanza efficienti. Un algoritmo di complessit`a Θ(n10 ) o anche un algoritmo di complessit`a
lineare Θ(cn) con costante c = 10100 , bench´e sia efficiente dal punto di vista
della complessit`a asintotica, probabilmente non verr`a mai usato a causa della sua
inefficienza.
Il problema con gli algoritmi euristici e` che e` molto difficile confrontarli. Qua79
80
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
le e` il migliore, quale il peggiore? Di norma un algoritmo euristico funziona
meglio di un altro su certe istanze del problema e peggio su certe altre istanze.
Alcuni tipi di analisi che si possono usare per confrontare algoritmi euristici
sono:
Analisi empirica L’euristica viene valutata su un insieme (sperabilmente significativo) di istanze del problema. Naturalmente non vi e` alcuna garanzia
che il comportamento dell’euristica su tali istanze sia “tipico” (ma cosa
significa poi comportamento tipico?).
Analisi del caso medio Si valuta il comportamento dell’euristica nel caso medio in riferimento ad una qualche distribuzione di probabilit`a delle istanze
del problema. La difficolt`a in questo caso e` che e` molto difficile trovare
una distribuzione di probabilit`a che rispecchi esattamente la distribuzione
delle istanze su cui verr`a usato l’algoritmo nella pratica. Inoltre l’analisi
probabilistica risulta spesso molto difficile.
Analisi del caso pessimo Si valuta il comportamento dell’euristica nel caso peggiore possibile. Bench´e questo tipo di analisi possa sembrare eccessivamente pessimistico, esso ci fornisce una garanzia assoluta sul comportamento
dell’euristica. Questo e` dunque il tipo di analisi che noi useremo.
Introduciamo quindi la seguente definizione.
Definizione 2.1.1 Diciamo che un algoritmo euristico per un problema di minimizzazione (massimizzazione) ha rapporto di approssimazione garantito α se esso
ci garantisce di trovare una soluzione di valore al pi`u (almeno) pari ad α volte il
valore di una soluzione ottima.
Naturalmente deve essere α ≥ 1 per problemi di minimizzazione ed α ≤ 1 per
problemi di massimizzazione.
Definizione 2.1.2 Un algoritmo di α-approssimazione e` un algoritmo di complessit`a polinomiale che garantisce un rapporto di approssimazione α.
Prima di affrontare le tecniche di progetto e analisi degli algoritmi di approssimazione e di illustrare alcuni algoritmi di approssimazione particolari, vediamo
alcuni risultati negativi, ossia risultati del tipo
“Non esiste alcun algoritmo di α-approssimazione per nessun valore
di α”
2.2. RISULTATI NEGATIVI
81
che escludono l’approssimabilit`a di alcuni tipi di problemi, oppure del tipo
“Non esiste alcun algoritmo di α-approssimazione per valori di α
minori (maggiori) di una certa costante c”
che ne limitano l’approssimabilit`a.
2.2
Risultati negativi
Per alcuni problemi di ottimizzazione NP-difficili e` possibile dimostrare un limite
al rapporto di approssimazione garantito α raggiungibile con algoritmi polinomiali (assumendo che P = NP).
Una metodologia standard per dimostrare risultati di questo tipo e` dimostrare che l’esistenza di un algoritmo polinomiale di α-approssimazione per un certo problema permette di risolvere in tempo polinomiale qualche problema NPcompleto.
Osserviamo che, bench´e tutti i problemi NP-completi abbiano complessit`a
equivalente in quanto essi sono riducibili uno all’altro in tempo polinomiale, una
tale riduzione non necessariamente preserva anche l’approssimabilit`a. Di conseguenza possiamo suddividere i problemi NP-completi in classi a seconda della loro approssimabilit`a. Come primo esempio consideriamo il problema del
commesso viaggiatore:
“Assegnate delle lunghezze non negative agli archi di un grafo completo trovare un percorso chiuso di lunghezza minima che visita tutti
i vertici una sola volta.”
Per questo problema non esistono algoritmi di α-approssimazione per nessun
α, a meno che P = NP. Infatti, se esistesse un tale algoritmo potremmo decidere
in tempo polinomiale se un grafo G = (V, E) ha un ciclo Hamiltoniano, problema
che sappiamo essere NP-completo.
Per fare questo basta applicare l’algoritmo di approssimazione al grafo completo con vertici V , lunghezza 1 per gli archi che appartengono anche al grafo G e
lunghezza maggiore di α|V | per ogni altro arco. In questo modo un giro nel grafo
completo ha lunghezza |V | se e` costituito soltanto da archi in G, altrimenti la sua
lunghezza e` strettamente maggiore di α|V |. Se l’algoritmo di approssimazione risponde che la lunghezza minima di un giro e` n = |V | tale giro e` un ciclo Hamiltoniano di G. Se l’algoritmo di approssimazione risponde che la lunghezza minima
82
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
di un giro e` n > α|V | allora il valore ottimo m deve essere m ≥ n/α > |V | e
quindi non esiste alcun ciclo Hamiltoniano per G.
Un altro esempio e` il problema dell’impacchettamento (che e` NP-completo):
“Dati n oggetti con pesi x1 , x2 , . . . , xn tutti minori o uguali ad un
certo valore T si chiede di raggrupparli in pacchetti di peso minore o
uguale a T usando il minimo numero possibile di pacchetti.”
Per questo problema non esistono algoritmi di α-approssimazione con α <
Infatti, consideriamo il problema della partizione (che e` pure NP-completo):
3
.
2
“Dati n oggetti con pesi interi x1 , x2 , . . . , xn tutti minori o uguali ad
S e la cui somma e` ni=1 xi = 2S esiste una partizione in due insiemi
tale che la somma dei pesi di ciascuna parte sia esattamente S?”
Questo e` come chiedere: bastano due pacchetti di peso minore od uguale ad S
per raggruppare tutti gli oggetti? Se avessimo un algoritmo di α-approssimazione
con α < 32 per il problema dell’impachettamento potremmo risolvere il problema
della partizione in tempo polinomiale.
Infatti, sia m il valore ottimo ed n il valore calcolato dall’algoritmo. Se α < 23
devono valere le disequazioni m ≤ n ≤ αm < 32 m.
Se l’algoritmo di approssimazione risponde n = 2 deve essere 43 < m ≤ 2
e quindi m = 2 mentre se l’algoritmo di approssimazione risponde n ≥ 3 deve
essere 32 3 = 2 < m e quindi m > 2.
Pi`u in generale, se il problema di decidere se un certo valore intero e` al pi`u k
risulta essere NP-completo, allora per il problema di minimizzare tale valore non
esistono algoritmi di α-approssimazione per α < k+1
a meno che P = NP.
k
Fino al 1992, gli esempi noti di non approssimabilit`a erano ottenuti con ragionamenti semplici come quelli appena visti. Nel 1992, Arora, Lund, Motwani e
Szegedy pubblicarono un articolo [1] (basato su di un lavoro di Arora e Safra [2])
in cui viene data una nuova caratterizzazione dei problemi NP in termini di prove
controllabili probabilisticamente (PCP).
Prima di illustrare questa nuova caratterizzazione richiamiamo la definizione
classica delle classi di complessit`a P ed NP.
2.2.1
Le classi P ed NP
La definizione standard delle classi di problemi P ed NP e` la seguente
2.2. RISULTATI NEGATIVI
83
Definizione 2.2.1 Un problema P appartiene alla classe di complessit`a P se e
solo se e` risolubile in tempo polinomiale su di una macchina di Turing deterministica. Un problema P appartiene alla classe di complessit`a NP se e solo se e`
risolubile in tempo polinomiale su di una macchina di Turing non deterministica.
Consideriamo il caso in cui il problema P sia un problema di decisione, la cui
risposta e` soltanto SI oppure NO. Se indichiamo con L(P) l’insieme di tutti gli
input x (o meglio delle codifiche degli input) per i quali la risposta e` SI possiamo
interpretare il problema di decisione P come il problema di decidere se una certa
stringa x appartiene ad un linguaggio L(P). Abbiamo quindi la seguente
Definizione 2.2.2 Il problema di decisione P e` in NP se e solo se esiste una
macchina di Turing non deterministica che accetta il linguaggio L(P) in tempo
polinomiale.
Questa definizione si pu`o estendere ad altri tipi di problemi utilizzando la seguente
tecnica della riduzione
Lemma 2.2.3 Sia P un problema in NP, M la macchina di Turing che lo risolve
e sia P un altro problema. Se esiste una macchina di Turing M che risolve P
usando la macchina M come sottoprogramma per un numero costante N = O(1)
di volte e tale che per ogni input x di P il numero di passi eseguiti da M (esclusi
quelli eseguiti da M quando viene richiamata) e` polinomiale nella lunghezza
dell’input x allora anche P e` in NP.
Dimostrazione. Sia T (x) il numero polinomiale di passi eseguiti da M su un
input di dimensione x e T (y) il numero polinomiale di passi eseguiti da M su un
input di dimensione y e sia k tale che T (x) = O(xk ) e T (y) = O(y k ).
` la dimenIl numero totale di passi e` Ttot (x) = T (x) + N
i=1 T (yi ) dove yi e
sione dell’input della i-esima chiamata ad M.
Indichiamo con Ti (x) il numero di passi totale effettuati prima della chiamata
i-esima per i = 1, 2, . . . , N e poniamo inoltre TN +1 (x) = Ttot (x).
La costruzione dell’input di dimensione yi per la chiamata i-esima di M
richiede almeno yi passi e quindi yi ≤ Ti (x).
Dunque T (yi ) ≤ T (Ti (x)) = O (Ti (x))k e quindi
Ti+1 (x) ≤ Ti (x) + T (yi ) + T (x)
= Ti (x) + T (Ti (x)) + T (x) = O (Ti (x))k + O(xk )
84
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Dato che T1 (x) ≤ T (x) = O(xk ) abbiamo Ti+1 (x) = O (T1 (x))ik +
O(xk ) = O(x(i+1)k ) e quindi Ttot (x) = TN +1 (x) = O(x(N +1)k ) = O(xO(1) ) e`
polinomiale in x.
Ricordiamo che una macchina di Turing non deterministica accetta un linguaggio L se esiste almeno una successione di scelte non deterministiche che conduce
ad uno stato di accettazione.
Se vogliamo dimostrare che una certa stringa x appartiene al linguaggio L accettato dalla macchina di Turing non deterministica M dobbiamo esibire una successione y di scelte non deterministiche che conduce ad uno stato di accettazione.
Chiamiamo tale successione y una prova di x ∈ L.
Per verificare se y e` una prova di x ∈ L basta simulare l’esecuzione di M con
input x effettuando le scelte non deterministiche specificate in y.
Un verificatore di y e` quindi semplicemente una macchina di Turing deterministica V ottenuta da M aggiungendo un nastro in cui memorizzare la prova y da
usare per rendere deterministiche le scelte di M.
Notiamo che siccome M accetta in tempo polinomiale nella lunghezza dell’input x, essa effettua al pi`u un numero polinomiale di scelte non deterministiche.
Di conseguenza possiamo assumere che la lunghezza di una prova y per x ∈ L sia
pure polinomiale nella lunghezza dell’input x. Pertanto
Osservazione 5 Se la macchina non deterministica M accetta in tempo polinomiale, il verificatore V cos`ı ottenuto e` una macchina deterministica che accetta in
tempo polinomiale.
Un verificatore V e` quindi una macchina di Turing deterministica che, avendo
in ingresso un input x per la macchina non deterministica M ed una prova y di
x ∈ L accetta se e solo se la macchina M accetta x effettuando le scelte non
deterministiche specificate nella prova y.
Facendo ricorso alla tesi di Church (che ogni procedura effettiva pu`o essere
eseguita su una macchina di Turing), noi useremo la definizione di prova e di
verificatore in un modo informale.
Ad esempio se il problema e` quello di decidere se un grafo G e` Hamiltoniano, una prova e` semplicemente un ciclo Hamiltoniano ed un verificatore e` un
algoritmo che dato il grafo (l’input) ed un ciclo (la prova) controlla che esso sia
effettivamente un ciclo Hamiltoniano per il grafo G.
Abbiamo visto (Osservazione 5) che ogni problema di decisione in NP ha un
verificatore in P.
2.2. RISULTATI NEGATIVI
85
Viceversa, supponiamo che per un problema di decisione P esista un verificatore V che richiede tempo polinomiale nella lunghezza dell’input x per controllare
una prova y di x ∈ L(P).
Poich´e V in tempo polinomiale pu`o ispezionare soltanto una parte iniziale di
lunghezza polinomiale del nastro contenente la prova y possiamo assumere che la
prova y abbia lunghezza polinomiale nella lunghezza di x, ossia che |y| ≤ p(|x|)
con p polinomio che dipende soltanto da V.
Possiamo allora costruire una macchina di Turing non deterministica M che
accetta L(P) in tempo polinomiale nel modo seguente: la macchina M genera
non deterministicamente tutte le possibili prove y di lunghezza minore o uguale di
p(|x|) ed usa il verificatore V per decidere se x ∈ L(P) con prova y. La macchina
M accetta L(P) in tempo polinomiale e dunque il problema P e` in NP.
Questo giustifica la seguente caratterizzazione dei problemi NP
Definizione 2.2.4 Un problema P e` in NP se e solo se esiste un verificatore V
che richiede tempo polinomiale nella lunghezza dell’input x per controllare una
prova y di x ∈ L(P).
Un problema P si dice NP-difficile se ogni problema P ∈ NP pu`o essere
ridotto a P. Se il problema NP-difficile P appartiene esso stesso alla classe NP
allora si dice che esso e` NP-completo.
Dalla definizione segue immediatamente che tutti i problemi NP-completi sono equivalenti tra loro in quanto riducibili uno all’altro. Per dimostrare P = NP
basterebbe quindi trovare un algoritmo polinomiale per un qualsiasi problema
NP-completo.
L’esistenza di problemi NP-completi e` assicurata dal seguente teorema di
Cook.
Teorema 2.2.5 (Teorema di Cook) Il problema 3Sat e` NP-completo.
L’input del problema 3Sat e` una formula logica costituita dalla congiunzione di
clausole, ciascuna delle quali e` la disgiunzione di tre letterali che a loro volta sono
o una variabile logica x o la sua negazione x. Ad esempio:
(x1 ∨ x2 ∨ x3 ) ∧ (x3 ∨ x4 ∨ x2 ) ∧ . . . ∧ (x7 ∨ x1 ∨ x8 )
Il risultato e` SI se esiste una assegnazione di valori booleani alle variabili logiche
tale che la formula risulti vera, e` NO altrimenti.
La dimostrazione del Teorema di Cook (che si pu`o trovare in ogni testo di
computabilit`a) consiste essenzialmente nel mostrare come, data la macchina di
86
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Turing non deterministica M che risolve un problema P ∈ NP ed un input x
per P, sia possibile costruire, in tempo polinomiale nella dimensione di x, una
formula logica FM,x che simula la macchina M sull’input x, nel senso che FM,x
e` soddisfacibile se e solo se M accetta x.
Osserviamo che la complessit`a polinomiale della costruzione dipende soltanto
dalla dimensione di x in quanto la dimensione di M e` una costante e la dimensione
di FM,x e` sicuramente polinomiale nella dimensione di x in quanto essa e` costruita
in tempo polinomiale.
Una volta dimostrato che 3Sat e` NP-completo possiamo usare il Lemma di
riduzione 2.2.3 per dimostrare che altri problemi sono NP-completi oppure soltanto NP-difficili. Questo e` stato fatto per un gran numero di problemi naturali
(che non hanno niente a che fare con le macchine di Turing) per cui oggi si conoscono moltissimi problemi NP-completi ed NP-difficili. Nel prossimo paragrafo
mostreremo una di tali riduzioni.
2.2.2
Riduzione di 3Sat a 3Color
Nel problema 3Color viene dato un grafo non orientato e si chiede se sia possibile
colorarne i vertici con 3 colori distinti in modo tale che vertici adiacenti abbiano
sempre colori diversi. Detto in altro modo si tratta di verificare se il grafo e` tripartito, ossia se i vertici possono essere suddivisi in tre parti in modo tale che nessun
arco connetta due vertici che stanno dalla stessa parte.
Lo stesso problema con 2 soli colori, ossia verificare se un grafo e` bipartito si
pu`o risolvere in tempo lineare con una semplice ricerca in profondit`a.
Il problema della tripartizione e` invece molto pi`u difficile. Dimostreremo infatti che 3Color e` NP-difficile effettuando una riduzione a 3Color del problema
3Sat (che sappiamo essere NP-completo per il teorema di Cook).
Per fare questo dobbiamo mostrare come dato un input per 3Sat (un insieme
di clausole ternarie) sia possibile costruire un grafo G che risulti 3-colorabile se e
solo se la congiunzione di tutte le clausole in input e` soddisfacibile.
Sia dato un input per 3Sat costituito da un insieme finito di clausole ternarie
del tipo c = l1 ∨ l2 ∨ l3 . Costruiamo il grafo G = (V, E) nel modo seguente:
1. Mettiamo in V un vertice per ogni letterale l che compare in qualche clausola e un vertice per ogni clausola c ed infine aggiungiamo due vertici speciali
a e b.
2. Mettiamo in E i seguenti archi:
2.2. RISULTATI NEGATIVI
87
(a) l’arco ab;
(b) i due archi ac e cb per ogni clausola c.
(c) un arco al per ogni letterale l.
(d) l’arco ll per ogni coppia di letterali complementari l = x ed l = x.
3. infine, per ogni clausola c = l1 ∨ l2 ∨ l3 colleghiamo i vertici l1 , l2 , l3 con il
vertice c mediante il seguente sottografo (gadget):
1
l1
3
4
c
l2
2
5
l3
Questo comporta l’aggiunte di 5 nuovi vertici e 10 nuovi archi per ogni
clausola c.
Il grafo completo ha quindi la seguente forma:
l1
l2 =x
c
l3
a
b
l1 =¯
x
c
l2
l3
88
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Figura 2.1: Le 3-colorazioni relative alle altre sette colorazioni possibili di
l1 , l2 , l3 .
dove i vertici l1 , l2 , l3 non necessariamente sono distinti dai vertici l1 , l2 , l3 .
Dobbiamo dimostrare che le clausole sono tutte soddisfacibili se e solo se il
grafo G e` 3-colorabile.
Osserviamo intanto che in ogni 3-colorazione i vertici di un triangolo devono
avere tre colori distinti. In particolare i tre vertici a, b, c devono avere tre colori
distinti. Usiamo i tre colori bianco, verde e rosso e assumiamo, senza perdita
di generalit`a, che in ogni 3-colorazione del grafo G i tre vertici a, b, c abbiano
rispettivamente i colori: a bianco, b rosso e c verde.
Osserviamo inoltre che in ogni possibile 3-colorazione i vertici l1 , l2 , l3 possono assumere soltanto i colori verde o rosso in quanto il vertice adiacente a e`
bianco.
2.2. RISULTATI NEGATIVI
89
In realt`a, data la struttura del gadget, i tre vertici l1 , l2 , l3 possono assumere tutte le possibili combinazioni dei due colori verde e rosso esclusa la combinazione
in cui essi sono tutti e tre rossi.
Infatti, se l1 , l2 , l3 fossero tutti e tre rossi allora i vertici 1 e 2 del gadget dovrebbero essere uno verde ed uno bianco e di conseguenza il vertice 3 dovrebbe
essere rosso. Dunque i vertici 4 e 5 del gadget dovrebbero essere uno verde ed
uno bianco e dunque c non pu`o essere verde.
Le 3-colorazioni relative alle altre sette colorazioni possibili di l1 , l2 , l3 sono
illustrate nella Figura 2.1.
Dunque se il grafo G e` 3-colorabile e interpretiamo il colore verde come VERO
ed il colore rosso come FALSO esiste almeno una assegnazione di valori booleani
ai letterali delle clausole tale che due letterali opposti abbiano valori opposti e in
ogni clausola ci sia almeno un letterale VERO.
Viceversa, se vi e` una assegnazione di valori booleani per cui due letterali
opposti abbiano valori opposti e in ogni clausola ci sia almeno un letterale VERO
allora possiamo costruire una 3-colorazione del grafo G colorando il vertice a
bianco, il vertice b rosso, tutti i vertici c verde e i vertici relativi ai letterali verde o
rosso a seconda che ad essi sia assegnato il valore VERO o FALSO. Infine usiamo
le 7 colorazioni dei gadget appena viste per colorare i nodi interni ai gadget.
Dunque 3Color e` NP-difficile. Possiamo dimostrare anche che 3Color e` NPcompleto osservando che esso pu`o essere risolto con una macchina di Turing
non deterministica che genera non deterministicamente una colorazione qualsiasi
(tempo O(n)) e quindi la verifica (tempo O(m)).
2.2.3
Dimostrazioni “oltre ogni ragionevole dubbio”
Riformuliamo la definizione classica della classe NP in termini di verifica di una
prova:
Definizione 2.2.6 Un linguaggio L ⊆ Σ∗ appartiene alla classe NP se e solo
se esiste una macchina di Turing deterministica VL (verificatore per L) che con
input una istanza x del problema di lunghezza n ed una prova y di lunghezza
polinomiale in n si comporta nel seguente modo:
• Esecuzione: VL termina in tempo polinomiale e risponde ACCETTO oppure
RIFIUTO .
• Completezza perfetta: Se x ∈ L allora esiste almeno una prova y tale che
VL con input (x, y) accetta.
90
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
• Sicurezza perfetta: Se x ∈ L allora VL con input (x, y) rifiuta qualunque
sia la prova y.
Ad esempio, per il problema 3Sat il linguaggio L e` l’insieme di tutte le formule x (congiunzioni di clausole ternarie) che sono soddisfacibili mentre y e` una
assegnazione di valori booleani alle variabili della formula. Il verificatore VL si
limita quindi a calcolare il valore della formula x con l’assegnazione y. Chiaramente se n e` la lunghezza di x la lunghezza di y e` O(n) e il calcolo si pu`o fare in
tempo O(n).
Nella definizione precedente le condizioni di completezza e sicurezza sono
molto restrittive. Con questa definizione una dimostrazione e` molto simile ad una
classica dimostrazione matematica. Non c’`e possibilit`a di errore e una affermazione, quale ad esempio x ∈ L, e` vera se e solo se esiste una prova assolutamente
certa.
Consideriamo ora il concetto di prova che si usa in un tribunale. In questo caso ci si accontenta di una prova “oltre ogni ragionevole dubbio”, ammettendo che
ci possa essere una qualche possibilit`a teorica che l’affermazione da dimostrare
risulti falsa ma tale possibilit`a abbia probabilit`a talmente piccola da risultare assolutamente trascurabile (ad esempio, in teoria, potrebbe esistere una minima probabilit`a che una pistola cada dal cielo, urtando il suolo spari il colpo che uccide la
vittima e poi rimbalzi nella mano del sospettato).
Torniamo nel nostro ambiente computazionale. Supponiamo di accettare di
accontentarci di una prova oltre ogni ragionevole dubbio, ossia con probabilit`a di
errore al pi`u ε. In altre parole noi usiamo la randomizzazione nel nostro procedimento di controllo della prova e ammettiamo che con probabilit`a minore o uguale
di ε possa succedere che viene accettato x ∈ L (sicurezza imperfetta) oppure
venga rifiutato x ∈ L (completezza imperfetta).
Con questa nozione indebolita di dimostrazione (e usando la randomizzazione) noi possiamo risparmiare moltissimo sulle risorse computazionali necessarie
per controllare la prova.
Definiamo ora formalmente le classi di linguaggi decidibili con prove oltre
ogni ragionevole dubbio ma prima dobbiamo definire il concetto di verificatore
probabilistico (ossia il procedimento probabilistico di controllo di tali prove).
Definizione 2.2.7 (Verificatore probabilistico.) Date quattro funzioni , q, r, t sugli interi positivi, un verificatore ( , q, r, t)-ristretto e` una macchina di Turing deterministica V avente accesso ad un generatore casuale di bit e ad una memoria
ad accesso diretto (RAM) in cui e` memorizzata la prova y. Con input x di lunghezza n la macchina V riceve una prova y di lunghezza |y| ≤ (n), genera al
2.2. RISULTATI NEGATIVI
91
pi`u r(n) bit casuali, sulla base di tali bit accede ad al pi`u a q(n) posizioni nella
prova y e, in un tempo totale minore o uguale a t(n), risponde ACCETTO oppure
RIFIUTO .
Se specifichiamo il livello di completezza e di sicurezza per un verificatore
( , q, r, t)-ristretto abbiamo definito completamente una classe di complessit`a:
Definizione 2.2.8 (Classi PCP.) Siano , q, r, t come nella Definizione 2.2.7 precedente e siano c, s due funzioni N → [0, 1] degli interi non negativi nei reali
compresi tra 0 e 1. Allora la classe:





PCP 




lunghezza
randomizzazione
query
tempo
completezza
sicurezza
=
=
=
=
=
=
(n)
r(n)
q(n)
t(n)
c(n)
s(n)










e` la classe di tutti i linguaggi L per i quali esiste un verificatore V probabilistico
( , q, r, t)-ristretto tale che:
• Completezza: Se x ∈ L allora esiste almeno una prova y tale che V con
input (x, y) accetta con probabilit`a maggiore o uguale a c(n).
• Sicurezza: Se x ∈ L allora per ogni prova y il verificatore V con input
(x, y) rifiuta con probabilit`a maggiore o uguale ad s(n).
Le probabilit`a vengono calcolate assumendo che la sequenza degli r(n) bit generati sia scelta casualmente e uniformemente fra tutte le sequenze in {0, 1}r(n) .
Se non vengono specificate c ed s si assume implicitamente che c = 1 (completezza perfetta) ed s = 1/2.1
Per ogni verificatore probabilistico V abbiamo sempre r(n) = O(t(n)) (per
generare r(n) bit casuali occorre almeno tempo proporzionale ad r(n)) e q(n) =
O(t(n)) (per ispezionare q(n) posizioni della prova occorre almeno tempo proporzionale a q(n)).
Possiamo inoltre assumere, senza perdita di generalit`a, che
(n) ≤ q(n)2r(n) = O(t(n)2r(n) )
1
Il valore 1/2 e` stato scelto per convenienza. Qualunque valore s > 0 va altrettanto bene.
Possiamo infatti ripetere l’esecuzione del verificatore per un sufficiente numero di volte t in modo
che la probabilit`a 1 − (1 − s)t di rifiutare almeno una volta diventi maggiore di 1/2.
92
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
altrimenti ci sarebbero alcune posizioni della prova che non vengono mai controllate con nessuna scelta casuale e che quindi sono inutili e possono essere eliminate
accorciando la prova.
Indichiamo con
∞
O(nk )
poly(n) =
k=0
la classe delle funzioni polinomiali e quindi gli algoritmi di complessit`a polinomiale sono quelli per cui t(n) = poly(n).
Quando per un verificatore probabilistico non specifichiamo e t assumiamo
implicitamente che t(n) = poly(n) ed (n) = poly(n). Dunque quando parliamo
di verificatore (r, q)-ristretto intendiamo ( , q, r, t)-ristretto con = poly(n) e
t = poly(n).
La classe PCP(r, q) e` quindi costituita da tutti i problemi per i quali esiste un
verificatore probabilistico (r, q)-ristretto con = poly(n), t = poly(n), c = 1 ed
s = 1/2.
Possiamo osservare che se r(n) = 0 il verificatore probabilistico si riduce ad
uno deterministico e quindi i problemi che appartengono alla classe PCP(0, q) sono quelli per i quali esiste un verificatore deterministico con complessit`a poly(n).
Dalla Definizione 2.2.4 segue la seguente caratterizzazione della classe NP.
Teorema 2.2.9 NP = PCP(0, poly(n))
Ovvero, tenendo conto dei valori convenzionali per , t, c ed s:

NP =




PCP 




lunghezza
randomizzazione
query
tempo
completezza
sicurezza
=
=
=
=
=
=
poly(n)
0
poly(n)
poly(n)
1
1/2










Osserviamo che essendo in questo caso il verificatore deterministico dire che
rifiuta x ∈ L con probabilit`a maggiore di 1/2 e` come dire che rifiuta senz’altro.
Un risultato importante ottenuto in [1] e` che esiste anche un’altra caratterizzazione della classe NP in termini di verificatori (effettivamente) probabilistici e
precisamente
Teorema 2.2.10 (Arora) NP = PCP(log n, 1).
2.2. RISULTATI NEGATIVI
93
Ovvero, tenendo conto dei valori convenzionali per , t, c ed s:

NP =




PCP 




lunghezza
randomizzazione
query
tempo
completezza
sicurezza
=
=
=
=
=
=
poly(n)
O(log(n))
O(1)
poly(n)
1
1/2










In altre parole la classe NP e` costituita dai problemi le cui prove sono controllabili da un verificatore probabilistico che genera un numero di bit logaritmico
nella lunghezza dell’input e sulla base di tali bit sceglie un numero costante di bit
della prova da controllare.
Noi ometteremo la dimostrazione di questo teorema (che e` molto complicata)
e ci limiteremo ad usarlo per dimostrare alcuni risultati di non approssimabilit`a.
Recentemente Irit Dinur [6] ha pubblicato una dimostrazione pi`u semplice del
teorema 2.2.10 basata su un risultato di non approssimabilit`a, ottenuto direttamente, per una generalizzazione del problema 3Color. Anche questa dimostrazione, bench´e molto pi`u intuitiva di quella di Arora, risulta comunque piuttosto
complicata (una ventina di pagine).
2.2.4
Risultati negativi derivati dal Teorema PCP
Consideriamo il seguente problema Max-3Sat: dato un insieme di clausole ternarie trovare una assegnazione di valori booleani alle variabili che massimizza
il numero di clausole verificate. Chiaramente, se sappiamo risolvere Max-3Sat
sappiamo risolvere anche 3Sat e dunque Max-3Sat e` NP-difficile.
Per Max-3Sat vale il seguente
Teorema 2.2.11 Esiste un > 0 tale che nessun algoritmo di approssimazione
per il problema Max-3Sat pu`o avere coefficiente di approssimazione maggiore o
uguale di 1 − (a meno che P = NP).
Dimostrazione. Sia L il linguaggio di un qualsiasi problema di decisione NPcompleto P e sia V il verificatore probabilistico (log n, 1)-ristretto la cui esistenza
e` assicurata dal Teorema 2.2.10.
Osserviamo che il numero di sequenze distinte di bit casuali di lunghezza
O(log n) e` s = 2O(log n) che e` polinomiale in n.
94
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
bi1 , bi2 , . . . , bik−1 , bik
0 0 ... 0
0
0 0 ... 0
1
0 0 ... 1
0
0 0 ... 1
1
...
0 1 ... 0
0
0 1 ... 0
1
0 1 ... 1
0
...
risultato
0
0
1
0
...
1
0
1
...
Figura 2.2: Tavola di verit`a delle risposte di un verificatore (log n, 1)-ristretto in
funzione dei k bit bi1 , bi2 , . . . , bik selezionati. La risposta SI e` rappresentata dal
risultato 1 e la risposta NO e` rappresentata dal risultato 0.
Consideriamo una di queste sequenze. Essa individua nella prova y un numero
costante bi1 , bi2 , . . . , bik di bit da controllare e sulla base di tali bit il verificatore
decide se rispondere ACCETTO oppure RIFIUTO.
La risposta del verificatore in funzione dei k bit bi1 , bi2 , . . . , bik selezionati
pu`o essere rappresentate con una tavola di verit`a del tipo di quella in Figura 2.2
interpretando il risultato ACCETTO con 1 e RIFIUTO con 0.
Possiamo tradurre la tavola di verit`a in una formula logica nelle variabili booleane bi1 , bi2 , . . . , bik in due modi: come disgiunzione di al pi`u 2k congiunzioni di
k letterali: una congiunzione per ogni riga della tavola la cui risposta e` 1.
Ad esempio la terza riga della tavola di Figura 2.2 fornisce la congiunzione
bi1 ∧ bi2 ∧ . . . ∧ bik−1 ∧ bik
Alternativamente, possiamo tradurre la tavola di verit`a come congiunzione di
al pi`u 2k disgiunzioni di k letterali (una disgiunzione per ogni riga con risposta 0).
Ad esempio la quarta riga della tavola di Figura 2.2 fornisce la disgiunzione
bi1 ∨ bi2 ∨ . . . ∨ bik−1 ∨ bik
In questo secondo modo otteniamo una formula per kS AT. Siccome k = O(1)
(e quindi anche 2k = O(1)) quest’ultima formula si pu`o esprimere come una
formula per 3S AT avente un numero costante di clausole e di variabili (bench´e
esponenziale in k). Pi`u precisamente, usando la riduzione classica da S AT a 3S AT,
si ottiene una formula con al pi`u O(k2k ) clausole e variabili.
2.2. RISULTATI NEGATIVI
95
Nella riduzione classica una clausola di k letterali
l1 ∨ l2 ∨ . . . ∨ lk−1 ∨ lk
viene dapprima rappresentata con un albero
yk ∨
yk−1 ∨
k
k
y3 ∨
y2 ∨
1
3
2
introducendo una nuova variabile yi per ogni nodo interno. (La variabile yi rappresenta il valore della sottoclausola rappresentata dal sottoalbero radicato nel
nodo.)
La clausola viene quindi riscritta nella forma equivalente
yk ∧ [yk ⇔ (yk−1 ∨ lk )] ∧ . . . ∧ [y2 ⇔ (l1 ∨ l2 )]
Ciscun congiunto del tipo yk ⇔ (yk−1 ∨ lk ) si scompone nelle congiunzione
delle due implicazioni yk ⇒ (yk−1 ∨ lk ) e (yk−1 ∨ lk ) ⇒ yk . Le implicazioni
A ⇒ B vengono quindi espresse in modo classico come A ∨ B ottenendo:
(yk ∨ yk−1 ∨ lk ) ∧ ((yk−1 ∨ lk ) ∨ yk )
che e` equivalente a
(yk ∨ yk−1 ∨ lk ) ∧ (yk−1 ∨ yk ) ∧ (lk ∨ yk )
In questo modo la clausola iniziale viene trasformata nella congiunzione di clausole con al pi`u tre letterali. Per ottenere tutte clausole ternarie possiamo replicare
alcuni letterali usando l’equivalenza l = l ∨ l.
Sia m = O(1) il numero di clausole ternarie che si ottiene in questo modo.
Se x ∈ L sappiamo che esiste una prova y tale che risultino soddisfatte tutte
le m clausole relative a tutte le s possibili sequenze di bit casuali, in totale ms
clausole.
96
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Se invece x ∈ L allora, per ogni prova y almeno una met`a degli s gruppi di
m clausole relativi alle s possibili sequenze di bit casuali contiene almeno una
clausola che non e` soddisfatta. Questo significa che se x ∈ L di tutte le ms
clausole almeno 12 s non sono soddisfatte.
Supponiamo esista un algoritmo di approssimazione A per Max-3Sat con rap1
e sia CA il valore ottenuto
porto di approssimazione α = 1 − per < 2m
applicando l’algoritmo A all’insieme delle ms clausole ternarie.
Se CA < αms allora CO PT ≤ CA /α < ms e quindi non tutte le clausole sono
soddisfacibili. Di conseguenza possiamo decidere che x ∈ L.
1
1
Se CA ≥ αms > (1 − 2m
)ms allora vi sono meno di 2m
ms = 12 s clausole
non soddisfatte e dunque possiamo decidere che x ∈ L.
Possiamo quindi decidere x ∈ L in tempo polinomiale (in quanto la nostra costruzione pu`o essere fatta in tempo polinomiale). Siccome il problema di
decisione P e` NP-completo questo e` possibile soltanto se P = NP.
Dal teorema precedente discendono un gran numero di risultati negativi. In
particolare il seguente Corollario che afferma la non approssimabilit`a di tutti i
problemi che sono completi nella classe M AX -S NP, introdotta da Papadimitriou e
Yannakakis in [17], e che noi definiremo in seguito.
Corollario 2.2.12 Per ogni problema M AX -S NP completo esiste una costante
tale che non esiste alcun algoritmo di α-approssimazione con α ≥ 1 − , a meno
che P = NP.
Per ora ci limitiamo ad elencare alcuni problemi che appartengono a tale
classe.
Max-2Sat: Dato un insieme di clausole ciascuna delle quali contiene uno o due
letterali, trova una assegnazione che massimizza il numero di clausole verificate.
Max-k Sat: Come Max-2Sat tranne che le clausole possono contenere fino a k
letterali ciascuna.
Max-Cut: Trovare un taglio massimo di un grafo.
Tsp-Euclideo: Problema del commesso viaggiatore in cui le distanze soddisfano
la disuguaglianza triangolare2 .
2
Attenzione, M AX -S NP contiene soltanto problemi di massimizzazione, mentre Tsp e` un problema di minimizzazione. Si sottintende quindi una sua trasformazione preventiva in problema di
massimizzazione. Lasciamo al lettore individuare una tale facile trasformazione
2.2. RISULTATI NEGATIVI
2.2.5
97
Problemi M AX -S NP completi
Consideriamo il problema Sat. Sono date un insieme C di clausole, ciascuna delle
quali e` una disgiunzione di letterali (dove un letterale e` una variabile o la sua
negazione). Vogliamo sapere se vi e` un modo di assegnare alle variabili i valori
booleani VERO e FALSO in modo tale che tutte le clausole risultino vere.
Una clausola e` una disgiunzione l1 ∨ l2 ∨ . . . ∨ lk di letterali e un letterale e` una
variabile x oppure la sua negazione x. Rappresentiamo una assegnazione di valori
alle variabili con un predicato S(x) che esprime il valore di verit`a della variabile
x (dove S e` un simbolo di funzione unaria). Quindi S(x) e` vero se ad x viene
assegnato il valore vero, e` falso altrimenti.
Possiamo allora scrivere la condizione perch´e l’insieme di clausole C sia
soddisfatto dall’assegnazione S(x) come
∀c ∃x (P (c, x) ∧ S(x)) ∨ (N (c, x) ∧ S(x))
dove P (c, x) e` vero se e soltanto se x compare positivamente nella clausola c ed
N (c, x) e` vero se e soltanto se x compare negativamente in c e i due quantificatori spaziano rispettivamente su tutte le clausole c ∈ C e tutte le variabili x che
compaiono in tali clausole.
La soddisfacibilit`a dell’insieme di clausole C e` quindi espressa da
∃S ∀c ∃x (P (c, x) ∧ S(x)) ∨ (N (c, x) ∧ S(x))
ovvero
∃S ∀c ∃x Ψ(c, x, S)
dove Ψ(c, x, S) e` il predicato (P (c, x) ∧ S(x)) ∨ (N (c, x) ∧ S(x)).
Siccome Sat e` NP-completo, ogni problema in NP pu`o essere ridotto a Sat e
quindi espresso con una formula di questo tipo.
Questo giustifica la caratterizzazione della classe N P dovuta a Fagin [8]:
Teorema 2.2.13 (Fagin) I problemi di decisione in NP sono tutti e soli i problemi
di decisione che si possono esprimere con una formula del tipo
∃S ∀c ∃x Ψ(c, x, S)
dove Ψ(c, x, S) e` una formula logica senza quantificatori.
98
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
I problemi esprimibili con una formula logica
∃S ∀c Ψ(c, S)
in cui non compare la quantificazione sui letterali costituisce una sottoclasse di
NP: quella dei problemi SNP (NP-stretti).
Un esempio e` 3Sat in cui ciascuna clausola e` la disgiunzione di tre letterali. In
questo caso Ψ(c, S) e` una lunga congiunzione di asserzioni del tipo
(c ⇔ x1 ∨ x2 ∨ x3 ) ⇒ (S(x1 ) ∨ S(x2 ) ∨ S(x3 ))
una per ogni terna di variabili (x1 , x2 , x3 ) e per ognuno degli otto modi distinti
(negate o non negate) in cui tali tre variabili possono comparire in una clausola c.
La stessa cosa non si pu`o fare per Sat perch´e il numero di letterali di una
clausola non e` limitato. Quindi Sat non e` in SNP.
Invece di richiedere che Ψ(c, S) sia vera per ogni clausola c possiamo chiedere
di massimizzare il numero di clausole c per cui essa e` vera. In questo modo
otteniamo il problema di massimizzazione
max |{c | Ψ(c, S)}|
S
Questo tipo di problemi comprende la classe MAX-SNP definita da Papadimitriou e Yannakakis [17]. In particolare Max-3Sat e` in MAX-SNP.
Papadimitriou e Yannakakis hanno introdotto un tipo particolare di riduzione,
detta L-riduzione (dove L sta per lineare), che preserva l’approssimabilit`a. In particolare, se il problema P si pu`o L-ridurre al problema P ed esiste un algoritmo di
α-approssimazione per P allora esiste anche un algoritmo di γα-approssimazione
per P dove γ e` una costante che dipende dalla riduzione.
Una volta definite le L-riduzioni possiamo definire i problemi MAX-SNP
completi come quei problemi P in MAX-SNP tali che ogni altro problema P
in MAX-SNP si possa L-ridurre a P. Alcuni esempi di problemi MAX-SNP
completi sono Max-3Sat, Max-2Sat (in effetti Max-k Sat per ogni k > 1) e MaxCut. Il fatto che Max-3Sat sia MAX-SNP completo, assieme al Teorema 2.2.11
implica il Corollario 2.2.12.
In Bellare e Sudan [4] si dimostra che, nel Teorema 2.2.11, si pu`o scegliere
1
.
= 74
I problemi di minimizzazione non sono generalmente esprimibili in modo da
essere in MAX-SNP ma possono ugualmente essere MAX-SNP difficili.
Esempi di problemi di minimizzazione MAX-SNP difficili sono
2.3. PROGETTAZIONE DI ALGORITMI DI APPROSSIMAZIONE
99
Tsp con pesi 1 e 2 (ossia d(i, j) ∈ {1, 2} per ogni coppia (i, j)). Per questo problema esiste un algoritmo di 67 -approssimazione dovuto a Papadimitriou e
Yannakakis.
Alberi di Steiner con pesi 1 e 2 Problema degli alberi di Steiner: dato un grafo
connesso e pesato sugli archi ed un sottoinsieme s di vertici trovare il minimo albero che li connette tutti. Nel nostro caso i pesi valgono solo 1 o
2.
Minima copertura di vertici (Mvc). Dato un grafo G = (V, E), una copertura
di vertici e` un sottoinsieme S ⊆ V tale che per ogni arco uv ∈ E si abbia
che o u ∈ S oppure v ∈ S. Il problema richiede di trovare una copertura la
cui somma dei pesi dei vertici sia minima. Se si assume peso unitario per i
vertici si parla di copertura di vertici di cardinalit`a minima (Mcvc).
2.3
Progettazione di algoritmi di approssimazione
Esaminiamo alcune idee chiave per il progetto e l’analisi di algoritmi di approssimazione. Ci riferiremo a problemi di minimizzazione ma le stesse idee si possono
applicare anche a problemi di massimizzazione.
Siccome consideriamo problemi di minimizzazione un algoritmo di α-approssimazione H ha costo CH ≤ α CO PT con α > 1 e dove CO PT e` il costo di una
soluzione ottima.
Mettere in relazione direttamente CH con CO PT pu`o risultare difficile in quanto, per problemi NP-difficili, il costo di una soluzione ottima pu`o essere non ben
definibile. In tal caso pu`o essere utile procedere in due passi: trovare dapprima un limite inferiore Linf per CO PT e quindi mettere in relazione CH con Linf .
Chiaramente, se CH ≤ α Linf a maggior ragione CH ≤ α CO PT .
2.3.1
Riferimento diretto alla soluzione ottima
Un algoritmo di approssimazione la cui soluzione si pu`o porre facilmente in relazione con la soluzione ottima e` l’algoritmo di Christofides [5] per il problema Tsp Euclideo (problema del commesso viaggiatore con disuguaglianza triangolare) che sappiamo essere MAX-SNP-completo. Questo algoritmo e` di 32 approssimazione ed e` il migliore conosciuto per questo problema. L’algoritmo
e` il seguente (vedi Figura 2.3):
100
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
1. Calcola un albero di connessione minimo T del grafo completo G = (V, E).
2. Sia O ⊂ V l’insieme dei vertici di grado dispari in T . Sappiamo che |O| e`
pari.3
3. Calcola un matching perfetto M di costo minimo nel grafo completo G =
(O, E ) indotto da O.
4. Aggiungi a T gli archi di M contando due volte eventuali archi comuni e
ottenendo quindi un multigrafo T ∪ M . Ogni vertice in T ∪ M ha grado pari
e quindi possiamo trovare un percorso Euleriano v1 , v2 , . . . , vk .
5. Segui il percorso Euleriano partendo da v1 e ogni volta che trovi un vertice
vi gi`a incontrato togli tale vertice e i due archi ad esso incidenti e connetti direttamente il vertice precedente con il vertice successivo aggiungendo
l’arco (vi−1 , vi+1 ).
Figura 2.3: Illustrazione dell’algoritmo di Christofides. A sinistra l’albero di
connessione minimo T (con gli archi neri e i vertici dispari rossi) e il matching
minimo M (gli archi verdi). In centro il percorso Euleriano. A destra il ciclo
Hamiltoniano ottenuto partendo dal vertice in basso a sinistra.
Il percorso H cos`ı ottenuto passa una ed una sola volta per tutti i vertici ed e`
quindi un ciclo Hamiltoniano. Dimostriamo che CH ≤ 32 CO PT .
3
Ogni arco contribuisce 2 alla somma dei gradi e quindi la somma dei gradi di tutti i vertici
e` pari. Siccome la somma dei gradi dei vertici di grado pari e` pari anche la somma dei gradi dei
vertici di grado dispari deve essere pari. Infine la somma di |O| numeri dispari e` pari soltanto se
|O| e` pari.
2.3. PROGETTAZIONE DI ALGORITMI DI APPROSSIMAZIONE
101
Sia CT il costo dell’albero di connessione minimo T e CM il costo del matching minimo M . Togliendo un arco da un ciclo Hamiltoniano si ottiene un albero
di connessione. Dunque CT ≤ CO PT .
Dato un ciclo Hamiltoniano H di G possiamo trovare un ciclo Hamiltoniano
per il grafo G indotto da O cortocircuitando i vertici che non stanno in O. Il costo
del ciclo cos`ı ottenuto e` minore o uguale di CH (per la disuguaglianza triangolare).
Dunque CH ≤ CO PT per il ciclo Hamiltoniano ottimo H di G . Prendendo
rispettivamente gli archi di posto pari e di posto dispari in H si ottengono due
matching disgiunti M1 ed M2 per G . Siccome CM1 + CM2 = CH ≤ CO PT ,
almeno uno dei due ha costo minore o uguale di 21 CO PT .
Dunque CM ≤ 12 CO PT per la minimalit`a di M e possiamo concludere che
CH ≤ CT + CM ≤ CO PT + 21 CO PT = 32 CO PT .
Un altro algoritmo approssimato la cui soluzione si pu`o mettere in relazione
direttamente con la soluzione ottima e` l’algoritmo goloso per il problema Msc del
ricoprimento di insiemi di costo minimo:
Dato un universo U di n elementi, una collezione S = {S1 , . . . , Sk }
di sottoinsiemi di U ed un costo C(S) ≥ 0 per ogni S ∈ S, trovare
una sottocollezione C di S di costo minimo tra quelle che coprono
tutti gli elementi di U .
L’algoritmo goloso sceglie, ad ogni iterazione, l’insieme pi`u conveniente, ossia
quello il cui costo diviso per il numero di nuovi elementi che esso copre risulta
minimo. In altre parole, detto K l’insieme degli elementi gi`a coperti dagli insiemi
scelti precedentemente, l’algoritmo sceglie l’insieme S che minimizza il costo
unitario α = C(S)/|S \ K| pagato per i nuovi elementi coperti da S. L’algoritmo
e` quindi il seguente
MSC(S)
1 “Sia C la collezione vuota”
2 K =∅
3 while K = U
4
“seleziona l’insieme S ∈ S che minimizza α =
5
for “ogni x ∈ S \ K”
6
p(x) = α
7
K = K ∪S
8
“aggiungi S alla collezione C”
9 return C
C(S)
”
|S\K|
102
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Sia x1 , . . . , xn la lista degli elementi di U nell’ordine in cui sono stati coperti
con l’algoritmo MSC e sia CO PT il costo di un ricoprimento ottimo CO PT . Il costo
della soluzione trovata con l’algoritmo MSC e` invece
n
CMSC =
C(S) =
S∈C
p(xk )
k=1
Vale il seguente
Lemma 2.3.1 p(xk ) ≤ CO PT /(n − k + 1) per ogni k = 1, . . . , n.
Dimostrazione. Ad ogni iterazione gli insiemi in CO PT \ C coprono gli elementi in
U \ K con un costo unitario minore o uguale a CO PT /|U \ K|. Nell’iterazione in
cui l’elemento xk e` stato coperto dall’algoritmo MSC l’insieme U \ K conteneva
almeno n − k + 1 elementi. Siccome xk e` stato coperto con l’insieme S che
minimizza C(S)/|S \ K| possiamo concludere che
p(xk ) ≤
CO PT
CO PT
≤
.
|U \ K|
n−k+1
Dal precedente Lemma si ottiene immediatamente il seguente
Teorema 2.3.2 CMSC ≤ Hn CO PT dove Hn = 1 + 12 + . . . + n1 e` l’n-esimo mumero
armonico.
Dimostrazione. Basta osservare che
n
n
p(xk ) ≤
CMSC =
k=1
CO PT
= Hn CO PT
k=1 n − k + 1
Esercizio 3 Nel problema Msc la frequenza di un vertice f (v) e` il numero di
insiemi in S che contengono v e la frequenza massima f e` la frequenza del vertice
di frequenza massima. Mostrare che il problema Msc con f = 2 e` equivalente al
problema Mvc. Suggerimento: Gli insiemi che contengono vertici con frequenza
1 devono appartenere tutti alla copertura. Sia V la loro unione e consideriamo
l’insieme U = U \ V e la collezione S degli insiemi S = S \ V . Ogni elemento
in U appartiene esattamente a due insiemi in S . Considerare un grafo avente gli
insiemi S ∈ S come vertici e un arco tra due vertici S1 ed S2 se S1 ∩ S2 = ∅.
2.3. PROGETTAZIONE DI ALGORITMI DI APPROSSIMAZIONE
2.3.2
103
Stratificazione
La tecnica di progettazione di algoritmi di approssimazione mediante stratificazione si pu`o illustrare bene usando il problema della copertura di insiemi. Noi la
illustreremo sul problema Mvc che sappiamo essere equivalente al problema Msc
con frequenza f = 2. L’algoritmo che otteniamo ha coefficiente di approssimazione 2. Lasciamo come problema l’estensione ad algoritmi con coefficiente di
approssimazione f per il problema Msc con frequenza f qualsiasi.
L’idea della stratificazione e` quella di scomporre la funzione peso definita sui
vertici in funzioni, dette funzioni ponderate sui gradi, definite su di una sequenza
annidata di sottografi.
Introduciamo alcune notazioni. Sia w la funzione che assegna costo w(v) ≥
0 ad ogni vertice v del grafo dato G = (V, E). Diciamo che la funzione w e`
ponderata sui gradi se esiste una costante c > 0 tale che w(v) = c · deg(v) per
ogni vertice v. L’importanza di questa definizione e` catturata dal seguente:
Lemma 2.3.3 Se w e` una funzione ponderata sui gradi allora w(V ) ≤ 2CO PT .
Dimostrazione. Sia K una copertura ottima in G. Siccome K copre tutti gli archi
deg(v) ≥ |E|
v∈K
Quindi w(K) ≥ c|E|. Siccome
v∈V
deg(v) = 2|E| possiamo concludere che
w(V ) = 2c|E| ≤ 2w(K) = 2CO PT
Definiamo la massima funzione ponderata sui gradi in w nel seguente modo:
si tolgono dal grafo tutti i vertici di grado 0 e sugli altri vertici calcoliamo c =
min{w(v)/deg(v)}. La funzione cercata e` allora t(v) = c · deg(v). Definiamo
inoltre la funzione residua w (v) = w(v) − t(v).
L’algoritmo per la scomposizione di w in funzioni ponderate sui gradi opera
nel modo seguente. Sia G0 = G e sia D0 ⊂ V l’insieme dei suoi vertici di
grado 0. Toglie da G0 i vertici D0 e sul grafo indotto calcola la massima funzione
ponderata sui gradi. Sia W0 i vertici con costo residuo 0; questi vertici vengono
inclusi nella copertura di vertici. Sia G1 il grafo indotto sull’insieme di vertici
V \ (D0 ∪ W0 ). L’algoritmo ripete le stesse operazioni partendo dal grafo G1 con
la funzione residua e termina quando tutti i vertici hanno grado 0.
Siano G0 , . . . , Gk−1 i grafi cos`ı ottenuti e siano t0 , . . . , tk−1 le funzioni ponderate sui gradi definite su tali grafi. La copertura di vertici calcolata e` quindi
K = W0 ∪ . . . ∪ Wk−1 . Ovviamente V − K = D0 ∪ . . . ∪ Dk .
104
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
V4
D4
V3 W3
D3
V2 W2
V1
V0
D2
W1
D1
W0
D0
Figura 2.4: Illustrazione della stratificazione per il problema Mvc.
Teorema 2.3.4 L’algoritmo di stratificazione per il problema Mvc ha coefficiente
di approssimazione 2 qualunque siano i costi dei vertici.
Dimostrazione. Dobbiamo dimostrare che K e` una copertura di vertici per G e
che w(K) ≤ 2 · CO PT .
Supponiamo, per assurdo, che K non sia una copertura di vertici per G. Deve
allora esistere un arco uv tale che u ∈ Di e v ∈ Dj per qualche i, j. Assumiamo
i ≤ j. Dunque l’arco uv appartiene a Gi contraddicendo l’ipotesi che u abbia
grado 0.
Sia K ∗ una copertura di vertici ottima. Consideriamo un vertice v ∈ K che
appartiene alla copertura di vertici. Se v ∈ Wj il suo costo pu`o essere scomposto
nel modo seguente:
w(v) =
ti (v)
i≤j
Consideriamo ora un vertice v ∈ V \ K che non appartiene alla copertura di
vertici. Se v ∈ Dj vale il seguente limite inferiore per il suo costo
w(v) >
ti (v)
i<j
Una osservazione importante e` che ad ogni strato i, l’insieme K ∗ ∩ Vi e` una
copertura di vertici per Gi = (Vi , Ei ) in quanto Gi e` il grafo indotto su Vi . Quindi,
per il Lemma 2.3.3, ti (K ∩ Vi ) ≤ 2 · ti (K ∗ ∩ Vi ). Per la scomposizione dei costi
appena vista abbiamo
k−1
k−1
ti (K ∗ ∩ Vi ) ≤ 2 · CO PT
ti (K ∩ Vi ) ≤ 2 ·
w(K) =
i=0
i=0
2.3. PROGETTAZIONE DI ALGORITMI DI APPROSSIMAZIONE
2.3.3
105
Utilizzo di un limite inferiore
Consideriamo il problema CO PT = minx∈R f (x). Possiamo ottenere un limite
inferiore per CO PT con la tecnica del rilassamento. Un rilassamento del problema
precedente e` un qualsiasi problema Linf = minx∈S g(x) tale che
1. R ⊆ S e
2. g(x) ≤ f (x) per ogni x ∈ R.
Queste due condizioni implicano infatti
Linf = min g(x) ≤ min f (x) = CO PT
x∈S
x∈R
f
g
CO PT
Linf
x¯ x∗
Figura 2.5: Il problema CO PT = minx∈R f (x) ed il suo rilassamento Linf =
minx∈S g(x). La funzione obiettivo f (x) del problema originale e` tratteggiata
poich´e essa e` definita su di un sottoinsieme R dell’insieme S su cui e` definita la
funzione obiettivo del problema rilassato. Il costo Linf = f (x∗ ) della soluzione
x∗ del problema rilassato e` minore o uguale del costo CO PT = f (¯
x) della soluzione
x¯ del problema originale.
Molti rilassamenti classici si ottengono con la programmazione lineare. Vi
sono per`o delle limitazioni sulla bont`a delle approssimazioni ottenute con la programmazione lineare. Per illustrare questo fatto mostriamo come, usando la programmazione lineare, si possa ottenere un algoritmo di 2-approssimazione per il
problema del minimo ricoprimento di vertici (Mvc che sappiamo essere MAXSNP-difficile). Mostreremo inoltre che con tale tipo di rilassamento non si pu`o
ottenere un algoritmo di approssimazione migliore.
106
2.3.4
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Un rilassamento di tipo LP per il problema del minimo
ricoprimento di vertici
Un ricoprimento di vertici in un grafo G = (V, E) e` un sottoinsieme U dei vertici
tale che ogni arco sia incidente in almeno un vertice di U . Il problema Mvc del
minimo ricoprimento di vertici e` il seguente:
Dato un grafo G = (V, E) con un costo cv ≥ 0 associato ad ogni
vertice v ∈ V trovare un ricoprimento U ⊂ V che minimizza
CU =
cv
v∈U
Questo problema si pu`o esprimere come un problema di programmazione
lineare intera nel modo seguente
cv x v
CO PT = min
v∈V
xv ∈ {0, 1} per ogni v ∈ V
xu + xv ≥ 1 per ogni uv ∈ E
dove la funzione obiettivo e` la funzione f (x) = v∈V cv xv e la regione ammissibile e` l’insieme R di tutte le n-uple di valori x = {xv | v ∈ V } che soddisfano i
vincoli.
Ricordando che i vertici di un ipercubo unitario n-dimensionale hanno per
coordinate le sequenze di n valori in {0, 1}, possiamo rappresentare graficamente
la regione ammissibile come insieme di vertici di tale ipercubo: sono esattamente
tutti i vertici dell’ipercubo che non hanno due coordinate nulle in corrispondenza
di due vertici del grafo connessi da un arco.
Possiamo rilassare tale problema nel problema di programmazione lineare
Linf = min
cv x v
v∈V
0 ≤ xv ≤ 1 per ogni v ∈ V
xu + xv ≥ 1 per ogni uv ∈ E
In questo caso la funzione obiettivo e` la stessa mentre la regione ammissibile S
contiene la regione ammissibile R del problema originale.
La regione S e` il poliedro ottenuto sezionando l’ipercubo unitario n-dimensionale con gli iperpiani xu + xv = 1 relativi agli archi uv ∈ E (in Figura 2.6
2.3. PROGETTAZIONE DI ALGORITMI DI APPROSSIMAZIONE
107
e` illustrata la regione S per il caso G = K3 ). Sono quindi soddisfatte le due
condizioni perch´e questo sia effettivamente un rilassamento.
Dunque Linf ≤ CO PT e questo ci permette di provare che un certo algoritmo
H e` di α-approssimazione per il problema Mvc mostrando che CH ≤ α Linf .
(1, 1, 1)
( 12 , 12 , 12 )
(0, 0, 0)
Figura 2.6: La regione ammissibile del problema rilassato nel caso G = K3 . La
regione ammissibile e` quella a destra.
Una limitazione di questo tipo di rilassamento e` che ci sono grafi per i quali Linf e` circa 21 CO PT per cui non lo si pu`o usare per dimostrare un rapporto di
approssimazione α < 2 (altrimenti l’algoritmo H darebbe un risultato migliore
dell’ottimo).
Un grafo di questo tipo e` Kn : il grafo completo di n vertici con pesi tutti uguali
ad 1. Un ricoprimento U deve contenere almeno n−1 vertici (altrimenti ci sarebbe
un arco tra due vertici che non stanno in U ). Quindi CO PT = n − 1. Nel problema
1
C .
rilassato possiamo avere xv = 21 per ogni v ∈ V per cui Linf ≤ n2
2 O PT
2.3.5
Come usare il rilassamento
Ci sono due modi principali per ottenere una soluzione approssimata dalla soluzione del problema rilassato: il metodo dell’arrotondamento e il metodo primaleduale. Illustreremo queste due tecniche sul problema Mvc del minimo ricoprimento di vertici.
Arrotondamento
Si trova una soluzione x∗ del problema rilassato e quindi si arrotonda x∗ al “pi`u
vicino” x ∈ R (dove R e` la regione ammissibile del problema originale). Infine
108
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
f
g
αLinf
f (x )
CO PT
Linf
x¯
x x∗
Figura 2.7: L’arrotondamento x della soluzione x∗ del problema rilassato.
Bisogna trovare un x ∈ R che sia vicino a x∗ e tale che f (x ) ≤ αg(x∗ ).
si dimostra che f (x ) ≤ α g(x∗ ) da cui
f (x ) ≤ α Linf ≤ α COT T
Talvolta, come vedremo in seguito, risulta utile la randomizzazione. In tal
caso l’arrotondamento x ∈ R di x∗ viene scelto casualmente in modo da ottenere
un valore atteso E[f (x )] ≤ α g(x∗ ). Algoritmi di questo tipo possono talvolta
essere derandomizzati se si riesce a trovare un x ∈ R tale che f (x ) ≤ E[f (x )].
Arrotondamento per il problema Mvc
Questo algoritmo e` dovuto a Hochbaum [14]. Sia x∗ la soluzione ottima del
problema rilassato. Prendiamo
1
U = {v ∈ V | x∗v ≥ }
2
e proviamo che questa e` una 2-approssimazione per il problema Mvc.
Chiaramente U e` una copertura in quanto per ogni arco uv abbiamo x∗u + x∗v ≥
1 il che implica che o x∗u ≥ 21 oppure x∗v ≥ 12 . Inoltre
cv 2 x∗v ≤
cv ≤
v∈U
v∈U
in quanto 2 x∗v ≥ 1 per ogni v ∈ U .
cv 2 x∗v = 2 Linf
v∈V
2.3. PROGETTAZIONE DI ALGORITMI DI APPROSSIMAZIONE
109
g
f
αg(xmin )
αh(ymax )
αh(y)
f (x)
CO PT
g(xmin )
h(ymax )
h(y)
h
y ymax
x¯ x xmin
Figura 2.8: Il metodo Primale-Duale. Non serve risolvere nessuno dei tre problemi originale, rilassato o duale. E` sufficiente trovare un y ∈ D e un x ∈ R tali che
f (x) ≤ α h(y).
Primale-Duale
Consideriamo qualche problema duale debole del problema rilassato per cui
max{h(y) | y ∈ D} ≤ min{g(x) | x ∈ S}
e costruiamo x ∈ R a partire da un y ∈ D in modo tale che
f (x) ≤ α h(y) ≤ α h(ymax ) ≤ α g(xmin ) ≤ α CO PT
Notiamo che y pu`o essere qualsiasi valore nella regione ammissibile D del
problema duale e non necessariamente la soluzione ottima ymax .
Primale-Duale per il problema Mvc
Questo algoritmo e` dovuto a Bar-Yehuda ed Even [3]. Formuliamo dapprima il
problema duale debole del problema rilassato.
Sia yuv una variabile per ogni arco uv ∈ E. Il problema duale debole e`
max
yuv
uv∈E
yuv ≤ cv per ogni v ∈ V
uv∈∆(v)
yuv ≥ 0
per ogni uv ∈ E
110
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Questo problema di massimizzazione e` effettivamente un duale debole del
problema rilassato. Infatti

yuv ≤
uv∈E
yuv (xu + xv ) =
uv∈E

yuv  ≤
 xv
v∈V
cv x v
v∈V
uv∈∆(v)
L’algoritmo opera nel modo seguente.
1. Inizializza l’insieme U (il ricoprimento di vertici) con l’insieme vuoto, pone
yuv = 0 per ogni uv ∈ E e inizializza l’insieme F = E (degli archi da
visitare).
2. sceglie un arco uv ∈ F ed aumenta yuv fino a far diventare uguaglianza
una delle due diseguaglianze relative ai vertici u e v. Supponiamo che la
disuguaglianza diventi uguaglianza per v.
3. Aggiunge v a U e toglie da F tutti gli archi incidenti in v.
4. Ripete i due punti precedenti finch´e F non diventa vuoto. A quel punto U e`
il ricoprimento calcolato.
Che U sia un ricoprimento e` ovvio. Inoltre, siccome per ogni v ∈ U la
disuguaglianza e` una uguaglianza
2.4
v∈U uv∈∆(v)
2 yuv ≤ 2 Linf
|U ∩ {u, v}| yuv ≤
yuv =
cv =
v∈U
uv∈E
uv∈E
Problema del matching perfetto di costo minimo
In questa sezione illustreremo la potenza del metodo Primale-Duale per trovare algoritmi di approssimazione. Consideriamo il problema Mpm del matching
perfetto di costo minimo:
“Dato il grafo completo Kn = (V, E) con un numero pari di vertici
ed un costo non negativo cuv associato ogni arco uv ∈ E, determinare
un matching perfetto M di costo CM =
cuv minimo.”
uv∈M
Il primo algoritmo polinomiale per questo problema e` dovuto ad Edmonds [7]
ed ha complessit`a O(n4 ).
2.4. PROBLEMA DEL MATCHING PERFETTO DI COSTO MINIMO
111
L’algoritmo asintoticamente pi`u veloce e` dovuto a Gabov [10] ed ha complessit`a asintotica O(n(m + n lg n)) dove m = |E|.4 Per grafi densi, in cui
m = Θ(n2 ), si ottiene un tempo calcolo O(n3 ) mentre per grafi sparsi, in cui
m = O(n log n), si ottiene O(n2 log n). Questo algoritmo e` per`o molto complicato per cui la costante nascosta dalla notazione asintotica risulta molto grande, e
questo lo rende troppo lento per molte applicazioni pratiche.
Per questo problema vedremo invece un algoritmo di approssimazione, dovuto
a Goemans e Williamson [12] che richiede√tempo O(n2 log n). Questo limite e`
stato successivamente ridotto ad O(n2 + n m log log n) da Gabow, Goemans e
Williamson [11].
Da notare che bench´e il problema Mpm approssimato sia polinomiale come il
problema esatto, la tecnica usata nell’algoritmo di approssimazione di Goemans
e Williamson e` abbastanza generale da poter essere usata anche per approssimare
molti problemi NP-difficili.
L’algoritmo di Goemans e Williamson e` di 2-approssimazione: trova un matching perfetto di costo non maggiore di due volte il costo del matching ottimo.
Esso richiede che i costi degli archi soddisfino la disuguaglianza triangolare.
2.4.1
Una formulazione di Mpm come problema di programmazione lineare
L’algoritmo di Goemans e Williamson usa la programmazione lineare e la dualit`a. Infatti, come vedremo tra poco, il problema Mpm si pu`o formulare come un
problema di programmazione lineare.
Il problema di programmazione lineare cos`ı ottenuto contiene un numero di
vincoli estremamente grande ma fortunatamente esso non deve essere risolto dall’algoritmo che invece si limita soltanto a trovare una soluzione ammissibile del
problema duale che soddisfi il rapporto di approssimazione 2 (senza risolvere il
problema).
La formulazione di Mpm in programmazione lineare intera e`
CO PT = min
cuv xuv
uv∈E
xuv ∈ {0, 1}
4
per ogni uv ∈ E
Noi abbiamo definito il problema Mpm su grafi completi. Qui ci si riferisce a grafi qualsiasi. I
due problemi sono per`o equivalenti. Per grafi incompleti basta aggiungere gli archi mancanti con
peso ∞.
112
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
xuv = 1
per ogni u ∈ V
uv∈∆(u)
dove ∆(u) e` l’insieme degli archi incidenti in u.
Prima di formulare il rilassamento come problema di programmazione lineare
facciamo la seguente osservazione.
Sia
D = {S | S ⊂ V, |S| dispari}
la famiglia di tutti i sottoinsiemi propri di V che contengono un numero dispari di
vertici.
Consideriamo un matching perfetto M ed un insieme dispari S ∈ D e sia
∆(S) l’insieme degli archi che intersecano il taglio (S, S). Siccome S contiene
un numero dispari di vertici deve esserci qualche arco di M avente un estremo in
S ed uno in S e quindi M ∩ ∆(S) = ∅.
Avendo presente questa osservazione possiamo formulare nel modo seguente
un rilassamento di Mpm come problema di programmazione lineare
cuv xuv
Z = min
uv∈E
xuv ≥ 0
xuv ≥ 1
per ogni uv ∈ E
per ogni S ∈ D
uv∈∆(S)
infatti, se M e` un matching perfetto e poniamo xuv = 1 per uv ∈ M ed xuv = 0
altrimenti, allora tutti i vincoli sono soddisfatti.
Dunque la soluzione Z del problema di programmazione lineare e` un limite
inferiore per il costo di ogni matching perfetto e, in particolare, Z ≤ CO PT .
Il problema di programmazione lineare precedente ha un vincolo per ogni sottoinsieme S ∈ D, troppi per poterlo risolvere efficientemente. Noi non cercheremo di risolverlo, lo useremo soltanto assieme al suo duale per progettare ed
analizzare l’algoritmo di approssimazione.
Siccome il problema rilassato e` in forma standard esso ha il duale stretto
Z = max
yS
S∈D
yS ≥ 0
yS ≤ cuv
S∈D
uv∈∆(S)
per ogni S ∈ D
per ogni uv ∈ E
2.4. PROBLEMA DEL MATCHING PERFETTO DI COSTO MINIMO
113
Questo programma duale ha la stessa soluzione Z del programma rilassato
(essendo la dualit`a stretta).
Usiamo il problema duale per verificare che il costo del matching perfetto
calcolato dall’algoritmo e` effettivamente minore o uguale del doppio del costo del
matching ottimo. A questo scopo l’algoritmo fornisce in output due cose
1. un matching perfetto M , e
2. una soluzione y del problema duale tale che CM ≤ 2
yS .
S∈D
Siccome y e` una soluzione ammissibile sappiamo che
yS ≤ Z ≤ CO PT
S∈D
e dunque
CM ≤ 2Z ≤ 2CO PT
Dato che l’algoritmo e` polinomiale esso e` un algoritmo di 2-approssimazione
per Mpm.
Per essere pi`u precisi, non e` necessario che l’algoritmo calcoli effettivamente
la soluzione y; essa serve solo come strumento di analisi per dimostrare il rapporto
di approssimazione 2.
Osserviamo comunque che, bench´e vi sia un numero esponenziale di variabili yS soltanto un numero polinomiale di esse risulta diverso da 0. L’algoritmo
potrebbe quindi calcolare e stampare la soluzione y in tempo polinomiale.
Noi includeremo nell’esposizione dell’algoritmo anche il calcolo dei valori delle variabili yS ma tale calcolo pu`o essere omesso in una implementazione
effettiva dell’algoritmo.
2.4.2
Dalle foreste ai matching perfetti
Ricordiamo che una foresta F e` semplicemente un grafo aciclico non necessariamente connesso. I vertici di una foresta F si possono partizionare in componenti
connesse (gli alberi della foresta).
Indichiamo con KF la famiglia di tutte le componenti connesse di F e la suddividiamo nella sottofamiglia DF delle componenti con un numero dispari di vertici
e PF di quelle con un numero pari di vertici.
Invece di calcolare direttamente il matching perfetto M l’algoritmo calcola
dapprima una foresta F che ha tutte le componenti connesse con un numero pari
114
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
A2
v
A1
u
Ai
Ak
Figura 2.9: Illustrazione del Lemma 2.4.1
di vertici (ossia DF = ∅) dopo di che rimuove alcuni archi da F per ottenere una
foresta F , sempre con componenti pari, ma che e` minimale nel senso che se si
toglie un qualsiasi arco si ottiene almeno una componente con un numero dispari
di vertici.
Il costo della foresta F cos`ı ottenuta e` minore o uguale del doppio del valore
della soluzione ammissibile y del problema duale.
Infine da F deriva il matching perfetto M sostituendo alcune coppie di archi
consecutivi uv e vw con un unico arco uw. Per la disuguaglianza triangolare il
costo di M e` minore o uguale al costo di F e quindi minore o uguale al doppio
del valore della soluzione ammissibile y del problema duale. Quindi
yS ≤ 2Z ≤ 2CO PT
CM ≤ CF ≤ 2
S∈D
Prima di vedere nel dettaglio come l’algoritmo costruisce le foreste F ed F
mostriamo come si possa ricavare un matching M dalla foresta F . Per fare questo
ci serve la seguente conseguenza della minimalit`a di F .
Lemma 2.4.1 Tutti i vertici di F hanno grado dispari.
Dimostrazione. Supponiamo vi sia un vertice v di grado k pari e sia A la componente di F che contiene v.
Togliendo dall’albero A il vertice v e tutti gli archi ad esso incidenti si ottengono un numero pari di alberi A1 , . . . , Ak con un numero totale di vertici dispari
(vedi Figura 2.9).
Almeno uno dei sottoalberi A1 , . . . , Ak , diciamo Ai , deve avere un numero
pari di vertici (altrimenti il numero totale di vertici sarebbe pari).
Sia u ∈ Ai il vertice di Ai che in A era connesso a v dall’arco rimosso uv. Se
da A rimuoviamo l’arco uv esso si spezza in due componenti con un numero pari
di vertici contro l’ipotesi di minimalit`a di F .
2.4. PROBLEMA DEL MATCHING PERFETTO DI COSTO MINIMO
115
Possiamo trasformare F in un matching perfetto M tale che CM ≤ CF nel
seguente modo.
Consideriamo un qualsiasi vertice v di grado maggiore o uguale a 3 della foresta F e togliamo due archi vu e vw incidenti in v sostituendoli con l’arco uw.
Per la disuguaglianza triangolare il costo della foresta non pu`o aumentare.
Siccome tutti i vertici di F hanno grado dispari (per il Lemma 2.4.1), iterando
il procedimento arriviamo ad avere tutti i vertici di grado 1 ottenendo un matching
perfetto M di costo minore o uguale del costo di F .
Notiamo che il calcolo di M richiede al pi`u O(n) iterazioni.
M PM(G = (V, E), c)
1 F =∅
2 KF = {{v} | v ∈ V }
3 for “ogni S ∈ D” do yS = 0
// Pu`o essere omessa
4 for “ogni v ∈ V ” do d[v] = 0
5 // d[v] memorizza la somma delle variabili yS tali che v ∈ S.
6 while DF = ∅
7
“Cerca uv ∈ ∆(K) con K ∈ DF che minimizza
cuv − d[u] − d[v]
.”
8
δ=
λ(K) + λ(K )
9
// Dove K ∈ KF e` la componente che contiene l’altro estremo di
10
// uv e λ(C) = 1 se la componente C e` dispari, λ(C) = 0 se e` pari.
11
F = F ∪ {uv}
12
for “ogni componente C ∈ DF ”
13
for “ogni vertice v ∈ C”
14
d[v] = d[v] + δ
15
yC = yC + δ
// Pu`o essere omessa
16
KF = KF \ {K, K } ∪ {K ∪ K }
17 F = F
18 while “esiste uv ∈ F la cui rimozione crea due componenti pari”
19
F = F \ {uv}
20 M = F
21 while “esiste v ∈ V di grado maggiore di 1”
22
“cerca due vertici u e w adiacenti a v”
23
M = M \ {vu, vw} ∪ {uw}
24 return M
Figura 2.10: L’algoritmo M PM
116
2.4.3
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
L’algoritmo
L’algoritmo ha la seguente struttura astratta
1. Inizia con F = ∅ ed yS = 0 per ogni S ∈ D.
2. Finch´e DF = ∅ aumenta i valori delle variabili yS relative alle componenti
dispari K ∈ DF della massima quantit`a δ per cui rimangono soddisfatti
tutti i vincoli
yS ≤ cuv
S∈D, uv∈∆(S)
del problema duale. Questo trasforma in uguaglianza il vincolo relativo ad
almeno un arco uv.
Aggiungiamo quindi ad F un arco uv che connette un vertice u di una
componente dispari ad un vertice v di un’altra componente (dispari o pari)
e per il quale il vincolo sia diventato una uguaglianza.
3. Trasforma F in una foresta F minimale.
4. Ricava da F un matching perfetto M .
La descrizione formale dell’algoritmo e` riportata in Figura 2.10 dove le istruzioni che assegnano valore alle variabili yS sono annotate con un commento che
dice che in una implementazione effettiva esse possono essere omesse.
2.4.4
Un esempio di esecuzione dell’algoritmo
Illustriamo l’algoritmo con un esempio. Per semplicit`a consideriamo un grafo
completo di 8 vertici rappresentati con punti del piano e assumiamo che i costi
degli archi siano le loro lunghezze nella rappresentazione piana adottata (vedi
Figura 2.11).
Nella Figura 2.11 i cerchi concentrici indicano i successivi incrementi di d[u]
relativi al vertice u.
All’inizio tutti i vertici costituiscono componenti separate e d[u] = 0 per ogni
vertice u. Siccome tutte le componenti sono dispari
δ=
cuv − 0 − 0
= cuv /2
1+1
l’arco selezionato e` quindi quello tra i vertici 7 e 8 che sono i pi`u vicini tra loro.
2.4. PROBLEMA DEL MATCHING PERFETTO DI COSTO MINIMO
117
Ogni d[v] viene quindi aumentato di δ come indicato dal primo cerchio attorno
ad ogni vertice ed i due vertici 7 e 8 vengono riuniti in un’unica componente {7, 8}
di cardinalit`a pari.
In generale, ad ogni iterazione i contorni delle componenti dispari vengono
allargati della minima quantit`a δ tale che i contorni di due componenti K e K
arrivino a toccarsi. L’arco prescelto e` quindi quello che connette due vertici u ∈ K
e v ∈ K i cui cerchi si toccano.
L’arco successivo prescelto e` quello tra i due vertici 3 e 5. Osserviamo che il
contorno della componente {7, 8} non cambia in quanto essa ha cardinalit`a pari.
In Figura 2.11 sono indicati tutti gli archi selezionati e le successive espansioni
dei contorni delle regioni.
6
4
3
5
8
7
1
2
Figura 2.11: Illustrazione dell’algoritmo Mpm
2.4.5
Analisi dell’algoritmo
Lemma 2.4.2 I valori delle variabili yS calcolati dall’algoritmo precedente sono
una soluzione ammissibile del problema duale.
118
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Dimostrazione. Dobbiamo dimostrare che le variabili yS soddisfano i vincoli del
problema duale
yS ≥ 0
per ogni S ∈ D
per ogni uv ∈ E
yS ≤ cuv
(2.1)
(2.2)
S∈D
uv∈∆(S)
La dimostrazione e` per induzione sulle iterazioni del ciclo while.
All’inizio la cosa e` vera in quanto tutte le variabili yS sono inizializzate a 0 e
i costi cuv sono non negativi. Inoltre, all’inizio, e` pure vero che
d[v] =
per ogni v ∈ V
yS
(2.3)
v∈S∈D
in quanto anche i valori d[v] sono inizializzati a 0.
Supponiamo quindi che 2.1, 2.2 e 2.3 siano vere prima di eseguire una iterazione del ciclo while e mostriamo che esse sono ancora vere dopo averla eseguita.
Sia uv un generico arco. Ci sono due possibilit`a: che i vertici u e v appartengano alla stessa componente oppure appartengano a componenti distinte.
Nel primo caso non vi e` nessuna componente K ∈ KF per la quale uv ∈
∆(K). Di conseguenza, siccome le uniche variabili yS che possono cambiare
sono quelle per cui S = K ∈ KF tutte le variabili yS tali che uv ∈ ∆(S)
rimangono invariate. Dunque la disequazione 2.2 relativa all’arco uv rimane vera.
Nel secondo caso u ∈ K e v ∈ K con K = K . Se u e v non appartengono
alla stessa componente connessa non potevano appartenere alla stessa componente
connessa neppure nelle iterazioni precedenti e quindi tutte le variabili yS relative
a insiemi dispari che contengono sia u che v non sono mai state incrementate e
dunque hanno valore 0. Possiamo dunque scrivere
yS =
S∈D
uv∈∆(S)
yS +
u∈S∈D
yS = d[u] + d[v]
v∈S∈D
dove la prima uguaglianza deriva dal fatto che le uniche variabili yS che compaiono nel secondo termine ma non nel primo sono quelle contenenti sia u che v e
che quindi sono nulle.
La seconda uguaglianza e` invece giustificata dall’equazione 2.3. Inoltre, per
l’equazione 2.2,
d[u] + d[v] =
yS ≤ cuv
S∈D
uv∈∆(S)
2.4. PROBLEMA DEL MATCHING PERFETTO DI COSTO MINIMO
119
Possiamo, a questo punto osservare che, siccome questo vale per ogni coppia
di componenti K = K ed ogni arco uv con u ∈ K e v ∈ K
δ=
min
u∈K,v∈K
K=K
cuv − d[u] − d[v]
≥0
λ(K) + λ(K )
e dunque i valori delle variabili yS possono solo aumentare per cui le disequazioni
2.1 rimangono vere.
Osserviamo inoltre che una variabile yS viene incrementata di δ se e solo se
S = K ∈ DF e in tal caso d[v] viene incrementato di δ per ogni v ∈ S. Dunque
la parte sinistra d[u] dell’equazione 2.3 viene incrementata di δ soltanto se u ∈
K ∈ DF e in tal caso soltanto una delle variabili sommate nella parte destra
viene incrementata di δ, e precisamente la variabile yK relativa alla componente
K che contiene u. Quindi anche le equazioni 2.3 rimangono vere.
Tornando alla dimostrazione che l’equazione 2.2 relativa all’arco uv rimane
vera osserviamo che una variabile yS viene incrementata di δ soltanto se S =
K ∈ DF e quindi λ(K) = 1. Quindi, indicando con d [u] e d [v] i valori di d[u] e
d[v] alla fine dell’iterazione
d [u] = d[u] + δ λ(K)
d [v] = d[v] + δ λ(K )
Per la minimalit`a di δ
cuv − d[u] − d[v]
λ(K) + λ(K )
e quindi, indicando con yS i valori delle variabili yS alla fine dell’iterazione
δ≤
yS = d [u] + d [v]
S∈D
uv∈∆(S)
= d[u] + δ λ(K) + d[v] + δ λ(K )
= d[u] + d[v] + δ(λ(K) + λ(K ))
cuv − d[u] − d[v]
≤ d[u] + d[v] +
(λ(K) + λ(K ))
λ(K) + λ(K )
= cuv
Dunque anche le equazioni 2.2 rimangono vere per ogni arco uv.
Come osservazione finale, notiamo che quando l’algoritmo sceglie un arco uv
il corrispondente vincolo 2.2 diventa un’uguaglianza. Questo significa che
yS = cuv
S∈D
uv∈∆(S)
per ogni uv ∈ F .
120
2.4.6
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Ultimo passo dell’algoritmo e sua correttezza
Quando termina il primo ciclo while la foresta F contiene solo componenti pari.
Diciamo che un arco uv nella foresta F e` in posizione pari se la sua rimozione
suddivide la componente a cui appartiene in due componenti pari, diciamo che e`
in posizione dispari se la divide in due componenti dispari.
Il secondo ciclo while rimuove tutti gli archi in posizione pari. Dunque alla
fine la foresta F cos`ı ottenuta ha tutte le componenti pari ed e` minimale rispetto a
questa propriet`a.
In Figura 2.12 sono evidenziati gli archi in posizione pari di una componente
di F e le corrispondenti componenti in F ottenute rimuovendo tali archi.
F
F
Figura 2.12: Una componente di F con evidenziati gli archi in posizione pari e le
corrispondenti componenti in M ottenute rimuovendo tali archi.
Osserviamo che l’ordine in cui vengono rimossi gli archi e` irrilevante. Infatti dopo aver rimosso un arco in posizione pari i rimanenti archi non cambiano
posizione: se erano in posizione pari rimangono in posizione pari, se erano in
posizione dispari rimangono in posizione dispari. Di conseguenza gli archi di F
che rimangono in F sono tutti e soli quelli in posizione dispari, ossia
F = {uv ∈ F | la rimozione di uv crea due componenti dispari}
Il Teorema seguente prova che il costo della foresta F cos`ı ottenuta e` al pi`u
pari al doppio del costo della soluzione del problema duale.
Siccome abbiamo visto come ottenere da F un matching perfetto M di costo
minore o uguale a quello di F abbiamo un algoritmo di 2-approssimazione per il
problema M P M .
2.4. PROBLEMA DEL MATCHING PERFETTO DI COSTO MINIMO
121
Teorema 2.4.3 Sia
F = {uv ∈ F | la rimozione di uv crea due componenti dispari}
cuv ≤ 2
Allora
uv∈F
yS .
S∈D
Dimostrazione. Ricordiamo che
cuv =
yS
per ogni uv ∈ F
S∈D
uv∈∆(S)
e quindi
cuv =
|F ∩ ∆(S)| yS
yS =
uv∈F
uv∈F
S∈D
uv∈∆(S)
S∈D
Dobbiamo quindi mostrare che
|F ∩ ∆(S)| yS ≤ 2
yS
S∈D
S∈D
Dimostreremo questa disequazione per induzione sui passi dell’algoritmo. Pi`u
precisamente mostreremo che essa e` vera con i valori iniziali delle variabili yS
e che essa rimane vera anche ad ogni iterazione dopo che i valori delle variabili
relative alle componenti dispari sono incrementati di δ.
Notiamo che F denota il risultato finale dell’algoritmo e quindi non cambia
nei passi induttivi.
All’inizio tutte le yS sono 0 e quindi la disequazione e` banalmente vera. Supponiamo quindi che tale disequazione sia vera a qualche stadio intermedio dell’algoritmo e sia F la foresta costruita a tale stadio.
Ci basta mostrare che essa e` vera anche dopo che i valori delle variabili relative
alle componenti K ∈ DF sono incrementati di δ. Ossia che l’aumento della parte
sinistra della disequazione e` al pi`u il doppio dell’aumento della parte destra.
|F ∩ ∆(K)| ≤ 2δ|DF |
δ
K∈D
F
ovvero
|F ∩ ∆(K)| ≤ 2|DF |
K∈D
F
122
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Sappiamo che la foresta minimale F e` ottenuta dalla foresta F come calcolata
alla fine del primo ciclo while eliminando gli archi in posizione pari (quelli tratteggiati in Figura 2.13) e che l’ordine in cui tali archi vengono tolti e` irrilevante.
Sia F la foresta F da cui sono stati tolti soltanto gli archi in posizione pari che
sono stati aggiunti dopo lo stadio considerato, ossia quelli che stanno in F \ F
(gli archi tratteggiati rossi in Figura 2.13).
K5
K4
K6
K3
K8
K7
K9
K2
K1
Figura 2.13: La costruzione del grafo H. Gli archi neri (sia continui che tratteggiati) costituiscono la foresta F prima di eseguire una iterazione del ciclo while
principale. K 1 , . . . , K 9 sono le componenti di F . Gli archi rossi (sia continui
che tratteggiati) sono gli archi che verranno aggiunti dall’algoritmo per ottenere
la foresta F finale con tutte componenti pari. Gli archi tratteggiati (sia neri che
rossi) sono quelli che verranno eliminati per ottenere da F la foresta minimale
F . Quindi la foresta minimale F e` costituita dai soli archi continui (neri o rossi).
Il grafo H ha come vertici le componenti K 1 , . . . , K 9 e come archi soltanto gli
archi rossi continui.
Per ogni componente K di F abbiamo che F ∩ ∆(K) = ∆F (K) e pertanto
|F ∩ ∆(K)| =
K∈D
F
|∆F (K)|
K∈D
F
Se nella foresta F contraiamo ogni componente K in un unico vertice otteniamo
un grafo H che ha come vertici le componenti K di F e come archi uscenti dal
2.4. PROBLEMA DEL MATCHING PERFETTO DI COSTO MINIMO
123
vertice K gli archi ∆H (K) = ∆F (K). Dunque dobbiamo dimostrare
|∆H (K)| ≤ 2|DF |
K∈D
(2.4)
F
Siccome H e` anch’esso una foresta il numero di archi e` uguale al numero di
vertici meno il numero k di componenti della foresta H stessa, ossia
|∆H (K)| +
K∈D
|∆H (K)| = 2(|KF | − k) = 2|DF | + 2|PF | − 2k
K∈P
F
F
ovvero
|∆H (K)| = 2|DF | + 2|PF | −
K∈D
|∆H (K)| − 2k
K∈P
F
= 2|DF | +
F
(2 − |∆H (K)|) − 2k
K∈P
F
Dunque, per dimostrare la disuguaglianza (2.4) basta dimostrare che
(2 − |∆H (K)|) − 2k ≤ 0
K∈P
(2.5)
F
Consideriamo una componente pari K ∈ PF . Sia K la componente di F che
contiene la componente K di F . Ad esempio, se in Figura 2.13 consideriamo la
componente pari K 2 la componente K e` l’unione delle componenti K 1 , K 2 e K 9 .
Dato che F e` stata ottenuta da F eliminando degli archi, I vertici di ogni
albero della foresta F o sono tutti contenuti in K oppure sono tutti esterni a K.
Ad esempio la componente K unione delle componenti K 1 , K 2 e K 9 di Figura
2.13 contiene esattamente due componenti di F ciascuna costituita da due vertici
connessi con un arco continuo.
Siccome ogni componente di F ha un numero di vertici pari anche K deve
contenere un numero pari di vertici. Quindi sia K che K \ K hanno un numero
pari di vertici.
Inoltre |∆H (K)| = 1 altrimenti se togliamo da F l’unico arco in ∆H (K) la
componente che lo contiene si spezza in due componenti pari, contraddicendo la
minimalit`a di F . Dunque o |∆H (K)| ≥ 2 oppure |∆H (K)| = 0.
Nel primo caso, nella disequazione (2.5), il termine della sommatoria relativo
a K e` minore o uguale a 0. Nel secondo caso la componente K e` un vertice isolato
di H e costituisce quindi una delle k componenti di H.
Dunque le componenti per cui |∆H (K)| = 0 sono al pi`u k e pertanto la (2.5)
e` verificata ed il teorema e` dimostrato.
124
2.4.7
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Alcuni dettagli implementativi
Mostriamo come l’algoritmo si possa implementare con complessit`a O(n2 log n).
Siccome il numero di iterazioni e` al pi`u n−1 (perch´e F e` una foresta) ci basta
realizzare ciascuna iterazione in tempo O(n log n).
Le componenti di F possono essere mantenute in una struttura dati per insiemi
disgiunti in modo tale che ogni operazione di riunione di due componenti richieda
tempo O(α(n)), dove α(n) e` l’inversa della funzione di Ackerman che, ai fini
pratici, possiamo considerare O(1).
Per trovare velocemente l’arco uv da aggiungere ad F , l’algoritmo mantiene
la somma ∆ di tutti gli incrementi δ operati nelle iterazioni precedenti e per ogni
arco uv tale che u e v appartengano a due componenti distinte K ed K mantiene
aggiornato il valore
key[uv] = ∆ + D
dove D e` il valore dell’incremento δ che renderebbe il vincolo cuv ≥ d[u] + d[v]
un’uguaglianza.
Siccome i valori d[u] vengono incrementati soltanto se u appartiene ad una
componente dispari, se le due componenti sono entrambe dispari avremo
1
key[uv] = ∆ + (cuv − d[u] − d[v])
2
se una e` dispari e l’altra pari
key[uv] = ∆ + cuv − d[u] − d[v]
e infine se sono entrambe pari
key[uv] = ∆ + ∞ = ∞
Osserviamo che se l’esecuzione di una iterazione non modifica la parit`a delle
componenti contenenti u e v il valore di key[uv] relativo all’arco uv non cambia
in quanto il primo addendo ∆ viene incrementato di δ, la stessa quantit`a di cui
diminuisce il secondo addendo D.
Manteniamo un heap ordinato rispetto a key[uv] in cui inseriamo, per ogni
coppia di componenti distinte K e K , l’arco uv avente chiave key[uv] minima tra
tutti quelli che connettono un vertice u ∈ K con un vertice v ∈ K .
In questo modo, ad ogni iterazione, per ottenere l’arco uv da aggiungere ad F
basta estrarre dallo heap l’arco uv con chiave minima (costo O(log n)).
Vediamo quindi come mantenere aggiornato lo heap.
2.5. PROBLEMA DEL TAGLIO MASSIMO
125
All’inizio ∆ = 0 e d[u] = 0 per ogni vertice u. Siccome tutte le componenti
sono singoletti e quindi dispari ed ogni arco uv e` l’unico che connette le due
componenti distinte K = {u} e K = {v} dobbiamo inserire nel mucchio tutti gli
archi con key[uv] = cuv /2. Questo costa O(n2 log n) (gli archi sono n(n−1)/2 =
O(n2 )).
Ad ogni iterazione dobbiamo aggiornare le chiavi degli archi uscenti dalla
nuova componente K ∪ K che si ottiene riunendo le due componenti K e K (in
quanto la parit`a pu`o cambiare). In totale dobbiamo aggiornare un numero di archi
pari a due volte il numero di componenti K diverse sia da K che da K (costo
O(n log n)).
Dobbiamo inoltre eliminare dallo heap l’arco uv selezionato e, per ogni componente K diversa da K e da K , uno dei due archi che connettono K ∪ K a
K : quello con chiave maggiore. Costo O(n log n).
Sommando su tutte le iterazioni otteniamo quindi costo O(n2 log n).
Infine, per ottenere F da F basta effettuare una ricerca in profondit`a su F
calcolando il numero di discendenti di ogni vertice v nella foresta di ricerca in
profondit`a (compreso il vertice v stesso). Gli archi da rimuovere sono gli archi
d’albero uv tali che v abbia un numero pari di discendenti. Costo O(n).
2.5
Problema del taglio massimo
In questa sezione mostreremo come sia talvolta possibile ottenere algoritmi di
approssimazione migliori usando dei rilassamenti pi`u sofisticati di quelli lineari.
Mostreremo anche che usare la randomizzazione per arrotondare la soluzione
ottenuta mediante il rilassamento pu`o risultare molto utile.
Per illustrare questi fatti useremo il problema Max-Cut del taglio massimo
nella sua versione non pesata:
“Dato un grafo G = (V, E) trovare un taglio (S, S) tale che sia
massimo il numero di archi δ(S) = |∆(S)| che intersecano il taglio.”
Nella versione pesata ogni arco uv ha un peso cuv ed il taglio massimo (S, S)
e` quello che massimizza
CS =
cuv
uv∈∆(S)
Per semplicit`a ci concentreremo sulla versione non pesata, ma i risultati a cui
arriveremo si possono facilmente estendere al caso pesato.
126
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Si pu`o dimostrare che Max-Cut e` NP-difficile e MAX-SNP completo e pertanto non possiamo aspettarci di poter ottenere algoritmi di approssimazione aventi un rapporto di approssimazione α arbitrariamente vicino ad 1.
Ricordiamo che un algoritmo di α-approssimazione per Max-Cut e` un algoritmo polinomiale che trova un taglio (S, S) tale che δ(S) ≥ α δ(Smax ) dove
(Smax , S max ) e` il taglio massimo.
Fino al 1993 il miglior α era 0.5, ora e` 0.878 con un algoritmo dovuto a
Goemans e Williamson [13].
Cominceremo riportanto tre semplici algoritmi con rapporto di approssimazione 0.5.
Scelta casuale. Questo e` un algoritmo randomizzato. Ogni vertice u ∈ V viene
scelto casualmente con probabilit`a 1/2 indipendentemente dalle scelte degli
altri vertici. L’insieme S e` quindi l’insieme dei vertici scelti. Il valore atteso
di δ(S) e`
Pr[uv ∈ ∆(S)]
E[δ(S)] =
uv∈E
Pr[u ∈ S, v ∈ S oppure u ∈ S, v ∈ S]
=
uv∈E
=
1 1
1
( + ) = |E|
4
2
uv∈E 4
Siccome δ(Smax ) ≤ |E| otteniamo E[δ(S)] ≥ 12 δ(Smax ).
Algoritmo goloso. Numeriamo i vertici del grafo in modo che V = {1, 2, . . . , n}.
Sia
Vu = {v | v < u, uv ∈ E}
l’insieme dei vertici v che precedono u e che sono connessi ad u con un
arco uv ∈ E ed
Eu = {uv ∈ E | v ∈ Vu }
l’insieme di tali archi. Chiaramente gli insiemi Eu formano una partizione di E (gli archi sono raggruppati rispetto al maggiore dei due estremi).
L’algoritmo prende in considerazione un vertice u alla volta nell’ordine
1, 2, . . . , n e sceglie di aggiungelo ad S oppure al complementare S in modo
tale che almeno la met`a degli archi in Eu intersechino il taglio. L’algoritmo
e` quindi
2.5. PROBLEMA DEL TAGLIO MASSIMO
127
G REEDY(G = (V, E))
1 S = {1}
2 for u = 2 to n
3
if |S ∩ Vu | ≤ 21 |Eu |
4
S = S ∪ {u}
5 return S
Il vertice u viene aggiunto ad S se almeno la met`a degli archi in Eu connettono u ad un vertice v < u precedentemente scartato, ossia ad un vertice
v ∈ S. Quindi almeno una met`a degli archi in Eu interseca il taglio.
Viceversa, il vertice u viene scartato (e dunque aggiunto ad S) se almeno la
met`a degli archi in Eu connettono u ad un vertice v < u precedentemente
aggiunto ad S. Quindi, anche in questo caso, almeno una met`a degli archi
in Eu interseca il taglio. Dunque
δ(S) ≥
u∈V
1
1
|Eu | = |E|
2
2
e possiamo concludere che
1
1
δ(S) ≥ |E| ≥ δ(Smax )
2
2
Ricerca locale. Diciamo che S e` un ottimo locale se
δ(S) ≥ δ(S \ {u}) e δ(S) ≥ δ(S ∪ {v})
per ogni vertice u ∈ S e v ∈ S.
L’algoritmo di ricerca locale muove un vertice alla volta da S a S o viceversa fino ad arrivare ad un ottimo locale. Nel caso del problema non
pesato l’algoritmo e` polinomiale (ogni volta δ(S) aumenta di almeno 1
e δ(S) < n2 ). Nel caso del problema pesato la complessit`a pu`o invece
diventare esponenziale.
Dimostriamo che se S e` un ottimo locale
1
1
δ(S) ≥ |E| ≥ δ(Smax )
2
2
e quindi l’algoritmo e` di 21 -approssimazione.
128
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Osserviamo che
δ(S) =
1
|∆(S) ∩ ∆(v)|
2 v∈V
in quanto ogni arco in ∆(S) viene contato due volte nella sommatoria a
destra. Inoltre
1
|∆(S) ∩ ∆(v)| ≥ δ(v)
2
altrimenti potremmo spostare v dall’altra parte ottenendo un taglio migliore.
Dunque
δ(S) =
1
1
1
1
|∆(S) ∩ ∆(v)| ≥
δ(v) = |E|
2 v∈V
2 v∈V 2
2
Prima che fosse proposto l’algoritmo che vedremo tra poco sono stati ottenuti molti piccoli miglioramenti del rapporto di approssimazione α. Per un grafo di n nodi ed m archi si sono raggiunti successivamente i seguenti rapporti di
approssimazione:
1
,
2
1
1
+
,
2 2m
1
1
1 n−1
+
e
+
2 2n
2
4m
Asintoticamente questi sono tutti uguali a 0.5.
2.5.1
Un algoritmo randomizzato di 0.878-approssimazione
L’algoritmo che presentiamo e` randomizzato ma differisce dall’algoritmo randomizzato della scelta casuale per due importanti fatti
• La scelta di un vertice v ∈ S non e` indipendente dalla scelta degli altri
vertici.
• Il valore δ(S) del taglio risultante viene confrontato con un limite superiore
migliore di |E|.
Associamo ad ogni vertice v ∈ V del grafo un vettore unitario n-dimensionale
wv , dove n = |V | e` il numero di vertici. Ricordiamo che un vettore e` unitario se
ha norma
||w|| = w · w = w12 + . . . + wn2 = 1
Un vettore unitario individua un punto sulla sfera unitaria n-dimensionale F (n)
centrata nell’origine.
2.5. PROBLEMA DEL TAGLIO MASSIMO
129
Scegliamo casualmente un vettore unitario r e sia
(n−1)
P⊥r
= {x | x · r = 0}
il piano (n − 1)-dimensionale perpendicolare ad r e passante per l’origine.
(n−1)
Il piano P⊥r divide la sfera unitaria F (n) in una semisfera superiore
(n)
Fsup
= {w ∈ F (n) | w · r ≥ 0}
ed una semisfera inferiore
(n)
Finf = {w ∈ F (n) | w · r < 0}
Dividiamo i vertici in due parti: l’insieme
S = {v ∈ V | wv · r ≥ 0}
dei vertici rappresentati da punti nella semisfera superiore e l’insieme complementare
S = {v ∈ V | wv · r < 0}
dei vertici rappresentati da punti nella semisfera inferiore (i vertici sull’iperpiano
li mettiamo convenzionalmente in S).
In questo modo r individua un taglio (S, S) e siccome r e` scelto casualmente
possiamo scrivere il valore atteso del taglio come
Pr[segno(wu · r) = segno(wv · r)]
E[δ(S)] =
(2.6)
uv∈E
dove il valore atteso e` calcolato rispetto alla scelta casuale di r.
Lemma 2.5.1 Pr[segno(wu · r) = segno(wv · r)] =
arccos(wu · wv )
π
Dimostrazione. Ci limitiamo a dare una dimostrazione geometrica. La dimostrazione analitica e` pi`u complicata ed e` strettamente legata al problema della scelta
casuale di un punto r sulla superfice della sfera unitaria.
Sia Pw(2)
il piano bidimensionale che contiene i due vettori wu e wv e sia
u ,wv
α = arccos(wu · wv ) l’angolo tra i due vettori (vedi Figura 2.14).
(n−1)
Sia inoltre P⊥r il piano (n−1)-dimensionale perpendicolare ad r e passante
per l’origine.
130
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
y
z
r
wu
α
wv
x
α
α r
Pw(2)
u ,wv
(n−1)
P⊥r
Figura 2.14: Illustrazione del Lemma 2.5.1
(n−1)
Il piano P⊥r separa wu da wv se e solo se la retta di intersezione R dei due
.
piani separa wu da wv nel piano Pw(2)
u ,wv
se e solo se la proieA sua volta la retta R separa wu da wv nel piano Pw(2)
u ,wv
(2)
zione r di r sul piano Pwu ,wv appartiene ad uno di due settori opposti di ampiezza
α (vedi Figura 2.14).
Siccome il punto r e` scelto casualmente sulla superfice della sfera la probabilit`a che la sua proiezione r cada in uno dei due settori di ampiezza α e`
2α
arccos(wu · wv )
=
2π
π
Per il Lemma precedente possiamo riscrivere l’equazione 2.6
E[δ(S)] =
uv∈E
arccos(wu · wv )
π
2.5. PROBLEMA DEL TAGLIO MASSIMO
131
Siccome E[δ(S)] ≤ δ(Smax ) per ogni S, anche
max E[δ(S)] ≤ δ(Smax )
w1 ,...,wn
dove il massimo e` preso su tutte le possibili scelte dei vettori unitari w1 , . . . , wn
che rappresentano i vertici.
In realt`a tale massimo e` uguale a δ(Smax ). Infatti supponiamo che tutti i vettori
relativi ai vertici in Smax siano uguali ad un vettore unitario w e tutti i vettori
relativi ai vertici in S max siano uguali al vettore opposto −w. In questo caso, tutti
i valori di r generano lo stesso taglio Smax e quindi E[δ(S)] = δ(Smax ).
Questo dimostra che
δ(Smax ) = max
w1 ,...,wn
uv∈E
arccos(wu · wv )
π
Sfortunatamente trovare questo massimo e` difficile almeno quanto il problema
originale e quindi pu`o sembrare che non abbiamo fatto alcun progresso. Possiamo
per`o approssimare tale massimo scegliendo opportunamente un insieme di vettori.
2.5.2
Come scegliere un buon insieme di vettori
La funzione
arccos(x)
π
e` definita nell’intervallo [−1, 1] e assume valori in [0, 1] con f (1) = 0 ed f (−1) =
1.
Possiamo ottenere un rilassamento sostituendo la funzione f (x) con una qualsiasi altra funzione g(x) definita in [0, 1] e tale che g(1) = 0 ed g(−1) = π.
Consideriamo infatti il seguente problema P di programmazione non lineare:
f (x) =
g(wu · wv )
CP = max
uv∈E
wu
= 1
∀u ∈ V
Se, dato un taglio S, poniamo wu = w se u ∈ S e wu = −w altrimenti, otteniamo
g(wu · wv ) = δ(S)
uv∈E
Quindi CP ≥ δ(Smax ) e` un limite superiore per il valore del taglio massimo.
132
2.5.3
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
L’algoritmo
L’algoritmo si compone dei seguenti tre passi:
1. Risolvi il problema P per ottenere un insieme di vettori {w1∗ , . . . , wn∗ }.
2. Scegli casualmente il vettore unitario r.
3. Poni S = {u | wu∗ · r ≥ 0}.
Per il taglio S calcolato in questo modo vale il seguente
Teorema 2.5.2 E[δ(S)] ≥ α CP ≥ α δ(Smax ) dove α = min
−1≤x≤1
f (x)
.
g(x)
Dimostrazione. Basta osservare che
arccos(wu∗ · wv∗ )
f (wu∗ · wv∗ )
=
E[δ(S)] =
π
uv∈E
uv∈E
αg(wu∗ · wv∗ )
≥
uv∈E
= α CP ≥ α δ(Smax )
Dobbiamo quindi scegliere la funzione g in modo tale che il programma P sia
risolubile in tempo polinomiale e che α risulti pi`u grande possibile.
Vedremo che se g e` lineare il problema P si pu`o risolvere in tempo polinomiale. Scegliamo quindi g(x) = 21 (1 − x): la funzione lineare tale che g(−1) = 1 e
g(1) = 0. Con questa scelta
2 arccos(x)
−1≤x≤1 π(1 − x)
2 arccos(−0.689)
=
π(1 + 0.689)
= 0.87856
α =
2.5.4
min
Soluzione di P
Avendo scelto g(x) = 12 (1 − x) dobbiamo risolvere il seguente problema P di
programmazione non lineare
CP = max
uv∈E
wu
= 1
1
(1 − wu · wv )
2
∀u ∈ V
(2.7)
2.5. PROBLEMA DEL TAGLIO MASSIMO
133
Sia W la matrice avente per righe i vettori wu e sia Y = [yuv ] = W W T la matrice
n × n di elementi yuv = wu · wv . La matrice Y = [yuv ] soddisfa le seguenti
condizioni
1. yuu = wu · wu = ||wu || = 1.
2. Y
0, dove 0 significa che Y e` semi-definita positiva, ossia xT Y x ≥ 0
per ogni vettore x. Infatti
xT Y x =
(wu · wv )xv
xu
u
v
xu w u ·
=
u
xv w v
v
xu w u ≥ 0
=
u
Viceversa, ogni matrice semidefinita positiva Y
0 tale che yuu = 1 per ogni
u pu`o essere scritta come Y = [wu ·wv ] per un opportuno insieme di vettori unitari
{w1 , . . . , wn }. Questo si ottiene con la fattorizzazione di Cholesky Y = W W T .
Quindi il problema 2.7 e` equivalente al seguente
CP = max
uv∈E
Y
yuu
0
= 1
1
(1 − yuv )
2
(2.8)
∀u ∈ V
Osserviamo che l’insieme Qn delle matrici n × n semidefinite positive con
yuu = 1 per ogni u e` un insieme convesso. Infatti se A, B ∈ Qn allora anche
tA + (1 − t)B ∈ Qn
per 0 ≤ t ≤ 1 come si pu`o facilmente verificare.
La funzione obiettivo e` invece concava (`e lineare). Possiamo quindi risolvere
in tempo polinomiale il problema 2.8 utilizzando un algoritmo di programmazione
convessa.
Questo completa l’analisi dell’algoritmo.
Osserviamo che l’analisi e` molto stretta: se il grafo G e` un ciclo con 5 vertici
allora δ(Smax ) = 4 e
√
π
25 + 5 5
5
CP = (1 + cos ) =
2
5
8
134
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
per cui
δ(Smax )
24
√ = 0.88445
=
CP
25 + 5 5
2.5.5
Come scegliere r
Il vettore unitario r deve essere scelto casualmente sulla sfera unitaria n-dimensionale F (n) .
Per scegliere casualmente il vettore unitario r basta scegliere casualmente un
vettore n-dimensionale x con una qualsiasi distribuzione di probabilit`a che sia
invariante per rotazione e dividerlo per la sua lunghezza |x| = x21 + . . . + x2n
per ottenere il vettore unitario r = x/|x|.
Il seguente Teorema ci dice come possiamo fare ci`o in modo semplice:
Teorema 2.5.3 Sia x = (x1 , . . . , xn ) una variabile casuale vettoriale e supponiamo che le sue coordinate xi siano scelte casualmente ed indipendentemente
da una distribuzione di probabilit`a normale N (0, 1) con media 0 e varianza 1.
Allora la probabilit`a p(x) di x e` invariante per rotazione.
Dimostrazione. La probabilit`a della normale N (0, 1) e` :
1
2
p(z) = √ e−z /2
2π
E quindi
1
1
1
2
2
2
p(x) = √ e−x1 /2 · √ e−x2 /2 · . . . · √ e−xn /2
2π
2π
2π
n
1
2
2
√
e−(x1 +...+xn )/2
=
2π
n
1
√
=
e−||x||/2
2π
dove
||x|| = xT x = x21 + . . . + x2n
e` la norma quadratica di x. Siccome la norma di un vettore non cambia se il
vettore viene ruotato, anche la probabilit`a p(x) e` invariante per rotazione.
2.6. SCHEMI DI APPROSSIMAZIONE
2.6
135
Schemi di approssimazione
Possiamo andare un po’ pi`u avanti con il concetto di algoritmo di approssimazione
per definire il concetto di schema di approssimazione.
Definizione 2.6.1 Uno schema di approssimazione polinomiale PAS e` una famiglia di algoritmi A = {Aε : ε > 0} tali che per ogni ε > 0 l’algoritmo Aε e` un
algoritmo di (1 + ε)-approssimazione.
Definizione 2.6.2 Uno schema di approssimazione totalmente polinomiale FPAS
e` un PAS tale che Aε richiede tempo polinomiale sia nella dimensione dell’input
che in 1ε .
Come risultati negativi abbiamo visto che, per i risultati di Arora, i problemi
in MAX-SNP non hanno PAS (a meno che P = NP). Si sa inoltre che i problemi
NP-completi forti, non hanno FPAS (a meno che P = NP). Un problema NPcompleto forte e` un problema di decisione NP-completo avente degli interi come
input e che rimane NP-completo anche se imponiamo la restrizione che ogni numero in input si possa rappresentare con O(log(n)) bit, dove n e` la dimensione
dell’input.
Vediamo ora due problemi di ottimizzazione molto simili, tanto che il problema di decisione ad essi associato e` esattamente lo stesso, ma che si comportano in
modo molto diverso rispetto all’approssimabilit`a: uno ha un PAS e l’altro no.
Impacchettamento: Dato un insieme O = {o1 , . . . , on } di n oggetti rispettivamente di dimensioni d1 , . . . , dn e dei contenitori tutti uguali di capacit`a C
calcolare una partizione O1 , . . . , Om di O nel minimo numero m di sottoinsiemi tali che ciascuno dei sottoinsiemi possa essere contenuto in uno dei
contenitori di capacit`a C, ossia tali che
dj ≤ C
Cmax = max
1≤i≤m
oj ∈Oi
Schedulazione: Dato un insieme O = {o1 , . . . , on } di n lavori con tempi di esecuzione d1 , . . . , dn ed m macchine M1 , . . . , Mm su cui eseguirli calcolare
una partizione di O in sottoinsiemi O1 , . . . , Om che minimizzi
Cmax = max
1≤i≤m
dj
oj ∈Oi
ossia una ripartizione dei lavori tra le m macchine che permetta di terminare
tutti i lavori nel minimo tempo possibile.
136
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
La differenza tra i due problemi e` che nell’impacchettamento e` dato un limite
superiore C per Cmax ed e` richiesto di minimizzare il numero di sottoinsiemi m
mentre nella schedulazione e` fissato il numero di sottoinsiemi m ed e` richiesto di
minimizzare il limite superiore Cmax .
Il problema di decisione, in cui e` fissato sia m che C e si chiede se esiste una
partizione che soddisfi la disequazione, e` chiaramente lo stesso per entrambi ed e`
NP-completo.
Se consideriamo algoritmi di approssimazione abbiamo risultati completamente diversi per i due problemi. Per il problema dell’impacchettamento non
esiste alcun algoritmo di α-approssimazione con α < 32 (a meno che P = NP)
come abbiamo visto nella Sezione 2. Invece, per il problema della schedulazione
esiste un algoritmo di α-approssimazione per ogni α.
2.6.1
Schemi di approssimazione asintotici
Consideriamo una istanza
I = (n, m, d1 , . . . , dn )
del problema di schedulazione. Sia CO PT (I) il tempo minimo necessario ad eseguire tutti gli n lavori sulle m macchine. Per ogni C ≥ 0, sia IC l’insieme delle
istanze I per cui CO PT (I) = C.
Dato un algoritmo di approssimazione A che calcola una soluzione approssimata di valore CA (I) ed un valore C ≥ 0 possiamo considerare il coefficiente di
approssimazione peggiore sull’insieme IC di istanze, ossia
α(C) = sup
I∈IC
CA (I)
C
Definizione 2.6.3 Diciamo che l’algoritmo A ha rapporto di approssimazione
asintotico α se
α ≥ lim sup α(C)
C→∞
dove sup α(C) e` l’estremo superiore dell’insieme {α(C ) : C ≥ C}.
In Figura 2.15 e` rappresentato un possibile andamento delle funzioni α(C) e
sup α(C).
Per il problema della schedulazione non vi e` alcuna differenza tra rapporto
di approssimazione asintotico e rapporto di approssimazione. Questo perch´e il
2.6. SCHEMI DI APPROSSIMAZIONE
137
α
C
Figura 2.15: Grafico di α(C) (in nero) e di sup α(C) (in rosso dove differisce da
α(C)). Il valore di α = limC→∞ sup α(C) e` indicato in rosso tratteggiato.
problema della schedulazione gode della propriet`a di scalabilit`a: data una istanza
I ∈ IC possiamo costruire un’istanza I ∈ IβC semplicemente moltiplicando
tutti i tempi di esecuzione per β. Quindi per il problema della schedulazione
α(C) = sup α(C) = costante.
Usando la definizione precedente possiamo definire il concetto di schema di
approssimazione asintotico polinomiale PAAS e quello di schema di approssimazione asintotico totalmente polinomiale FPAAS .
Riassumiamo alcuni risultati che illustrano le differenze tra i due problemi.
1. Per l’impacchettamento non esiste alcun algoritmo di α-approssimazione
con α < 23 , a meno che P = NP. Dunque non esiste alcun PAS per
l’impacchettamento (a meno che P = NP).
2. Per la schedulazione esiste un PAS (Hochbaum e Shmoys [15]) che illustreremo tra poco.
3. Per l’impacchettamento esiste un PAAS (Fernandez de la Vega e Lueker
[9]).
4. Per la schedulazione non esiste alcun FPAAS a meno che P = NP. Questo
perch´e l’esistenza di un FPAAS implica l’esistenza di un FPAS (per la
scalabilit`a) e l’esistenza di un FPAS e` esclusa (a meno di P = NP) in
quanto la schedulazione e` un problema NP-completo forte.
5. Per l’impacchettamento esiste anche un FPAAS (Karmarkar e Karp [16]).
138
2.6.2
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Uno schema di approssimazione per la schedulazione
Presentiamo uno schema di approssimazione polinomiale per il problema della
schedulazione. Questo schema e` dovuto a Hochbaum e Shmoys [15].
L’idea e` quella di usare una relazione simile a quella che esiste tra un problema
di ottimizzazione ed il problema di decisione associato: se abbiamo un modo per
risolvere il problema di decisione, possiamo usare la ricerca binaria per trovare la
soluzione del problema di ottimizzazione.
Noi otterremo un algoritmo di (1 + ε)-approssimazione per il problema di
ottimizzazione usando un algoritmo di (1 + ε)-approssimazione per il problema
di decisione associato.
Ma cosa significa algoritmo di (1 + ε)-approssimazione per un problema di
decisione se il risultato pu`o essere soltanto SI o NO? La definizione e` la seguente:
Definizione 2.6.4 Un algoritmo di (1 + ε)-approssimazione per un problema di
decisione e` un algoritmo polinomiale che dato C risponde SI se C ≥ CO PT , risponde NO se C < CO PT /(1 + ε) mentre se CO PT /(1 + ε) ≤ C < CO PT pu`o rispondere
sia SI che NO. In ogni caso se l’algoritmo risponde SI esso deve fornire in output
anche una soluzione di costo C ∗ minore o uguale di (1 + ε)C.
Se abbiamo a disposizione un algoritmo di (1 + ε)-approssimazione per il problema di decisione associato possiamo usare la ricerca binaria per trovare una soluzione (1 + ε)-approssimata per il problema della schedulazione. Per fare questo
si procede nel modo seguente.
Per iniziare la ricerca binaria ci serve intanto un intervallo che contenga il
valore CO PT . Allo scopo consideriamo il massimo tra il carico medio per macchina
Cmed ed il tempo massimo dmax richiesto per un singolo lavoro
L = max(Cmed , dmax ) = max
n
i=1
m
di
, max di
1≤i≤n
Siccome tutti i lavori devono essere eseguiti valgono le due disuguaglianze
CO PT ≥ dmax e CO PT ≥ Cmed . Quindi L e` un limite inferiore per CO PT .
Mostriamo che 2L e` un limite superiore per CO PT . Consideriamo una schedulazione in cui i lavori vengono eseguiti nell’ordine o1 , o2 , . . . , on sulla prima
macchina che si libera.
Sia oi un lavoro che finisce per ultimo al tempo C ∗ . Fino al tempo Ci in cui e`
iniziata l’esecuzione di oi tutte le macchine hanno lavorato continuamente. Quindi
Ci ≤ Cmed (vedi Figura 2.16). Dunque
CO PT ≤ C ∗ = Ci + di ≤ Cmed + dmax ≤ 2L
2.6. SCHEMI DI APPROSSIMAZIONE
m
..
.
k
..
.
139
..
.
oi
..
.
1
Ci
Cmed C ∗
Figura 2.16: Schedulazione dei lavori o1 , o2 , . . . , on
ed abbiamo l’intervallo [L, 2L] da cui partire per una ricerca binaria del valore
ottimo CO PT .
Partiamo quindi con l’intervallo di estremi C1 = L e C2 = 2L e lo restringiamo in modo da mantenere vero che C1 ≤ CO PT e che esiste una schedulazione di
costo C ∗ ≤ (1 + ε/2)C2 (e quindi a maggior ragione CO PT ≤ (1 + ε/2)C2 ).
Noi effettueremo la ricerca binaria usando una scala logaritmica. Il punto
medio in scala logaritmica tra i due estremi C1 e C2 e` quel valore C per cui
log2 C =
log2 C1 + log2 C2
2
√
ovvero C = C1 C2 (detta anche media geometrica).
Partiamo quindi con l’intervallo
√ di estremi C1 = L e C2 = 2L, calcoliamo la media geometrica C = C1 C2 ed eseguiamo l’algoritmo di (1 + ε/2)approssimazione per il problema di decisione con input il valore C.
Se la risposta e` NO sappiamo che C ≤ CO PT e ci restringiamo all’intervallo
[C, C2 ]. Se la risposta e` SI sappiamo che esiste una schedulazione di costo C ∗ ≤
(1 + ε/2)C e ci restringiamo all’intervallo [C1 , C].
Continuiamo il procedimento fino a che l’intervallo si restringe abbastanza da
rendere vera la diseguaglianza
C2
1+ε
≤
C1
1 + ε/2
ovvero l’ampiezza dell’intervallo in scala logaritmica si riduce a
log2 C2 − log2 C1 ≤ log2 (1 + ε) − log2 (1 + ε/2)
140
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
All’inizio tale ampiezza e` log2 2L
= 1 e ad ogni iterazione viene dimezzata.
L
Dunque il numero di iterazioni necessario per raggiungere la condizione di
uscita e` il minimo i tale che
1
≤ log2 (1 + ε) − log2 (1 + ε/2)
2i
ossia



i=
log2


1
log2
1+ε
1+ε/2



Siccome ci interessa il comportamento asintotico rispetto a 1/ε possiamo assumere ε ≤ 1 per cui:
log2
1
1+ε
=
[ln(1 + ε) − ln(1 + ε/2)]
1 + ε/2
ln 2
∞
1
1
1 ∞
(−1)i+1 εi − (−1)i+1 (ε/2)i
=
ln 2 i=1
i
i
i=1
i
1 ∞
i+1 2 − 1 i
=
(−1)
ε
ln 2 i=1
i2i
=
∞
2i − 1 i
3
1 1
ε − ε2 + (−1)i+1
ε
ln 2 2
8
i2i
i=3
≥
1 1
3
ε − 3(ε/2)2
ε − ε2 =
ln 2 2
8
2 ln 2
e il numero di iterazioni e`
i ≤ log2
2 ln 2
ε − 3(ε/2)2
= O log
1
ε
Notiamo che O(log 1ε ) = O(1) e` costante per un ε prefissato.
Alla fine delle iterazioni abbiamo
C ∗ ≤ (1 + ε/2)C2 ≤ (1 + ε)C1 ≤ (1 + ε)CO PT
L’algoritmo restituisce quindi il valore C ∗ che differisce dal valore ottimo CO PT
per un fattore minore o uguale ad 1 + ε. Esso restituisce inoltre una schedulazione
di costo C ∗ . Se C2 = 2L e` rimasto invariato la schedulazione e` quella banale
usata per dimostrare che 2L e` un limite superiore. Se C2 < 2L la schedulazione e`
2.6. SCHEMI DI APPROSSIMAZIONE
ρC
q i di
t0 t1 t2
tj
141
C
tK
Figura 2.17: La discretizzazione delle durate dei lavori lunghi. I punti di discretizzazione sono tj = ρC + jρ2 C. Ad ogni durata di corrisponde una durata discretizzata qi il cui valore e` il punto di discretizzazione tj immediatamente
precedente.
quella di costo C ∗ calcolata dall’algoritmo di approssimazione per il problema di
decisione quando ha posto C2 = C.
Rimane soltanto da trovare l’algoritmo di (1 + ε)-approssimazione per il problema di decisione.
L’intuizione ci dice che i maggiori problemi nella schedulazione si hanno con
i lavori lunghi. I lavori corti si possono facilmente accomodare. Dividiamo quindi
l’insieme O dei lavori in due gruppi Ocorti ed Olunghi mettendo in Ocorti tutti i
lavori di durata di ≤ ρC, con ρ = ε/2.
Troviamo dapprima un algoritmo di (1 + ρ)-approssimazione per il problema
di decisione relativo ai soli lavori lunghi Olunghi che fornisca, in caso di risposta
positiva, una schedulazione di tali lavori che richiede tempo massimo (1+ρ)CO PT .
Dopo di che vedremo come sia possibile aggiungere i lavori corti Ocorti in
modo da rispettare il limite globale (1 + ε)CO PT .
Vediamo nel dettaglio come si effettuano queste operazioni.
Per schedulare i lavori lunghi in tempo massimo (1 + ρ)C osserviamo che vi
e` un numero massimo
N≤
1+ρ
(1 + ρ)C
=
= O(1/ρ) = O(1/ε)
ρC
ρ
di lavori lunghi che possono essere eseguiti su di una singola macchina e che tale
numero dipende soltanto da ε e non dalla particolare istanza del problema.
Operiamo inoltre una discretizzazione (Figura 2.17) della scala dei tempi compresi tra ρC e C ponendo
tj = ρC + jρ2 C
ed arrotondiamo le durate di dei lavori lunghi al valore discreto qi immediatamente
precedente, ossia
qi = tj ≤ di < tj+1
142
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Le durate discretizzate possono assumere al pi`u K valori distinti, dove K e`
l’intero tale che tK−1 ≤ C < tK , ossia
K = 1+
1−ρ
= O(1/ρ2 ) = O(1/ε2 )
2
ρ
Quindi anche K dipende soltanto da ε e non dalla particolare istanza del problema
e dunque, per un ε prefissato, sia N che K sono delle costanti.
Come vedremo tra poco esiste un algoritmo polinomiale che risolve (in modo
esatto) il problema di decisione con durate discretizzate.
Lemma 2.6.5 Se l’algoritmo di decisione con durate discretizzate ritorna NO non
esiste nessuna schedulazione dei lavori lunghi con durate originali avente tempo
di fine minore o uguale a C (e quindi neppure di tutti i lavori sia lunghi che corti).
Se l’algoritmo di decisione con durate discretizzate ritorna SI esiste una schedulazione dei lavori lunghi con durate originali avente tempo di fine minore o
uguale di (1 + ρ)C.
Dimostrazione. Nel primo caso la cosa e` ovvia in quanto le durate discretizzate
qi sono minori o uguali delle corrispondenti durate originali di .
Supponiamo quindi che esista una schedulazione che esegue tutti i lavori lunghi con durate discretizzate in tempo C.
Siccome le durate discretizzate sono tutte maggiori o uguali di ρC, su ogni
macchina vengono eseguiti al pi`u ρ1 lavori.
La differenza tra una durata effettiva e quella discretizzata e` al pi`u ρ2 C e quindi
l’aumento totale del tempo di fine di tutti i lavori e` al pi`u
1 2
ρ C = ρC
ρ
Dunque il tempo di fine con le durate originali e` al pi`u (1 + ρ)C.
Per risolvere il problema di decisione con durate discretizzate sfruttiamo il
fatto che esso e` anche il problema di decisione associato al problema dell’impacchettamento.
Useremo quindi la programmazione dinamica applicata al problema dell’impacchettamento per calcolare il minimo numero m di macchine necessarie ad
eseguire tutti i lavori lunghi con durate discretizzate entro il tempo C. Se m ≤ m
si risponde SI altrimenti si risponde NO.
2.6. SCHEMI DI APPROSSIMAZIONE
143
Rimane soltanto da mostrare come si possa usare la programmazione dinamica per risolvere il problema dell’impacchettamento sui lavori lunghi con durate
discretizzate.
Osserviamo intanto che l’istanza del problema dell’impacchettamento e` molto
particolare: abbiamo un numero massimo N costante di lavori su di una singola
macchina ed un numero massimo K costante di durate distinte.
Sia ni il numero di lavori lunghi aventi durata discretizzata qi per cui
K
n=
ni
i=1
Possiamo rappresentare i lavori lunghi eseguiti su di una singola macchina
con una sequenza (r1 , . . . , rK ) dove ri ≤ ni indica il numero di lavori di durata
discretizzata qi eseguiti su tale macchina.
Naturalmente ni ≤ N e quindi vi sono al pi`u N K tali sequenze. Possiamo
quindi enumerale tutte per selezionare l’insieme di quelle che rispettano il limite
C, ossia l’insieme
K
ri qi ≤ C
R = (r1 , . . . , rK ) :
i=1
Sia (r1 , . . . , rK ) ∈ R una sequenza che rispetta il limite C. Se eseguiamo tali
lavori su di una singola macchina ci occorrono almeno tante altre macchine quanto
e` il minimo per eseguire i rimanenti lavori, quelli rappresentati dalla sequenza
(n1 − r1 , . . . , nK − rK ).
Dunque, se indichiamo con m (n1 , . . . , nK ) il numero minimo di macchine
necessario ad eseguire i lavori lunghi con durate discretizzate rappresentati con la
sequenza (n1 , . . . , nK ) possiamo scrivere la relazione di ricorrenza
m (n1 , . . . , nK ) = 1 +
min
(r1 ,...,rK )∈R
m (n1 − r1 , . . . , nK − rK )
che si pu`o risolvere usando la programmazione dinamica.
Siccome le sequenze (n1 , . . . , nK ) sono meno di nK anche l’insieme dei sottoproblemi m (n1 , . . . , nK ) da risolvere con la programmazione dinamica ha cardinalit`a minore di nK e ciascuno di essi richiede di calcolare il minimo tra al pi`u
|R| ≤ N K valori calcolati precedentemente.
Dunque il tempo per risolvere la relazione di ricorrenza e`
2
2
2
O(nK N K ) = nO(1/ρ ) O(1/ρ)O(1/ρ ) = O(n/ρ)O(1/ρ ) = O(n/ε)O(1/ε
2)
144
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Usando la schedulazione dei lavori lunghi con durate discretizzate ottenuta con
la programmazione dinamica possiamo costruire l’algoritmo di (1 + ε)-approssimazione per il problema di decisione nel modo seguente.
Se la schedulazione ottima dei lavori lunghi con durate discretizzate ha valore
CO PT > C la schedulazione ottima di tutti i lavori con durate originale deve avere
costo ancora maggiore e quindi
CO PT ≥ CO PT > C
e l’algoritmo di decisione termina rispondendo NO.
Altrimenti l’algoritmo aggiunge uno alla volta i lavori corti alla schedulazione
attribuendo ciascuno di essi alla prima macchina che si libera e considerando i
tempi di esecuzione originali (vedi Figura 2.18).
CO PT CO PT
m
..
.
..
.
k
..
.
..
.
1
C
(1+ε)C
Figura 2.18: Schedulazione dei lavori corti
Se la schedulazione di tutti i lavori cos`ı ottenuta ha valore Cmax > (1 + ε)C
al tempo C tutte le macchine dovevano essere occupate (in quanto i lavori corti
hanno tutti durata di ≤ ρC < εC). Dunque
di ≥ mC
1≤i≤n
e i lavori non possono essere eseguiti tutti entro il tempo C. Anche in questo caso
l’algoritmo termina rispondendo NO. Altrimenti l’algoritmo termina rispondendo
SI e ritorna la schedulazione di costo Cmax ≤ (1 + ε)C calcolata. Questo costa
tempo O(n).
2.6. SCHEMI DI APPROSSIMAZIONE
145
2
Sommando il tempo O(n/ε)O(1/ε ) per calcolare m (n1 , n2 , . . . , nK ), si ottiene
un tempo
2
O(n + (n/ε)O(1/ε ) )
per risolvere il problema di decisione (1 + ρ)-rilassato.
Siccome tale soluzione deve essere iterata O(log 1ε ) volte per effettuare la
ricerca binaria otteniamo un tempo totale
1
2
O(n + (n/ε)O(1/ε ) )O(log )
ε
per l’intero algoritmo. Per ogni prefissato ε tale tempo e` polinomiale in n. Abbiamo quindi ottenuto un PAS per il problema della schedulazione.
146
CAPITOLO 2. ALGORITMI DI APPROSSIMAZIONE
Bibliografia
[1] S.Arora, C.Lund, R.Motwani, M.Sudan, M.Szegedy. Proof verification and
hardness of approximation problems. In Proceedings of the 33th Annual
Symposium on Foundation of Computer Science, pages 14–23, 1992.
[2] S.Arora, S.Safra. Probabilistic checking of proofs. In Proceedings of the
33th Annual Symposium on Foundation of Computer Science, pages 2–13,
1992.
[3] R.Bar-Yehuda, S.Even. A linear time approximation algorithm for the
weighted vertex cover problem. Journal of Algorithms, 2:198-203, 1981.
[4] M.Bellare, M.Sudan. Improved non-approximability results. In Proceedings
of the 26th Annual ACM Symposium on Theory of Computing, pages 184193, 1994.
[5] N.Christofides. Worst-case analysis of a new heuristic for the travelling
salesman problem. Tecnical Report 388, Graduate School of Industrial
Administration, Carnegie Mellon University, Pittsburgh, PA, 1976.
[6] I.Dinur, The PCP theorem by gap amplification. In Proceedings 38th ACM
Symposium on Theory of Computing, pages 241-250, 2006.
[7] J.Edmonds. Maximum matching and a polyhedron with 0,1-vertices. Journal of Research of the National Bureau of Standards B, 69B:125-130,
1965.
[8] R.Fagin. Generalized first-order spectra, and polynomial-time recognizable
sets. In R. Karp, editor, Complexity of Computations, AMS, 1974.
[9] W.Fernandez de la Vega, G.S.Luecker. Bin packing can be solved in within
(1 + ) in linear time. Combinatorica, 1(4), 1981.
147
148
BIBLIOGRAFIA
[10] N.H.Gabow. Data structures for weighted matching and nearest common
ancestors with linking. In Proceedings of the 1st ACM-SIAM Symposium on
Discrete Algorithms, pages 434-443, 1990.
[11] N.H.Gabow, M.X.Goemans, D.P.Williamson. An efficient approximation
algorithm for the survivable network design problem. In Proceedings of
the Third MPS Conference on Integer Programming and Combinatorial
Optimization, pages 57-74, 1993.
[12] M. X. Goemans, D. P. Williamson. A general approximation technique for
constrained forest problems. In Proceedings of the 3rd ACM-SIAM Symposium on Discrete Algorithms, pages 307-316, 1992.
[13] M. X. Goemans, D. P. Williamson. Improved approximation algorithms
for maximum cut and satisfiability problems using semidefinite programming. In Proceedings of the 26rd Annual ACM Symposium on Theory of
Computing, pages 422-431, 1994.
[14] D.Hochbaum. Approximation algorithms for set covering and vertex cover
problems. SIAM Journal on Computing, 11:555-556, 1982.
[15] D.Hochbaum and D.Shmoys. Using dual approximation algorithms for scheduling problems: theoretical and practical results. Journal of the ACM,
34(1), Jan. 1987.
[16] N.Karmarkar, R.Karp. An efficient approximation scheme for the onedimensional bin-packing problem. In Proceedings of the 23rd Annual
Symposium on Foundation of Computer Science, 1982.
[17] C.H.Papadimitriou, M.Yannakakis. Optimization, approximation, and complexity classes. Journal of Computer and Systems Science, 43:425–440,
1991.
[18] S. Ben-David, A. Borodin, R. M. Karp, G. Tardos, and A. Wigderson. On
the power of randomization in on-line algorithms. Algorithmica, 11:2–14,
1994.
[19] M. Chrobak and L. L. Larmore. On fast algorithms for two servers. Journal
of Algorithms, 12:607–614, 1991.
BIBLIOGRAFIA
149
[20] M. Chrobak and L. L. Larmore. An optimal online algorithm for k servers
on trees. SIAM Journal on Computing, 20:144–148, 1991.
[21] M. Chrobak and L. L. Larmore. HARMONIC is three-competitive for two
servers. Theoretical Computer Science, 98:339–346, 1992.
[22] M. Chrobak and L. L. Larmore. The server problem and on-line games. In
DIMACS Series in Discrete Mathematics and Theoretical Computer Science,
volume 7, pages 11–64, 1992.
[23] D. Coppersmith, P. G. Doyle, P. Raghavan and M. Snir. Random walks on
weighted graphs and applications to on-line algorithms. Journal of the ACM,
40:421–453, 1993.
[24] A. Fiat, R. Karp, M. Luby, L. A. McGeoch, D. Sleator, and N. E. Young.
Competitive paging algorithms. Journal of Algorithms, 12:685–699, 1991.
[25] A. Fiat, Y. Rabani, and Y. Ravid. Competitive k-server algorithms. In
Proc. 31st Symp. Foundations of Computer Science (FOCS), pages 454–463.
IEEE, 1990.
[26] E. Grove. The harmonic k-server algorithm is competitive. In Proc. 23rd
Symp. Theory of Computing (STOC), pages 260–266. ACM, 1991.
[27] S. Irani and R. Rubinfeld. A competitive 2-server algorithm. Information
Processing Letters, 39:85–91, 1991.
[28] D. S. Johnson. Fast algorithms for bin packing. Journal Computer Systems
Science, 8:272–314, 1974.
[29] J. M. Kleinberg. The localization problem for mobile robots. In Proc. 35th
Symp. Foundations of Computer Science (FOCS), pages 521–531. IEEE,
1994.
[30] E. Koutsoupias and C. Papadimitriou. On the k-server conjecture. Journal
of the ACM, 42:971–983, 1995.
[31] E. Koutsoupias. Weak adversaries for the k-server problem. In Proc. 40th
Symp. Foundations of Computer Science (FOCS), pages 444–449, 17–19
October 1999.
150
BIBLIOGRAFIA
[32] M. Manasse, L. A. McGeoch, and D. Sleator. Competitive algorithms for
server problems. Journal of Algorithms, 11:208–230, 1990.
[33] L. McGeoch and D. Sleator. A strongly competitive randomized paging
algorithm. Algorithmica, 6(6):816–825, 1991.
[34] P. Raghavan and M. Snir. Memory versus randomization in online algorithms. In Proc. 16th International Colloquium on Automata, Languages, and
Programming (ICALP), volume 372 of Lecture Notes in Computer Science,
pages 687–703. Springer, 1989.
[35] D. Sleator and R. E. Tarjan. Amortized efficiency of list update and paging
rules. Communications of the ACM, 28:202–208, 1985.
[36] A. C. C. Yao. New algorithms for bin packing. Journal of the ACM, 27:207–
227, 1980.
Indice
1
Algoritmi on-line
1.1 Introduzione . . . . . . . . . . . . . . . . . . . . .
1.1.1 Problema dell’investimento . . . . . . . .
1.1.2 Problema del noleggio degli sci . . . . . .
1.2 Problema della paginazione . . . . . . . . . . . . .
1.3 Algoritmo off-line di paginazione ottimo . . . . . .
1.4 Limite inferiore per la competitivit`a . . . . . . . .
1.5 Algoritmi on-line randomizzati . . . . . . . . . . .
1.6 Analisi dell’algoritmo M ARKING . . . . . . . . .
1.6.1 Costo prima pagina stabile . . . . . . . . .
1.6.2 Limite superiore su una fase . . . . . . . .
1.6.3 Limite inferiore su una fase . . . . . . . .
1.6.4 Il rapporto di competitivit`a di M ARKING .
1.7 Un limite inferiore per algoritmi randomizzati . . .
1.7.1 Un’utile tecnica . . . . . . . . . . . . . . .
1.7.2 Applicazione al problema della paginazione
1.8 Tipi di avversari . . . . . . . . . . . . . . . . . . .
1.9 Competitivit`a contro i vari tipi di avversari . . . . .
1.10 Analisi dell’algoritmo R ANDOM . . . . . . . . . .
1.11 Problema dei k server . . . . . . . . . . . . . . . .
1.11.1 Casi particolari . . . . . . . . . . . . . . .
1.11.2 Risultati noti . . . . . . . . . . . . . . . .
1.11.3 Alcune semplici strategie. . . . . . . . . .
1.12 Un algoritmo k competitivo sugli alberi . . . . . .
1.12.1 Dimostrazione della k-competitivit`a . . . .
1.13 Spazi metrici resistivi . . . . . . . . . . . . . . . .
1.13.1 L’algoritmo RWALK . . . . . . . . . . . .
151
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
5
6
7
11
15
16
19
22
23
24
25
25
25
27
30
32
36
39
40
41
42
44
45
50
54
152
INDICE
1.14 Algoritmo della funzione lavoro . . . . . . . . . . . . . . . . . . 60
1.14.1 La funzione lavoro . . . . . . . . . . . . . . . . . . . . . 61
1.14.2 L’algoritmo W ORK della funzione lavoro . . . . . . . . . 68
2
Algoritmi di Approssimazione
2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Risultati negativi . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Le classi P ed NP . . . . . . . . . . . . . . . . . . . . . .
2.2.2 Riduzione di 3Sat a 3Color . . . . . . . . . . . . . . . . .
2.2.3 Dimostrazioni “oltre ogni ragionevole dubbio” . . . . . .
2.2.4 Risultati negativi derivati dal Teorema PCP . . . . . . . .
2.2.5 Problemi M AX -S NP completi . . . . . . . . . . . . . . .
2.3 Progettazione di algoritmi di approssimazione . . . . . . . . . . .
2.3.1 Riferimento diretto alla soluzione ottima . . . . . . . . .
2.3.2 Stratificazione . . . . . . . . . . . . . . . . . . . . . . .
2.3.3 Utilizzo di un limite inferiore . . . . . . . . . . . . . . .
2.3.4 Rilassamento LP per Mvc . . . . . . . . . . . . . . . . .
2.3.5 Come usare il rilassamento . . . . . . . . . . . . . . . . .
2.4 Problema del matching perfetto di costo minimo . . . . . . . . . .
2.4.1 Una formulazione di Mpm come problema di programmazione lineare . . . . . . . . . . . . . . . . . . . . . . . .
2.4.2 Dalle foreste ai matching perfetti . . . . . . . . . . . . . .
2.4.3 L’algoritmo . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.4 Un esempio di esecuzione dell’algoritmo . . . . . . . . .
2.4.5 Analisi dell’algoritmo . . . . . . . . . . . . . . . . . . .
2.4.6 Ultimo passo e correttezza . . . . . . . . . . . . . . . . .
2.4.7 Alcuni dettagli implementativi . . . . . . . . . . . . . . .
2.5 Problema del taglio massimo . . . . . . . . . . . . . . . . . . . .
2.5.1 Un algoritmo randomizzato di 0.878-approssimazione . .
2.5.2 Come scegliere un buon insieme di vettori . . . . . . . . .
2.5.3 L’algoritmo . . . . . . . . . . . . . . . . . . . . . . . . .
2.5.4 Soluzione di P . . . . . . . . . . . . . . . . . . . . . . .
2.5.5 Come scegliere r . . . . . . . . . . . . . . . . . . . . . .
2.6 Schemi di approssimazione . . . . . . . . . . . . . . . . . . . . .
2.6.1 Schemi di approssimazione asintotici . . . . . . . . . . .
2.6.2 Uno schema di approssimazione per la schedulazione . . .
79
79
81
82
86
89
93
97
99
99
103
105
106
107
110
111
113
116
116
117
120
124
125
128
131
132
132
134
135
136
138