Algoritmi e Strutture di Dati II
Problemi, istanze, soluzioni
Un problema specifica una relazione matematica tra dati di
ingresso e dati di uscita.
Una istanza di un problema è formata dai dati di un generico
ingresso del problema.
Una istanza ha associato uno spazio di ricerca nel quale cercare
una soluzione per tale istanza del problema.
Il problema specifica la proprietà che una soluzione deve avere per
risolvere l’istanza del problema.
2
Algoritmi e Strutture di Dati II
Consideriamo il seguente problema: dato una sequenza di numeri S
trovare una permutazione di S che sia ordinata in senso crescente.
Una istanza di questo problema è una sequenza S.
Lo spazio di ricerca associato a S è l’insieme delle permutazioni di
S.
Una soluzione per l’istanza S è una permutazione di S che sia
ordinata in senso crescente.
3
Algoritmi e Strutture di Dati II
Consideriamo il seguente problema: dato un grafo pesato G e un
numero reale k, trovare un albero di supposto di G di costo minore
o uguale a k.
Una istanza di questo problema è una coppia (G, k).
Lo spazio di ricerca associato a (G, k) è l’insieme degli alberi di
supporto di G.
Una soluzione per l’istanza (G, k) è un albero di supporto di G il
cui costo è minore o uguale a k.
4
Algoritmi e Strutture di Dati II
Risolvere o verificare?
Un algoritmo che risolve un problema è un algoritmo che prende
in ingresso una istanza I del problema e restituisce una soluzione
per I.
Un algoritmo che verifica un problema è un algoritmo che prende
in ingresso una istanza I del problema e un elemento α dello spazio
di ricerca associato a I, e verifica se α risolve I.
5
Algoritmi e Strutture di Dati II
Risolvere o verificare?
HeapSort è un algoritmo che risolve il problema dell’ordinamento.
La sua complessità è Θ(n log n), ove n è il numero di elementi da
ordinare.
6
Algoritmi e Strutture di Dati II
L’algoritmo che segue verifica il problema dell’ordinamento in
tempo lineare Θ(n):
Check(S,A)
1: for i ← 1 to length(S) − 1 do
2:
3:
4:
5:
6:
if A[i] > A[i + 1] then
return false
end if
end for
return true
7
Algoritmi e Strutture di Dati II
Risolvere o verificare?
Il problema dell’albero di supporto di costo inferiore ad una certa
soglia può essere risolto con questo algoritmo:
• calcolo l’albero di supporto di costo minimo con l’algoritmo di
Kruskal;
• verifico se il costo di dell’albero restituito è inferiore alla soglia.
Dato che un albero di supporto ha n − 1 archi, il costo della fase di
verifica è Θ(n).
La complessità dell’algoritmo risulta dunque
Θ(n + m log n) = Θ(m log n).
8
Algoritmi e Strutture di Dati II
Un algoritmo che verifica il problema dell’albero di supporto di
costo inferiore ad una certa soglia esegue solo la fase di verifica e
dunque ha complessità lineare Θ(n).
9
Algoritmi e Strutture di Dati II
Risolvere o verificare?
Un algoritmo che risolve un problema può idealmente essere
scomposto in due parti:
• Esplorazione: l’algoritmo visita lo spazio di ricerca associato
all’istanza del problema che deve risolvere;
• Verifica: l’algoritmo verifica se un elemento dello spazio di
ricerca soddisfa la proprietà specificata dal problema.
Quindi la verifica è parte integrante della soluzione di un problema.
In termini computazionali ciò significa che risolvere è
impegnativo almeno quanto verificare!
10
Algoritmi e Strutture di Dati II
11
P e NP
La classe di complessità P contiene tutti i problemi che possono
essere risolti con complessità polinomiale.
La classe di complessità NP contiene tutti i problemi che possono
essere verificati con complessità polinomiale.
Dato che la verifica è parte integrante della soluzione di un
problema, abbiamo che:
P ⊆ NP
Algoritmi e Strutture di Dati II
Problemi NP-completi
Un problema Π è NP-completo se:
• Π ∈ NP; e
• per ogni problema Ω ∈ NP, Π è difficile da risolvere almeno
quanto Ω.
Il altri termini, tra tutti i problemi in NP, i problemi NP-completi
sono i più difficili da risolvere.
Si noti che se Π è NP-completo e Π ∈ P, allora P = NP.
12
Algoritmi e Strutture di Dati II
13
?
La questione P = NP
Il più grande problema aperto in Teoria della Complessità consiste
nel determinare se
P ⊂ NP
oppure se
P = NP
La congettura corrente è che P ⊂ NP in quanto non è mai stata
trovata alcuna soluzione polinomiale per un qualsiasi problema
NP-completo.
Algoritmi e Strutture di Dati II
14
Problema del commesso viaggiatore (TSP) con soglia
Dato un grafo indiretto G, un tour (o ciclo Hamiltoniano) in G
è un ciclo semplice (senza nodi ripetuti) che passa per tutti i nodi
di G.
Istanza: Un grafo G indiretto, completo e pesato con pesi interi e
positivi e un intero positivo k.
Domanda: Esiste un tour in G di costo minore o uguale a k?
Algoritmi e Strutture di Dati II
Problema del commesso viaggiatore (TSP)
Istanza: Un grafo G indiretto, completo e pesato con pesi interi e
positivi.
Problema: Trovare un tour in G di costo minimo.
15
Algoritmi e Strutture di Dati II
Complessità di TSP
• TSP può essere verificato in tempo polinomiale: dato un tour,
calcolo il suo costo sommando il costo di tutti i suoi archi e
verifico se è minore o uguale a k. Quindi TSP ∈ NP.
• E’ dimostrabile che tutti i problemi in NP possono essere
ridotti a TSP, quindi TSP è NP-completo.
Fino a oggi, nessuno ha mai trovato un algoritmo che risolve TSP
in tempo polinomiale.
16
Algoritmi e Strutture di Dati II
Problemi difficili
Di fronte a problemi difficili (NP-completi) possiamo procedere in
uno dei seguenti modi:
• identificare casi particolari del problema per i quali esiste una
soluzione polinomiale;
• risolvere il problema nella sua generalità solo su istanze piccole;
• usare un algoritmo che velocemente restituisce una soluzione
parziale (algoritmo incompleto) o una soluzione prossima a
quella ottima (algoritmo di approssimazione).
17
Algoritmi e Strutture di Dati II
18
Approx-TSP
Vediamo un algoritmo di approssimazione per TSP chiamato
Approx-TSP. Un algoritmo incompleto per TSP con soglia si
ottiene facilmente a partire dall’algoritmo di approssimazione.
Sia G = (V, E, w) un grafo indiretto completo con pesi non
negativi. Facciamo l’ipotesi che la funzione peso w soddisfi la
disuguaglianza triangolare: per ogni u, v, w ∈ V ,
w(u, w) ≤ w(u, v) + w(v, w)
Se w è una metrica (per esempio la distanza Euclidea), allora w
soddisfa la disuguaglianza triangolare.
Algoritmi e Strutture di Dati II
19
Approx-TSP
Approx-TSP è il seguente algoritmo di approssimazione per TSP:
1. scegliere a caso una radice r ∈ V ;
2. calcolare un albero T di supporto di costo minimo per G con
radice r usando l’algoritmo di Prim;
3. visitare i nodi di T in ordine anticipato e inserire i nodi in una
lista C;
4. appendere la radice r alla fine della lista C e restituire C.
Algoritmi e Strutture di Dati II
20
a
d
e
b
f
c
h
g
Algoritmi e Strutture di Dati II
21
a
d
e
b
f
c
h
C = a, b, c, h, d, e, f, g, a
g
Algoritmi e Strutture di Dati II
a
22
d
a
d
e
b
f
c
e
b
g
f
c
h
h
C = a, b, c, h, d, e, f, g, a
C* = a, b, c, h, f, g, e, d, a
w(C) = 19,074
w(C*) = 14,715
g
Algoritmi e Strutture di Dati II
Complessità di Approx-TSP
Approx-TSP ha complessità polinomiale: il passo 1 ha costo
costante, il passo 2 ha costo Θ(m log n), il passo 3 ha costo Θ(n) e
il il passo 4 ha costo costante.
Dato che il grafo è completo, m = Θ(n2 ), dunque il costo di
Approx-TSP risulta
Θ(n2 log n)
23
Algoritmi e Strutture di Dati II
Grado di approssimazione di Approx-TSP
Teorema Nel caso di grafi pesati che soddisfano la disuguaglianza
triangolare, la soluzione fornita da Approx-TSP ha costo minore o
uguale al doppio del costo della soluzione ottima.
24
Algoritmi e Strutture di Dati II
25
Sia C il tour fornito da Approx-TSP e C ∗ il tour di costo minimo.
Occorre dimostrare che
w(C) ≤ 2w(C ∗ )
Sia T l’albero di supporto di costo minimo. Dato che togliendo un
arco qualsiasi a C ∗ ottengo un albero di supporto, allora
w(T ) ≤ w(C ∗ )
Algoritmi e Strutture di Dati II
26
Sia P il cammino ottenuto seguendo la visita di T in ordine
anticipato e inserendo in P ogni nodo quando incontrato:
a
d
e
f
b
c
h
P = a, b, c, b, h, b, a, d, e, f, e, g, e, d, a
g
Algoritmi e Strutture di Dati II
Si noti che:
• P passa esattamente due volte per ogni arco di T . Dunque
w(P ) = 2w(T );
• il tour C è ottenuto elimimando da P le occorrenze ripetute di
ogni nodo. Dunque, per la disuguaglianza triangolare,
w(C) ≤ w(P ).
Quindi:
w(C) ≤ w(P ) = 2w(T ) ≤ 2w(C ∗ )
27
Algoritmi e Strutture di Dati II
Problemi NP-completi
Garey and Johnson, nel 1979, nel loro libro Computers and
Intractability, catalogano più di 300 problemi NP-completi.
Dieci anni dopo, nel 1989, Dewdney afferma nel suo libro The
Turning Omnibus l’esistenza di più di 2000 problemi NP-completi.
A tutt’oggi non esiste alcuna soluzione polinomiale pubblicata per
alcuno di questi problemi. Ciò suggerisce la congettura P &= N P .
28
Algoritmi e Strutture di Dati II
Albero di supporto con vincolo sul grado dei nodi
Istanza: Un grafo G = (V, E) e un intero positivo k ≤ |V |.
Domanda: Esiste un albero di supporto per G in cui tutti i nodi
dell’albero hanno grado minore o uguale a k?
29
Algoritmi e Strutture di Dati II
Ciclo/Cammino Hamiltoniano
Istanza: Un grafo G.
Domanda: Esiste un ciclo/cammino Hamiltoniano in G? Cioè,
esiste un ciclo/cammino semplice che passa per tutti i nodi del
grafo?
Commento: Il problema del cammino Hamiltoniano è invece
polinomiale su grafi diretti e aciclici.
30
Algoritmi e Strutture di Dati II
Commesso viaggiatore con collo di bottiglia
Istanza: Un grafo G indiretto, completo e pesato con pesi interi e
positivi e un intero positivo k.
Domanda: Esiste un tour in G in cui tutti gli archi hanno costo
minore o uguale a k?
31
Algoritmi e Strutture di Dati II
Commesso viaggiatore con distanza Euclidea
Istanza: Un grafo G indiretto, completo e pesato in cui i nodi sono
punti del piano Z × Z e il costo di un arco è la distanza Euclidea
discretizzata tra i due nodi dell’arco e un intero positivo k.
Domanda: Esiste un tour in G di costo minore o uguale a k?
Commento: Rimane NP-completo se la distanza è L1 oppure L∞ .
Rimane NP-difficile se la distanza è Euclidea (non discretizzata).
32
Algoritmi e Strutture di Dati II
Cammino di costo inferiore ad una soglia
Istanza: Un grafo G con pesi interi (arbitrari), due nodi s e t di G,
e un intero k.
Domanda: Esiste un cammino semplice da s a t in G di costo
minore o uguale a k?
Commento: Il corrispondente problema di ottimizzazione
(cammino di costo minimo), cioè trovare il cammino di costo
minimo tra due nodi dati, rimane NP-completo. Il problema è
invece polinomiale se i pesi sono positivi oppure se il grafo è
aciclico.
33
Algoritmi e Strutture di Dati II
Cammino di costo superiore ad una soglia
Istanza: Un grafo G con pesi interi, due nodi s e t di G, e un
intero k.
Domanda: Esiste un cammino semplice da s a t in G di costo
maggiore o uguale a k?
Commento: Il corrispondente problema di ottimizzazione
(cammino di costo massimo), rimane NP-completo. Rimane
NP-completo anche se i pesi sono positivi. Il problema è invece
polinomiale se il grafo è aciclico.
34
Algoritmi e Strutture di Dati II
Cammino di lunghezza superiore ad una soglia
Istanza: Un grafo G con pesi interi, due nodi s e t di G, e un
intero k.
Domanda: Esiste un cammino semplice da s a t in G di lunghezza
maggiore o uguale a k?
Commento: Il corrispondente problema di ottimizzazione
(cammino di lunghezza massima) rimane NP-completo. Il problema
è invece polinomiale se il grafo è aciclico. Il problema del cammino
di lunghezza minima è invece polinomiale.
35
Algoritmi e Strutture di Dati II
Dal problema alla soluzione
1. studiare le proprietà del problema;
2. capire se il problema è decidibile;
3. classificare il problema in una classe di complessità;
4. scegliere le strutture per rappresentare i dati del problema;
5. scrivere un algoritmo che risolve il problema;
6. calcolare la complessità dell’algoritmo;
7. verificare la correttezza dell’algoritmo;
8. implementare l’algoritmo in un linguaggio di
programmazione;
9. confrontare empiricamente la performance del programma
scritto con quella di altri programmi per lo stesso problema.
36