430 likes | 587 Views
Teoria degli algoritmi e della computabilità Terza giornata : Ricerca e ordinamento ottimi. P vs NP , algoritmi di approssimazione, e il potere della randomizzazione. Guido Proietti Email: guido.proietti@univaq.it URL: www.di.univaq.it/~proietti/index_personal .
E N D
Teoriadeglialgoritmi e dellacomputabilitàTerza giornata: Ricerca e ordinamento ottimi. P vs NP, algoritmi di approssimazione, e il potere della randomizzazione Guido Proietti Email: guido.proietti@univaq.it URL: www.di.univaq.it/~proietti/index_personal
Tbest(n) = 1 x è in prima posizione Tworst(n) = n xL oppure è in ultima posizione Correzione esercizio: Il problema della ricerca Un primo algoritmo è quello di ricerca sequenziale (o esaustiva), che gestisce l’insieme di numeri come una lista L non ordinata Contiamo il numero di confronti (operazione dominante):
Algoritmo di ricerca binaria Se ipotizzassimo che la sequenza di numeri fosse un array L ordinato, potremmo progettare un algoritmo più efficiente: Confronta x con l’elemento centrale di L e prosegue nella metà sinistra o destra in base all’esito del confronto
Esempi su un array di 9 elementi Cerca 2 Cerca 1 Cerca 9 Cerca 3 3<4 quindi a e b si invertono
Analisi dell’algoritmo di ricerca binaria Contiamo i confronti eseguiti nell’istruzione 3 (operazione dominante): Tbest(n) = 1 l’elemento centrale è uguale a x Tworst(n) = Θ(log n)xL Infatti, poiché la dimensione del sotto-array su cui si procede si dimezza dopo ogni confronto, dopo l’i-esimo confronto il sottoarray di interesse ha dimensione n/2i. Quindi, dopo i=logn +1 confronti, si arriva ad avere a>b.
Un algoritmo di ordinamento ottimo: il MergeSort (John von Neumann, 1945) • Problema dell’ordinamento: • Lower bound - (n log n) albero di decisione • Upper bound – O(n2) IS,SS • Proviamo a costruire un algoritmo ottimo, usando la tecnica del divide et impera: • Divide: dividi l’array a metà • Risolvi il sottoproblema ricorsivamente • Impera: fondi le due sottosequenze ordinate
Esempio di esecuzione Input ed output delle chiamate ricorsive
Fusione di sequenze ordinate (passo di impera) • Due array ordinati A e B possono essere fusi rapidamente: • estrai ripetutamente il minimo di A eB e copialo nell’array di output, finché A oppure B non diventa vuoto • copia gli elementi dell’array non ancora completamente svuotato alla fine dell’array di output Notazione: dato un array A e due indici x y, denotiamo con A[x;y] la porzione di A costituita da A[x], A[x+1],…,A[y]
Algoritmo di fusione di sequenze ordinate • Merge (A, i1, f1, f2) • Sia X un array ausiliario di lunghezza f2-i1+1 • i=1 • i2=f1+1 • while (i1 f1 e i2 f2) do • if (A[i1] A[i2]) • then X[i]=A[i1] • incrementa i e i1 • else X[i]=A[i2] • incrementa i e i2 • if (i1<f1) then copia A[i1;f1] alla fine di X • else copia A[i2;f2] alla fine di X • copia X in A[i1;f2] fonde A[i1;f1] e A[f1+1;f2] output in A[i1;f2] Osservazione:usa l’array ausiliario X
Costo dell’algoritmo di merge Lemma La procedure Merge fonde due sequenze ordinate di lunghezza n1 e n2 eseguendo al più n1+ n2 -1 confronti Dim: Ogni confronto “consuma” un elemento di A. Nel caso peggiore tutti gli elementi tranne l’ultimo sono aggiunti alla sequenza X tramite un confronto. Il numero totale di elementi è n1+ n2. Quindi il numero totale di confronti è n1+ n2 -1. QED Numero di confronti: C(n=n1+ n2)=O(n1+ n2)=O(n) (si noti che vale ancheC(n)=Ω(min{n1,n2})) Numero di operazioni (confronti + copie)? T(n)=(n1+ n2)
MergeSort • MergeSort (A, i, f) • if (i f) thenreturn • m = (i+f)/2 • MergeSort(A,i,m) • MergeSort(A,m+1,f) • Merge(A,i,m,f) Ovviamente la chiamata principale è Mergesort(A,1,n)
Complessità del MergeSort Si vede facilmente che il tempo di esecuzione di MergeSort è: T(n) = 2 T(n/2) + Θ(n) con T(1)=1, da cui: T(n)=2(2T(n/22)+Θ(n/2))+Θ(n)= =2(2(2T(n/23)+Θ(n/22))+Θ(n/2))+Θ(n)=… e per k = log2n si ha n/2k = 1 e quindi T(n)=2(2(…(2T(n/2k)+Θ(1))+…+Θ(n/22))+Θ(n/2))+Θ(n) = 2log n·Θ(1)+2logn-1·Θ(2)+2logn-2·Θ(22)+…+ 20·Θ(n) = n∙Θ(1)+n/2∙Θ(2)+n/4∙Θ(4)+…+1∙Θ(n) =Θ(n logn)
Più precisamente… Nelcasopeggiore, il MS esegue(n ⌈log n⌉ - 2⌈log n⌉ + 1) confronti, che corrisponde ad un numero compreso tra (n log n - n + 1) e (n log n + n + O(log n)) Nelcasomedio, il MS esegue(n ⌈log n⌉ - 2⌈log n⌉ + 1) – 0.2645·nconfronti Nelcasomigliore(array giàordinato), il MS eseguen-1confronti; puòessereottenutofacendoun controllopreliminarenellaprocedura di Mergetraultimo elementodella prima sequenza e primo dellaseconda
Osservazioni finali • Il MergeSort è un algoritmo (asintoticamente) ottimo rispetto al numero di confronti eseguiti nel caso peggiore • Il MergeSort non ordina in loco, e utilizza memoria ausiliaria (l’occupazione di memoria finale è pari a 2n)
Richiamo: gerarchia delle classi Decidibili ExpTime (ARRESTO(k)) P (ricerca) NP NP-completi (SAT)
Richiamo: inclusioni proprie? • Abbiamo visto che: P ⊑NP ⊑ExpTime, con P ≠ExpTime • In NP c’è una classe molto speciale ed importante di problemi che sicuramente non apparterrebbero a P se fosse NP≠P: i problemi NP-completi • Per i problemi in P, che possono essere risolti in tempo polinomiale su una RAM, il compito principale dell’algoritmista è progettare algoritmi efficienti, possibilmenteottimi • Anche per i problemi in NP vorremmo progettare algoritmi efficienti, ma c’è un piccolo dettaglio: si congettura (in realtà, si crede fortissimamente) che i problemi NP-completi non ammettano algoritmi risolutivi polinomiali! • Che fare allora?
24 marzo 2000, Collège de France, Parigi problemi del millennio • Congettura di Hodge • Congettura di Poincaré • Ipotesi di Riemann • Teoria quantistica di Yang-Mills • Equazioni di Navier-Stokes • P vs NP • Congettura di Birche Swinnerton-Dyerasd risolto Fondazione Clay mette in palio 7 premida un milionedidollaril’uno per la soluzionediquellichesonoconsideratiiproblemimatematicipiùimportanti del nuovomillennio
P vs NP: unaformulazionedall’aspettoinnocuo ilproblema del commessoviaggiatore: (TSP, datravelling salesman problem) date ncittà e, per ognicoppiadicittài, j, la distanzafrai e j trovare un tour (un camminociclico) dilunghezza minimachepassa per tutte le città • Si noti come tale problema ricada tra quelli di ottimizzazione – Richiedono di restituire la soluzione migliore (rispetto ad un prefissato criterio) tra tutte quelle possibili. Ad esempio trovare il cammino di lunghezza minima fra due nodi di un grafo unadomandada$ 1.000.000: esiste un algoritmopolinomialecherisolveil TSP? unadomandada$ 0,01: esiste un algoritmocherisolveil TSP?
P vs NP: unaformulazionedall’aspettoinnocuo un semplicealgoritmo per ilTSP: enumeratuttiipossibili tour fra le ncittà, misurando la lunghezzadiciascunodiessi e memorizzandoquellopiùbreve via viaosservato è un algoritmoefficiente? quanti tour possibilicisono con ncittà? #tour: (n -1)(n -2)(n -3)… 3 2 1=(n -1)! Ad esempio, 52! fattoriale è: 80.658.175.170.943.878.571.660.636.856.403.766.975.289.505.440.883.277.824.000.000.000.000 in milionesimidisecondo è almeno 5000 miliardidi volte piùdell’etàdell’universo!!! EffettivamentesipuòdimostrarecheTSP è NP-hard, ovvero la suaversionedecisionale è NP-completa, e quindisicongettura la non esistenza di algoritmirisolutivipolinomiali
Efficiente Polinomiale? Di certo, un algoritmoesponenzialecome quelloproposto per ilTSP è inefficiente. Ma un algoritmopolinomialeè sempreefficiente? Ed unoesponenzialeè sempreinefficiente? puòessereconsideratoefficienteun algoritmo (polinomiale) che ha complessità(n100)? …no! puòessereconsideratoinefficienteun algoritmo (non polinomiale) che ha complessità(n1+0.0001 log n)? …no! …ma nellapratica la distinzionefunziona! problemi per iqualiesistonoalgoritmipolinomialitendono ad averepolinomi “ragionevoli” problemi per iquali non siconosconoalgoritmipolinomialitendono a esseredavverodifficili in pratica
Crescitapolinomialevscrescitaesponenziale In effetti, la differenzafracomplessitàpolinomiale e non polinomiale è davveroenorme Tempi diesecuzionedidifferentialgorimi per istanzedidimensionecrescentesu un processorechesaeseguireun milionediistruzionidi alto livelloal secondo. L’indicazionevery longindicacheil tempo dicalcolosupera 1025anni.
Premessa: i grafi Nel 1736, il matematico Eulero, affrontò l’annoso problema dei 7 ponti di Königsberg (Prussia): È possibile o meno fare una passeggiata che parta da un qualsiasi punto della città e percorra una ed una sola volta ciascuno dei 7 ponti?
La modellizzazione di Eulero Eulero affrontò il problema schematizzando topologicamente la pianta della città, epurando così l’istanza da insignificanti dettagli topografici: A A D B D B C C …e così Königsberg venne rappresentata con un insieme di 4 punti (uno per ciascuna zona della città), opportunamente uniti da 7 linee (una per ciascun ponte)
Definizione di grafo Un grafo G=(V,E) consiste in: - un insieme V={v1,…, vn} di vertici (o nodi); - un insieme E={(vi,vj) | vi,vjV} di coppie (non ordinate) di vertici, detti archi. A Esempio: Grafo di Eulero associato alla città di Königsberg: V={A,B,C,D}, E={(A,B), (A,B), (A,D), (B,C), (B,C), (B,D), (C,D)} D B C Nota: È piùpropriamentedettomultigrafo, in quantocontienearchiparalleli.
Torniamo al problemadei 7 ponti… • Definizione: Un grafo G=(V,E) si dice percorribile (oggi si direbbe Euleriano) se e solo se contiene un cammino (non semplice, in generale) che passa una ed una sola volta su ciascun arco in E. • Teorema di Eulero: Un grafo G=(V,E) è percorribile se e solo se è connesso ed ha tuttii nodi di grado pari, oppure se ha esattamente due nodi di grado dispari. • NOTA: Un grafo con tutti i nodi di grado pari può essere percorso partendo da un qualsiasi nodo (e terminando quindi su di esso). Invece, per percorrere un grafo avente due nodi di grado dispari e tutti gli altri di grado pari, è necessario partire da uno qualsiasi dei due nodi di grado dispari, e terminare il percorso sull’altro nodo di grado dispari.
Soluzione al problemadei 7 ponti Il problemadei 7 pontinon ammettesoluzione, in quanto i 4 nodihannotuttigradodispari, e quindiilgrafo non è percorribile. La cosaimportante da notare è che la percorribilitàpuòovviamenteesserestabilitàefficientemente (addirittura in tempo linearerispettoalladimensione del grafo), semplicementeguardando al gradodeinodi del grafo!
Un problema molto importante su grafi: il cammino minimo tra due nodi 10 2 3 9 u 18 6 6 2 6 4 18 30 11 5 1 8 6 16 20 v 7 44 dato un grafo pesato G=(V,E) con pesi positivi sugli archi, e dati due nodi u e v, trovare un cammino da u a v di costo minimo (che minimizza la somma dei pesi degli archi del cammino) Esistono soluzioni efficienti per tale problema: per esempio, l’algoritmo di Dijkstrapuò essere implementato in O(m + n log n), ove m è il numero di archi e n è il numero di nodi
2-colorabilità Dato un grafoG (non diretto e non pesato) dire se è possibilecolorare i nodi di G con 2colori in modo tale che per ognicoppia di nodiadiacenti, i due nodiabbianocoloridiversi Esistono soluzioni efficienti per tale problema: basta verificare se il grafo è bipartito mediante una visita in profondità del grafo, la quale richiede tempo O(m + n)
Alcuniproblemi molto simili a cicloEuleriano, camminominimoe 2-colorabilità ma (sorprendentemente) difficili! (per i quali non siconoscenessunalgoritmopolinomiale)
Ciclo Hamiltoniano Dato un grafo non orientato G=(V,E) dire se G ammette un ciclo che passa per tutti i nodi una e una sola volta
Cammino massimo Dato un grafoG (non diretto e non pesato) e due nodis e t, trovareilcammino (semplice) piùlungofras e t s s t t
3-colorabilità Dato un grafoG (non diretto e non pesato) dire se è possibilecolorare i nodi di G con 3colori in modo tale che per ognicoppia di nodiadiacenti, i due nodiabbianocoloridiversi
Algoritmi approssimati • D. Supponiamo di dover risolvere un problema NP-hard. Cosa posso fare? • R. La Teoria dice che è improbabile trovare un algoritmo che abbia tempo polinomiale. • Dobbiamo sacrificare una delle tre caratteristiche desiderate. • Risolvere il problema all'ottimo. • Risolvere il problema in tempo polinomiale. • Risolvere istanze arbitrarie del problema. • Algoritmo di -approssimazione. • Gira in tempo polinomiale. • Risolve istanze arbitrarie del problema. • Trova soluzioni entro un rapporto dal vero ottimo. • Sfida. E' necessario dimostrare che il valore di una soluzione è vicino all'ottimo, senza nemmeno sapere quale sia il valore ottimo!
Approssimazione • Un algoritmo che restituisce una risposta C che è “vicina” alla soluzione ottima C* è detto un algoritmo di approssimazione. • La “vicinanza” solitamente è misurata dal limite del rapporto (n) che l'algoritmo produce : • Pb di Minimizzazione: C/C* ≤ (n) • Pb di Massimizzazione: C*/C ≤ (n)
Esempio: VERTEX-COVER • Istanza: un grafo non diretto G=(V,E). • Problema: trovare un insieme CV di taglia minima tale che per ogni (u,v)E, o uC oppure vC. Esempio:
Un algoritmo di 2-approssimazione • C • E’ E • whileE’ • do sia (u,v) un arco arbitrario di E’ • C C {u,v} • rimuovi da E’ ogni arco incidente a u oppure a v. • returnC.
O(m)=O(n2) O(1) O(n2) O(n) La complessità temporale è O(n3), ossia, polinomiale • C • E’ E • whileE’ do • sia (u,v) un arco arbitrario di E’ • C C {u,v} • rimuovi da E’ ogni arco incidente a u oppure a v • return C
Correttezza L’insieme di vertici che il nostro algoritmo restituisce è chiaramente un vertex-cover, dato che iteriamo fino a che ogni arco viene coperto.
nessunvertice in comune! Quanto è buona un’approssimazione? Osserviamo l’insieme di archi scelti dal nostro algoritmo ogniVC ne contiene1 in ognuno • ilnostroVC li contieneentrambi, quindi è al piùgrandeildoppiorispetto a qualsiasi VC, e in particolare del VC ottimo, cioè: • |nostro VC|/|qualsiasi VC| ≤ 2 e quindi|nostro VC|/|VC ottimo| ≤ 2 • ilfattore di approssimazione è pari a 2.
Lista tesine Il problemadell’arresto (Di Ghionno) Modelli di calcolo: macchina di Turing e RAM (Gallina) La notazioneasintotica: classi O, Ω e Θ (Gregori) Classi P, NP e ExpTime (Laconi) Selectionsort (Lops) Insertionsort (Massi) Lower bound problema dell’ordinamento (Mitrangolo) Merge sort (Palombo) Ricerca sequenziale e binaria (Terregna) Il problema del cammino minimo (Cetrullo) Algoritmi di approssimazione (Del Casale)