Algoritmi golosi Tecniche di soluzione dei problemi viste finora:

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

Algoritmi e Strutture Dati 2
Programmazione dinamica: problema della sottosequenza più lunga
                      Insertion-Sort
Analisi delle Decisioni Funzioni di utilita’ e lotterie
Programmazione dinamica
Master Bioinformatica 2002: Progetto di Algoritmi1 Programmazione Dinamica (PD) Altra tecnica per risolvere problemi di ottimizzazione, piu generale degli.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Iterazione enumerativa (for)
Elementi di Matematica
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmo di Ford-Fulkerson
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Trovare il percorso minimo da b ad ogni altro vertice
Algoritmi e Strutture Dati
Ingegneria della conoscenza e sistemi esperti Dario Bianchi, 1999 Risoluzione di problemi e ricerca.
Intelligenza Artificiale
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
Metodo della moltiplicazione
Elementi di Informatica di base
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
La Cesta e l'acqua Som/enter.
Strutture dati per insiemi disgiunti
Radix-Sort(A,d) // A[i] = cd...c2c1
Algoritmi e Strutture Dati
Lezione 6 Strutture di controllo Il condizionale
Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati: Programmazione dinamica Algoritmi golosi Analisi ammortizzata Vedremo poi.
Passo 3: calcolo del costo minimo
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
Terzo passo: lunghezza di una LCS LCS-Length(X, Y, m, n) for i = 0 to m c[i, 0] = 0 for j = 1 to n c[0, j] = 0 for j = 1 to n for i = 1 to m if x i ==
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Array (ordinamento) CORDA – Informatica A. Ferrari.
Valutare la difficoltà dei problemi
Implementazione di dizionari Problema del dizionario dinamico Scegliere una struttura dati in cui memorizzare dei record con un campo key e alcuni altri.
Allievi Elettrici - AA Le funzioni ricorsive in C
Risoluzione delle collisioni con indirizzamento aperto Con la tecnica di indirizzamento aperto tutti gli elementi stanno nella tavola. La funzione hash.
TECNICA DIVIDE ET IMPERA
Ordinamento in tempo lineare Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna.
Capitolo 13 Cammini minimi: Algoritmo di Floyd e Warshall Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 07/04/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
1 Ordinamento (Sorting) INPUT: Sequenza di n numeri OUTPUT: Permutazione π = tale che a 1 ’  a 2 ’  … …  a n ’ Continuiamo a discutere il problema dell’ordinamento:
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
1 Ordinamento (Sorting) Input: Sequenza di n numeri Output: Permutazione π = tale che: a i 1  a i 2  ……  a i n Continuiamo a discutere il problema dell’ordinamento:
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Programmazione dinamica Algoritmi golosi Analisi ammortizzata
Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.
Complessità Computazionale
Algoritmi e Strutture Dati (Mod. B) Algoritmi Greedy (parte III)
Algoritmi e Strutture Dati
Divide et Impera Parte 11 - Risoluzione di problemi per divisione in sottoproblemi “bilanciati” Corso A: Prof. Stefano Berardi
Algoritmi e Strutture Dati Luciano Gualà
La scrittura decimale Quando un numero è scritto in forma decimale, vi è un numero finito di cifre dopo la virgola. Ma sappiamo che ci sono divisioni “che.
Transcript della presentazione:

Algoritmi golosi Tecniche di soluzione dei problemi viste finora: Metodo iterativo Divide et impera Programmazione dinamica Nuova tecnica: Algoritmi golosi

Metodo iterativo Soluzione del problema di dimensione i Soluzione del problema di dimensione n Soluzione del problema di dimensione i-1

Divide et impera Problema Soluzioni Sottoproblemi Soluzioni Sottosottoproblemi Soluzioni Soluzioni Sottoproblemi semplici

In un problema di ottimizzazione abbiamo un insieme generalmente molto grande di soluzioni e dobbiamo scegliere tra di esse una soluzione che sia ottima in qualche senso (costo minimo, valore massimo, lunghezza minima, ecc.) Ottime Soluzioni possibili

Possiamo risolvere un problema di questo tipo con una enumerazione esaustiva - si generano tutte le soluzioni possibili, - si calcola il costo di ciascuna di esse - e infine se ne seleziona una di ottima. Purtroppo l’insieme di soluzioni è generalmente molto grande (spesso esponenziale nella dimensione dell’input) per cui una enumerazione esaustiva richiede tempo esponenziale.

Esempio: Problema Torino-Trieste. Molto spesso le soluzioni di un problema di ottimizzazione si possono costruire estendendo o combinando tra loro soluzioni di sottoproblemi. Problema Sottoproblemi Soluzioni Esempio: Problema Torino-Trieste. Sottoproblemi: Torino-Asti, Asti-Trieste; Torino-Novara, Novara-Trieste, ecc.

