Matroidi, algoritmi greedy e teorema di Rado

Matroidi, algoritmi greedy
e teorema di Rado
per il corso di Laboratorio di Algoritmi e Ricerca Operativa
Dott. Alberto Leporati / Prof.ssa Enza Messina
Dipartimento di Informatica, Sistemistica e Comunicazione (DISCo)
Università degli Studi di Milano - Bicocca
Via Bicocca degli Arcimboldi 8, 20126 Milano
Una delle tecniche più semplici per la progettazione di algoritmi di ottimizzazione è la tecnica greedy. Intuitivamente, questo metodo costruisce la soluzione di un
problema di ottimizzazione mediante una successione di passi durante ciascuno dei
quali viene scelto un elemento “localmente” migliore; in altre parole a ciascun passo
la scelta migliore viene compiuta in un ambito limitato, senza controllare che il procedimento complessivo porti effettivamente al calcolo di una soluzione ottima per il
problema.
Questa strategia, se da un lato permette solitamente di ottenere algoritmi semplici
e facilmente implementabili, dall’altro può portare alla definizione di procedure che
non forniscono sempre la soluzione ottima. In questo documento vogliamo studiare le
proprietà degli algoritmi di questo tipo e verificare in quali casi è possibile garantire
che la soluzione costruita sia effettivamente la migliore.
1
Problemi di ottimizzazione
Per esprimere questi concetti in maniera precisa, consideriamo un insieme finito E
e una famiglia F di sottoinsiemi di E (F ⊆ 2E , dove 2E indica l’insieme delle parti
di E) che forma un ideale d’ordine rispetto alla relazione di inclusione, ovvero per il
quale vale la seguente proprietà di ereditarietà:
A∈F ∧ B⊆A
=⇒
B∈F
(Si noti che ciò deve valere per ogni A ∈ F e per ogni B ⊆ A). In tal caso diremo
che la coppia < E, F > forma un sistema di indipendenza.
1
Sia ora R+ l’insieme dei reali non negativi. Una funzione peso è una arbitraria
funzione w : E → R+ . Tale
Pfunzione può essere estesa ai sottoinsiemi di E ponendo,
per ogni A ⊆ E, w(A) =
w(x).
x∈A
Possiamo allora formulare in modo preciso il seguente problema di ottimizzazione:
Istanza: un sistema di indipendenza < E, F > e una funzione peso w :
E → R+ .
Soluzione: un insieme M ∈ F tale che w(M) sia massimo (ovvero A ∈
F ⇒ w(A) ≤ w(M)).
L’algoritmo greedy corrispondente a questo problema è definito dalla seguente
procedura:
Greedy (E, F , w)
S←∅
Q←E
while Q 6= ∅
do determina l’elemento m di peso massimo in Q
Q ← Q − {m}
if S ∪ {m} ∈ F then S ← S ∪ {m}
return S
Fissata una istanza del problema di ottimizzazione, ovvero una tripla E, F, w definita come sopra, la precedente procedura fornisce in uscita un insieme S che appartiene certamente a F (è quindi una soluzione ammissibile), ma non è necessariamente
ottimo nel senso che può non rappresentare un insieme di peso massimo in F .
Si pongono allora, a questo livello di generalità, due problemi:
1. qual è il tempo di calcolo dell’algoritmo greedy, cioè quanti passi di calcolo
devono essere compiuti avendo come ingresso un insieme E di n elementi?
2. In quali casi l’algoritmo greedy fornisce effettivamente una soluzione ottima?
Accenniamo solo di sfuggita al fatto che, qualora l’algoritmo non fornisca la soluzione ottima, si pone un terzo problema, ovvero quello di valutare la bontà della
soluzione prodotta (algoritmi di approssimazione).
2
2
Analisi delle procedure greedy
Ovviamente, visto il livello di generalità della formulazione del problema, non ci
possiamo aspettare un risultato univoco.
Una prima soluzione si può ottenere rappresentando
l’insieme E = {e1 , e2 , · · · , en }
mediante un vettore Q = Q[1], Q[2], . . . , Q[n] dove, inizialmente, Q[i] = ei per ogni
i. Indichiamo con SORT(Q) una funzione che restituisce il vettore Q ordinato in
modo tale che i pesi dei suoi elementi formino una progressione non crescente, ovvero
w(Q[1]) ≥ w(Q[2]) ≥ · · · ≥ w(Q[n]). La procedura può allora essere riscritta nella
forma seguente:
Greedy
S←∅
Q ← (e1 , e2 , · · · , en )
Q ← SORT(Q)
for i = 1, 2, . . . , n do
if S ∪ Q[i] ∈ F then S ← S ∪ Q[i]
Come si vede, la procedura prevede due passi principali: l’ordinamento di un
vettore di n elementi e n test per verificare se un insieme X ⊆ E appartiene a F .
Possiamo chiaramente eseguire il primo passo in un tempo O(n log n). Il secondo
tuttavia dipende dal particolare sistema di indipendenza considerato in ingresso. Se
comunque assumiamo di poter verificare l’appartenenza X ∈ F in un tempo
C(n),
il costo complessivo di questo controllo non è superiore a O n · C(n) . Possiamo
quindi concludere affermando che la procedura Greedy richiede al più un tempo
O n log n + nC(n) .
3
Matroidi e teorema di Rado
Diamo in questa sezione una soluzione parziale alla seconda questione che ci siamo
posti: in quali casi l’algoritmo greedy fornisce la soluzione ottima?
Il nostro obiettivo è quello di caratterizzare la classe dei sistemi di indipendenza
per i quali l’algoritmo greedy fornisce la soluzione ottima qualunque sia la funzione
peso considerata. Dimostreremo (teorema di Rado) che un sistema di indipendenza
verifica la proprietà precedente se e solo se esso è un matroide.
Un sistema di indipendenza < E, F > è detto matroide se, per ogni A, B ∈ F
tali che |B| = |A| + 1 (qui |X| indica la cardinalità di un insieme X), esiste almeno
3
un elemento b ∈ B − A per cui A ∪ {b} ∈ F . La nozione di matroide è stata
introdotta nel 1935 da Hassler Whitney per generalizzare il concetto di dipendenza
lineare. Questa nozione ha trovato proficue applicazioni in vari settori, dalla teoria
dei grafi agli algoritmi, e può essere considerata un ponte tra l’algebra lineare e la
matematica combinatoria.
Esempio 1. Sia E un insieme finito di vettori di uno spazio vettoriale V . Sia F
la famiglia di sottoinsiemi di E formati da vettori linearmente indipendenti. Si può
verificare facilmente che < E, F > forma un matroide, detto matroide vettoriale.
Esempio 2. Sia G un grafo non orientato e sia E l’insieme dei suoi lati. Un sottoinsieme X ⊆ E è detto indipendente se non forma cicli in G, ovvero se X forma
una foresta contenuta in G. Sia F la famiglia degli insiemi indipendenti in G. Anche
in questo caso si può verificare facilmente che < E, F > è un matroide, chiamato
matroide grafico.
Un risultato interessante, che fornisce una interpretazione algoritmica dei matroidi, è il seguente teorema.
Teorema 1. (Rado) Dato un sistema di indipendenza < E, F >, le seguenti proposizioni sono equivalenti:
a) per ogni funzione peso w : E → R+ , l’algoritmo greedy fornisce una soluzione
ottima;
b) < E, F > è un matroide.
Dimostrazione. Proviamo innanzitutto che la proposizione a) implica la proposizione
b). A tale scopo, mostriamo che vale la contronominale di tale implicazione, ovvero
¬ b) ⇒ ¬ a). Pertanto, dimostriamo che se < E, F > non è un matroide allora
esiste una funzione peso w : E → R+ per la quale l’algoritmo greedy non fornisce la
soluzione ottima. Infatti, poiché < E, F > non è un matroide, esistono due insiemi
A, B ∈ F tali che, per qualche k ∈ N,
|A| = k,
|B| = k + 1,
e inoltre ∀ b ∈ B \ A
Definiamo ora una funzione peso w nel
ogni x ∈ E:


