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