Abbiamo visto che perché la programmazione dinamica sia vantaggiosa rispetto all’enumerazione esaustiva bisogna che siano soddisfatte due condizioni: Esistenza di sottoproblemi ripetuti. Sottostruttura ottima.

Sottoproblemi ripetuti Problema Soluzioni Sottoproblemi Soluzioni Sottosottoproblemi Soluzioni Sottoproblema ripetuto Soluzioni Sottoproblemi semplici

Sottostruttura ottima Combinazioni di soluzioni ottime dei sottoproblemi Ott Problema Ott Soluzioni Soluzioni ottime Sottoproblemi Soluzioni ottime Ott Sottosottoproblemi Soluzioni ottime Soluzioni ottime Sottoproblemi semplici

Programmazione dinamica Sottoproblemi ripetuti Ott Soluzioni Problema Sottoproblemi Ott Ott Ott Sottosottoproblemi Ott Ott Ott Ott Ott Ott Ott Sottoproblemi semplici

Algoritmi golosi Scelta golosa Problema Soluzioni Sottoproblemi Sottosottoproblemi Ott Ott Ott Ott Ott Ott Ott Sottoproblemi semplici

ogni volta si fa la scelta che sembra migliore localmente. in questo modo per alcuni problemi si ottiene una soluzione globalmente ottima.

Problema della scelta delle attività n attività a1,...,an usano la stessa risorsa (es: lezioni da tenere in una stessa aula). Ogni attività ai ha un tempo di inizio si ed un tempo di fine fi con si < fi . ai occupa la risorsa nell’intervallo di tempo [si, fi). ai ed aj sono compatibili se [si, fi) ed [sj, fj) sono disgiunti. Problema: scegliere il massimo numero di attività compatibili.

Storiella Golosa Personaggi: L’algoritmo goloso Pinocchio Il grillo parlante Controlla Pinocchio La fata turchina Conosce il futuro

Voglio scegliere il maggior numero possibile di divertimenti. Pinocchio arriva nella Città dei Balocchi e può scegliere i divertimenti che preferisce Ogni divertimento ha un’orario di inizio ed una durata Voglio scegliere il maggior numero possibile di divertimenti. Perciò comincio scegliendo il divertimento che inizia per primo!! Così non perdo tempo. Attenzione Pinocchio!!! Se fai così non è detto che tu possa scegliere il maggior numero di divertimenti

Allora scelgo il divertimento che dura di meno!! Così mi rimane più tempo per gli altri. Attenzione Pinocchio!!! Anche così non è detto che tu possa scegliere il maggior numero di divertimenti

Uffa!! Ma sei proprio un rompiscatole!! Allora scelgo il divertimento che non si sovrappone a troppi altri!! Così me ne rimangono di più tra cui scegliere. Uffa!! Ma sei proprio un rompiscatole!! Ora riprovo e se non ti va ancora bene ti schiaccio con il martello. Attenzione Pinocchio!!! Anche così non è detto che tu possa scegliere il maggior numero di divertimenti

Io conosco una soluzione ottima ma non la mostro a nessuno. Scelgo il divertimento “D” che termina per primo!! Così quando ho finito mi rimane più tempo per gli altri. Insegnerò alla fatina come modificare la sua soluzione ottima in modo che contenga il divertimento “D”. So che la fatina conosce una soluzione ottima. Ossia deve esistere una soluzione ottima a cui Pinocchio può arrivare dopo aver fatto la scelta (la proprietà della scelta golosa). Ma per questo dovrei conoscere il futuro. Qui mi serve l’aiuto della fatina. Mumble…, per dimostrarlo debbo provare che la scelta di quel monello non lo conduce in un vicolo cieco. Bene Pinocchio!! In questo modo prendi sicuramente il massimo numero di divertimenti ed io posso dimostrarlo.

Io conosco una soluzione ottima ma non la mostro a nessuno. Io conosco una soluzione ottima che contiene “D”. Ho scelto il divertimento “D” che termina per primo!! Così quando ho finito mi rimane più tempo per gli altri. Primo caso: Ora so che la fatina conosce una soluzione ottima che contiene il divertimento “D”. Cara fatina, se la tua soluzione contiene il divertimento “D” lasciala invariata. Mumble… se la soluzione della fatina contiene già “D” non ci sono problemi.

Io conosco una soluzione ottima ma non la mostro a nessuno. Ho scelto il divertimento “D” che termina per primo!! Così quando ho finito mi rimane più tempo per gli altri. Secondo caso: Cara fatina, se la tua soluzione non contiene il divertimento “D” metti “D” al posto del primo divertimento. Mumble…. il primo divertimento nella soluzione della fatina termina dopo “D” e quindi “D” è compatibile con i successivi Mumble…. se la soluzione della fatina non contiene “D” devo dirgli di mettere “D” al posto di un altro divertimento.