α
w(x) = 1


0
=⇒
A ∪ {b} 6∈ F
modo seguente. Scelto α > 1, poniamo per
se x ∈ A
se x ∈ B − A
se x ∈ (A ∪ B)c
Assegnata tale funzione peso, l’algoritmo greedy fornirà una soluzione S formata
da tutti gli elementi in A (i quali, avendo peso maggiore, verranno selezionati per
4
primi) più, eventualmente, un insieme di elementi C ⊆ (A ∪ B)c . Si noti che in S
non vi possono essere elementi di B − A in quanto, per ogni b ∈ B − A, abbiamo
A ∪ {b} 6∈ F . Posto t = |A ∩ B|, abbiamo:
w(S) = w(A ∪ C) = w(A) + w(C) = α · |A| = α · k
w(B) = w(B − A) + w(A ∩ B) = (k + 1 − t) + α · t
Ne segue allora che:
w(S) < w(B) ⇐⇒ α · k < k + 1 − t + α · t ⇐⇒ 1 < α < 1 +
1
k−t
Quindi, se scegliamo α tale che
1<α<1+
1
,
k−t
si verifica che la soluzione S costruita dall’algoritmo greedy non è ottima.
Dimostriamo ora (in maniera diretta) che la proposizione b) implica la proposizione a), ovvero che se < E, F > è un matroide, comunque si scelga una funzione
peso w : E → R+ , l’algoritmo greedy restituisce la soluzione ottima. Sia infatti S =
{b1 , . . . , bn } la soluzione fornita dall’algoritmo, con w(b1 ) ≥ w(b2 ) ≥ . . . ≥ w(bn ). Sia
A = {a1 , a2 , . . . , am } un qualunque elemento di F , con w(a1 ) ≥ w(a2 ) ≥ . . . ≥ w(am ).
Si verifica subito che m ≤ n altrimenti, essendo < E, F > un matroide, l’algoritmo
avrebbe scelto un ulteriore elemento in A − S da aggiungere a S. Dimostriamo allora
che w(ai ) ≤ w(bi ) per ogni i = 1, 2, . . . , m. Infatti, per assurdo, sia k il primo intero
tale che w(ak ) > w(bk ). Si noti che l’insieme D = {b1 , b2 , . . . , bk−1 } appartiene a F e
inoltre |D| + 1 = |{a1 , a2 , . . . , ak }|. Di conseguenza, essendo < E, F > un matroide,
esiste un intero j ∈ {1, 2, . . . , k} tale che aj 6∈ D e D ∪ {aj } ∈ F . Poiché l’algoritmo greedy sceglie al passo k–esimo l’elemento di peso massimo tra quelli disponibili,
abbiamo w(bk ) ≥ w(aj ); d’altra parte, essendo j ≤ k, abbiamo w(aj ) ≥ w(ak ) e
quindi w(bk ) ≥ w(aj ) ≥ w(ak ), contro l’ipotesi w(ak ) > w(bk ). Questo prova che
w(A) ≤ w(S), e quindi la soluzione fornita dall’algoritmo è ottima.
Esercizi
Esercizio 1
Dato un grafo non orientato G =< V, E > nel quale V è l’insieme dei nodi ed E
quello degli archi, definiamo la seguente famiglia di sottoinsiemi di E:
F = {A ⊆ E | ∃ v ∈ V tale che ogni lato α ∈ A è incidente a v}
Per ipotesi assumiamo che ∅ ∈ F .
5
a) La coppia < E, F > forma un sistema di indipendenza?
b) La coppia < E, F > forma un matroide?
c) Si consideri il problema di determinare l’elemento di peso massimo in F assumendo per istanza un grafo G con pesi positivi associati agli archi. Descrivere
un algoritmo greedy per tale problema.
d) L’algoritmo descritto al punto c) determina sempre la soluzione ottima?
Esercizio 2
Ricordiamo che in un grafo non orientato G =< V, E > (dove V è l’insieme dei nodi
e E quello dei lati) una clique è un sottoinsieme C ⊆ V tale che, per ogni u, v ∈ C,
se u 6= v allora {u, v} ∈ E. Sia FG la famiglia di tutte le clique di G, cioè:
FG = {A ⊆ V | ∀ u, v ∈ A, u 6= v =⇒ {u, v} ∈ E}
a) La coppia < V, FG > forma un sistema di indipendenza?
b) La coppia < V, FG > forma un matroide?
c) Dato un grafo non orientato G =< V, E > e una funzione peso w : V → R+ ,
ogni insieme A ⊆ V ammette un peso w(A) definito da
X
w(A) =
w(x).
x∈A
Descrivere una procedura greedy che cerca di determinare un insieme C ∈ FG
di peso massimo in FG . La soluzione prodotta dall’algoritmo è sempre ottima?
Esercizio 3
Definire un problema di minimo per sistemi di indipendenza “pesati” analogo a quello
di massimo introdotto nella sezione 1. Definire un algoritmo greedy per tale problema.
Quando l’algoritmo fornisce sempre la soluzione ottima?
Esercizio 4
Riformulare il teorema di Rado riferendosi agli algoritmi greedy per problemi di
minimo introdotti nell’esercizio precedente, e presentarne la dimostrazione.
6