La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "Algoritmi golosi Tecniche di soluzione dei problemi viste finora: Metodo iterativo Divide et impera Programmazione dinamica Nuova tecnica: Algoritmi golosi."— Transcript della presentazione:

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

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

3 Problema Sottoproblemi Sottosottoproblemi Sottoproblemi semplici Divide et impera Soluzioni

4 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.) Soluzioni possibili Ottime

5 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.

6 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.

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

8 Problema Sottoproblemi Sottosottoproblemi Sottoproblemi semplici Sottoproblemi ripetuti Soluzioni Sottoproblema ripetuto

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

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

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

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

13 Problema della scelta delle attività Ogni attività a i ha un tempo di inizio s i ed un tempo di fine f i con s i < f i. n attività a 1,...,a n usano la stessa risorsa (es: lezioni da tenere in una stessa aula). a i occupa la risorsa nell’intervallo di tempo [s i, f i ). a i ed a j sono compatibili se [s i, f i ) ed [s j, f j ) sono disgiunti. Problema: scegliere il massimo numero di attività compatibili.

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

15 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 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

16 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

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

18 Scelgo il divertimento “D” che termina per primo!! Così quando ho finito mi rimane più tempo per gli altri. Bene Pinocchio!! In questo modo prendi sicuramente il massimo numero di divertimenti ed io posso dimostrarlo. Mumble…, per dimostrarlo debbo provare che la scelta di quel monello non lo conduce in un vicolo cieco. 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. Io conosco una soluzione ottima ma non la mostro a nessuno. So che la fatina conosce una soluzione ottima. Insegnerò alla fatina come modificare la sua soluzione ottima in modo che contenga il divertimento “D”.

19 Io conosco una soluzione ottima ma non la mostro a nessuno. Mumble… se la soluzione della fatina contiene già “D” non ci sono problemi. Io conosco una soluzione ottima che contiene “D”. Cara fatina, se la tua soluzione contiene il divertimento “D” lasciala invariata. 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”. Primo caso:

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

21 D1D1 D2D2 DmDm ………………….. D2D2 DmDm D

22 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”.

23 Ho finito tutti i divertimenti scelti finora. Ora scelgo il divertimento “D” che termina per primo tra quelli non ancora iniziati. 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 tutti i divertimenti scelti finora da Pinocchio. Insegnerò alla fatina come modificare la sua soluzione ottima in modo che contenga anche “D”.

24 Ho finito tutti i divertimenti scelti finora ed ora ho scelto quel divertimento “D” che terminerà per primo tra quelli non ancora iniziati. Io conosco una soluzione ottima che contiene tutti i divertimenti scelti finora da Pinocchio. Io conosco una soluzione ottima che contiene i divertimenti scelti finora compreso il divertimento “D”. 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. Primo caso:

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

26 DD1D1 DkDk DmDm ….. D k+2 D1D1 DkDk DmDm ….. D k+1 ….. D k+2 ora attuale

27 Io conosco una nuova soluzione ottima che contiene i divertimenti scelti finora da Pinocchio compreso “D”. So che la fatina conosce una soluzione ottima che contiene tutti 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.

28 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. Mumble… la soluzione ottima della fatina contiene tutti i divertimenti scelti finora e non ci sono altri divertimenti compatibili. Quindi la soluzione ottima della fatina non contiene altri divertimenti e quelli scelti finora da Pinocchio sono una soluzione ottima.

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

30 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

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

32 1 4 isifiisifi tempo a1a1 a2a2 a3a3 a4a4 a5a5 a6a6 a7a7 a8a8 a9a9 a 10 a 11 a1a1 a2a2 a3a3 a4a4 a5a5 a6a6 a7a7 a8a8 a9a9 a 10 a f[k]f[k] ActivitySelector(a, s, f, n) A = {a 1 }, k = 1 for m = 2 to n if s[m] ≥ f[k] A = A ⋃ {a m }, k = m return A

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

34 1 4 isifiisifi tempo a1a1 a2a2 a3a3 a4a4 a5a5 a6a6 a7a7 a8a8 a9a9 a 10 a

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

36 L’algoritmo comincia con scegliere la prima attività a 1 (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 a 1 ?

37 La risposta è affermativa. Sia b 1,...,b j una qualsiasi soluzione ottima (ne esiste certamente almeno una) che supponiamo ordinata per tempo di fine b1b1 b2b2 bjbj ………………….. a1a1 b2b2 bjbj a1a1

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

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

40 La risposta è ancora affermativa. Assumiamo che esista una soluzione ottima b 1,...,b i,b i+1,...,b j che estende le attività b 1,...,b i finora scelte e supponiamo b 1,...,b i e b i+1,...,b j ordinate per tempo di fine amam b1b1 bibi bjbj ….. b i+2 amam b1b1 bibi bjbj ….. b i+1 ….. b i+2 f[k]f[k]

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

42 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à.

43 Esercizio 1. Problema dello “zaino” frazionario: Dati n tipi di merce M 1,…,M n in quantità rispettive q 1,…,q n e con costi unitari c 1,…,c n 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) // c 1 ≥ c 2 ≥... ≥ c n 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

44 Esercizio 2. Problema dello “zaino” 0-1: Sono dati n tipi di oggetti O 1,…,O n in numero illimitato. Un oggetto di tipo O i occupa un volume v i e costa c i. 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) // c 1 /v 1 ≥ c 2 /v 2 ≥... ≥ c n /v n Spazio = Q for i = 1 to n z[i] =  Spazio/v[i]  Spazio = Spazio – z[i]v[i] return z

45 Esercizio 3 Siano a 1,...,a n attività didattiche aventi tempi di inizio s 1,...,s n e tempi di fine f 1,...,f n 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.

46 Esercizio 4 Siano a 1,...,a n attività didattiche aventi tempi di inizio s 1,...,s n e tempi di fine f 1,...,f n e abbiamo a disposizione m aule A 1,..., A m Trovare un algoritmo goloso per programmare il massimo numero di attività nelle m aule.


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

Presentazioni simili


Annunci Google