D1 D2 ………………….. Dm D2 Dm ………………….. D

Io conosco una nuova soluzione ottima che contiene “D”. Ho scelto il divertimento “D” che termina per primo!! Così quando ho finito mi rimane più tempo per gli altri. Ora so che la fatina conosce una soluzione ottima che contiene il divertimento “D”.

Io conosco una soluzione ottima che contiene tutti i divertimenti scelti finora da Pinocchio. Ho finito tutti i divertimenti scelti finora. Ora scelgo il divertimento “D” che termina per primo tra quelli non ancora iniziati. Insegnerò alla fatina come modificare la sua soluzione ottima in modo che contenga anche “D”. Mumble… devo mostrare che esiste una soluzione ottima che contiene sia “D” che tutti i divertimenti scelti prima.

Io conosco una soluzione ottima che contiene i divertimenti scelti finora compreso il divertimento “D”. Io conosco una soluzione ottima che contiene tutti i divertimenti scelti finora da Pinocchio. Ho finito tutti i divertimenti scelti finora ed ora ho scelto quel divertimento “D” che terminerà per primo tra quelli non ancora iniziati. Primo caso: Mumble… se la soluzione della fatina contiene il divertimento “D” non ci sono problemi. Cara fatina, se la tua soluzione contiene il divertimento “D” lasciala invariata.

Io conosco una soluzione ottima che contiene tutti i divertimenti scelti finora da Pinocchio. Ho finito tutti i divertimenti scelti finora ed ora ho scelto quel divertimento “D” che terminerà per primo tra quelli non ancora iniziati. Secondo caso: Cara fatina, se la tua soluzione non contiene il divertimento “D” mettilo al posto del primo divertimento che nella tua soluzione segue quelli già scelti da Pinocchio. Non posso neppure metterlo al posto di uno già iniziato perché questi sono incompatibili con quelli scelti prima. Non posso certo metterlo al posto di uno di quelli scelti prima e che so essere tutti contenuti nella soluzione della fatina. Mumble… se la soluzione della fatina non contiene “D” devo metterlo al posto di un altro. Mumble… Il primo che nella soluzione della fatina segue quelli già scelti deve terminare dopo “D”. Quindi tutti gli altri sono compatibili con “D”.

ora attuale D1 ….. Dk Dk+1 Dk+2 ….. Dm D D1 Dk Dm ….. Dk+2

Io conosco una nuova soluzione ottima che contiene i divertimenti scelti finora da Pinocchio compreso “D”. Ho finito tutti i divertimenti scelti finora ed ora ho scelto quel divertimento “D” che terminerà per primo tra quelli non ancora iniziati. So che la fatina conosce una soluzione ottima che contiene tutti i divertimenti scelti finora da Pinocchio compreso “D”.

Io conosco una soluzione ottima che contiene tutti i divertimenti scelti finora da Pinocchio. Ho finito tutti i divertimenti scelti finora ma tutti gli altri sono già iniziati. Quindi la soluzione ottima della fatina non contiene altri divertimenti e quelli scelti finora da Pinocchio sono una soluzione ottima. Mumble… la soluzione ottima della fatina contiene tutti i divertimenti scelti finora e non ci sono altri divertimenti compatibili.

Strategie golose: Scegliere l’attività che inizia per prima Non funziona Scegliere l’attività che dura meno tempo Non funziona Scegliere l’attività incompatibile con il minor numero di altre attività Non funziona

Strategia che funziona: Scegliere l’attività che termina per prima. ActivitySelector(Att) AttScelte = Ø, AttComp = Att while AttComp ≠ Ø “ in AttComp scegli l’attività ‘a’ che termina per prima, aggiungi ‘a’ a AttScelte e togli da AttComp tutte le attività incompatibili con ‘a’ ” return AttScelte

Altrimenti possiamo ordinarle in tempo O(n log n) Per implementarla supponiamo le attività a1,...,an ordinate per tempo di fine non decrescente f1 ≤ ... ≤ fn Altrimenti possiamo ordinarle in tempo O(n log n) ActivitySelector(a, s, f, n) // f1 ≤ ... ≤ fn A = {a1}, k = 1 for m = 2 to n if s[m] ≥ f[k] A = A ⋃ {am}, k = m return A

f[k] tempo ActivitySelector(a, s, f, n) A = {a1}, k = 1 for m = 2 to n si fi 1 4 2 5 3 1 6 4 5 7 5 3 8 6 5 9 7 6 10 8 11 9 8 12 10 2 13 11 12 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 a2 a2 a1 a1 a3 a3 f[k] a10 a10 a5 a5 a4 a4 a6 a6 a7 a7 a8 a8 a9 a9 ActivitySelector(a, s, f, n) A = {a1}, k = 1 for m = 2 to n if s[m] ≥ f[k] A = A ⋃ {am}, k = m return A a11 a11 tempo

