Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoEmilia Susanna Rubino Modificato 9 anni fa
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 i
Soluzione del problema di dimensione n Soluzione del problema di dimensione i-1
3
Divide et impera Problema Soluzioni Sottoproblemi Soluzioni
Sottosottoproblemi Soluzioni Soluzioni Sottoproblemi semplici
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.) Ottime Soluzioni possibili
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
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.
7
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.
8
Sottoproblemi ripetuti
Problema Soluzioni Sottoproblemi Soluzioni Sottosottoproblemi Soluzioni Sottoproblema ripetuto Soluzioni Sottoproblemi semplici
9
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
10
Programmazione dinamica
Sottoproblemi ripetuti Ott Soluzioni Problema Sottoproblemi Ott Ott Ott Sottosottoproblemi Ott Ott Ott Ott Ott Ott Ott Sottoproblemi semplici
11
Algoritmi golosi Scelta golosa Problema Soluzioni Sottoproblemi
Sottosottoproblemi Ott Ott Ott Ott Ott Ott Ott Sottoproblemi semplici
12
ogni volta si fa la scelta che sembra migliore localmente.
in questo modo per alcuni problemi si ottiene una soluzione globalmente ottima.
13
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.
14
Storiella Golosa Personaggi: L’algoritmo goloso Pinocchio Il grillo parlante Controlla Pinocchio La fata turchina Conosce il futuro
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 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
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
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
18
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.
19
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.
20
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.
21
D1 D2 ………………….. Dm D2 Dm ………………….. 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
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.
24
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.
25
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”.
26
ora attuale D1 ….. Dk Dk+1 Dk+2 ….. Dm D D1 Dk Dm ….. Dk+2
27
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”.
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. 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.
29
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
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
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
32
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
33
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à?
34
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
35
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
36
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?
37
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
38
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.
39
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?
40
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
41
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
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 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
44
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
45
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.
46
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.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.