La soluzione trovata contiene quattro attività Due domande: La soluzione trovata con l’algoritmo goloso è l’unica possibile che contiene quattro attività? La soluzione trovata con l’algoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?

i si fi 1 4 2 5 3 1 6 4 5 7 5 3 8 6 5 9 7 6 10 8 11 9 8 12 10 2 13 11 12 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 a2 a1 a3 a10 a5 a4 a6 a7 a8 a9 a11 tempo

Cerchiamo di rispondere alla seconda domanda La soluzione trovata con l’algoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività? ActivitySelector(a, s, f, n) // f1 ≤ ... ≤ fn A = {a1}, k = 1 for m = 2 to n if s[m] ≥ f[k] A = A ⋃ {am}, k = m return A

L’algoritmo comincia con scegliere la prima attività a1 (quella con tempo di fine minimo) Siamo sicuri che questa scelta non possa compromettere il risultato? In altre parole: esiste sempre una soluzione ottima che contiene a1?

La risposta è affermativa. Sia b1,...,bj una qualsiasi soluzione ottima (ne esiste certamente almeno una) che supponiamo ordinata per tempo di fine b1 b2 ………………….. bj b2 bj ………………….. a1 a1

k viene posto ad 1 ed aggiornato ad m ogni volta che si sceglie una nuova attività am ActivitySelector(a, s, f, n) // f1 ≤ ... ≤ fn A = {a1}, k = 1 for m = 2 to n if s[m] ≥ f[k] A = A ⋃ {am}, k = m return A Siccome le attività sono ordinate per tempo di fine non decrescente, f[k] è il massimo tempo finale delle attività selezionate precedentemente.

Siamo sicuri che questa scelta non comprometta il risultato? Con il test: if s[m] ≥ f[k] A = A ⋃ {am}, k = m l’algoritmo seleziona la prima attività am il cui tempo di inizio s[m] è maggiore o uguale di f[k] Siamo sicuri che questa scelta non comprometta il risultato? In altre parole: esiste sempre una soluzione ottima che contiene am e le attività finora scelte?

La risposta è ancora affermativa. Assumiamo che esista una soluzione ottima b1,...,bi,bi+1,...,bj che estende le attività b1,...,bi finora scelte e supponiamo b1,...,bi e bi+1,...,bj ordinate per tempo di fine b1 bi bj ….. bi+1 bi+2 f[k] b1 bi bj ….. bi+2 am am

Sappiamo quindi che durante tutta l’esecuzione dell’algoritmo esiste sempre una soluzione ottima contenente le attività b1,...,bi scelte fino a quel momento Quando l’algoritmo termina non ci sono altre attività compatibili con b1,...,bi e quindi le attività b1,...,bi sono una soluzione ottima

L’algoritmo è goloso perchè ad ogni passo, tra tutte le attività compatibili con quelle già scelte, sceglie quella che termina prima. Questa scelta è localmente ottima (golosa) perché è quella che lascia più tempo a disposizione per le successive attività.

Esercizio 1. Problema dello “zaino” frazionario: Dati n tipi di merce M1,…,Mn in quantità rispettive q1,…,qn e con costi unitari c1,…,cn si vuole riempire uno zaino di capacità Q in modo che il contenuto abbia costo massimo. Mostrare che il seguente algoritmo risolve il problema: RiempiZaino(q, c, n, Q) // c1 ≥ c2 ≥ ... ≥ cn Spazio = Q for i = 1 to n if Spazio ≥ q[i] z[i] = q[i], Spazio = Spazio – z[i] else z[i] = Spazio, Spazio = 0 return z

Esercizio 2. Problema dello “zaino” 0-1: Sono dati n tipi di oggetti O1,…,On in numero illimitato. Un oggetto di tipo Oi occupa un volume vi e costa ci. Si vuole riempire uno zaino di capacità Q in modo che il contenuto abbia costo massimo. Mostrare che il seguente algoritmo non risolve il problema. RiempiZaino(v, c, n, Q) // c1/v1 ≥ c2/v2 ≥ ... ≥ cn /vn Spazio = Q for i = 1 to n z[i] = Spazio/v[i]  Spazio = Spazio – z[i]v[i] return z

Esercizio 3 Siano a1,...,an attività didattiche aventi tempi di inizio s1,...,sn e tempi di fine f1,...,fn e supponiamo di avere un insieme sufficiente di aule in cui svolgerle. Trovare un algoritmo per programmare tutte le attività usando il minimo numero possibile di aule.

Esercizio 4 Siano a1,...,an attività didattiche aventi tempi di inizio s1,...,sn e tempi di fine f1,...,fn e abbiamo a disposizione m aule A1,..., Am Trovare un algoritmo goloso per programmare il massimo numero di attività nelle m aule.