Sunteți pe pagina 1din 29

Greedy

Conf. dr. Smaranda Belciug


sbelciug@inf.ucv.ro
Algoritmi Greedy
—  Plata in monezi

—  Programarea intervalelor de timp


—  Problema rucsacului

2
Plata in monezi
—  Scop. Date fiind urmatoarele monezi 1, 5, 10, 25, 100, sa se

gaseasca o metoda pentru a plati unui client o anumita suma,


folosind un numar minim de monezi.

—  Ex. 34 $

—  Algoritmul casierului. La fiecare iteratie se adauga moneda cu cea

mai mare valoare, astfel incat sa nu se depaseasca valoarea totala.

—  Ex. 2.89 $

3
Algoritmul casierului
—  La fiecare iteratie, adauga cea moneda cu cea mai mare
valoare, astfel incat sa nu se depaseasca suma totala

—  Este algoritmul casierului optim?

4
Proprietatile solutiei optime
—  Proprietate. Numarul de monezi cu valoare 1 <= 4

—  Inlocuim 5 monezi de 1 cu una de 5

—  Proprietate. Numarul de monezi de 5 <= 1

—  Proprietate. Numarul de monezi de 25 <= 3

—  Proprietate. Numarul de monezi de 5 + numarul de monezi de 10


<= 2
—  Inlocuim 3 monezi de 10 si 0 monezi de 5 cu una de 25 si una de de 5

—  Inlocuim 2 monezi de 10 si una de 5 cu una de 25

5
Analiza algoritmului casierului
—  Consideram modalitatea optima de a schimba ck<=x<ck+1: greedy ia moneda k

—  Presupunem ca orice varianta optima va lua tot moneda k


—  Daca nu, are nevoie de monezi de tipul c1, c2,..., ck pentru a aduna suma x

—  Tabelul urmator indica faptul ca nicio solutie optima poate sa realizeze acest
lucru
—  Problema se reduce la x-ck centime, care prin inductie se rezolva optim cu
algoritmul casierului In cazul in care avem alte
valori ale monezilor,
k ck algoritmul trebuie
Toate solutiile modificat
optime trebuie Valoarea
sa satisfaca maxima de
monezi
c1,..ck-1
1 1 P<= 4 -
2 5 N<=1 4
3 10 N+D<=2 4+5=9
4 25 Q<=3 20+4=24
6 5 100 No limit 75+24=99
Programarea intervalelor de timp
—  Task-ul j incepe la timpul sj si se termina la timpul fj

—  Doua task-uri sunt compatibile daca nu se suprapun

—  Scop: sa se gaseasca cea mai mare submultime de task-uri


compatibile

7
Algoritm greedy
—  Consideram task-urile intr-o ordine naturala

—  Alegem fiecare task, astfel incat sa fie compatibil cu task-urile

deja alese
—  Consideram task-urile in ordine crescatoare in functie sj

—  Consideram task-urile in ordine crescatoare in functie fj

—  Consideram task-urile in ordine crescatoare in functie fj-sj

—  Pentru fiecare task j, numaram conflictele cj. Programam in

ordine crescatoare in functie de cj

8
Algoritmul Finish-time-first

9
Analiza algoritmului
—  Sa presupunem ca algoritmul finish-time-first nu este optim

—  Demonstratie (prin contradictie)

—  Sa presupunem ca greedy nu este optim si sa vedem ce se

intampla
—  Fie i1,i2,...,ik task-urile alease de greedy

—  Fie j1,j2,...,jm task-urile dintr-o solutie optima cu i1=j1,

i2=j2,..., ir=jr, pentru cea mai mare valoare posibila a lui r

10
11
Partitionarea intervalelor
—  Cursul j incepe la ora sj si se termina la ora fj.

—  Scop: sa se gaseasca numarul minim de sali pentru a

programa toate cursurile, astfel incat sa nu se tina doua


cursuri in aceeasi sala, la aceeasi ora.
—  Ex. Acest orar foloseste 4 sali pentru 10 cursuri

12
Partitionarea intervalelor
—  Cursul j incepe la ora sj si se termina la ora fj.

—  Scop: sa se gaseasca numarul minim de sali pentru a

programa toate cursurile, astfel incat sa nu se tina doua


cursuri in aceeasi sala, la aceeasi ora.
—  Ex. Acest orar foloseste 3 sali pentru 10 cursuri

13
Algoritm greedy
—  Consideram cursurile intr-o ordine naturala

—  Punem fiecare curs intr-o sala libera (care?) sau alocam o

noua sala, daca toate sunt ocupate


—  Consideram cursurile in ordine crescatoare in functie sj

—  Consideram cursurile in ordine crescatoare in functie fj

—  Consideram cursurile in ordine crescatoare in functie fj-sj

—  Pentru fiecare curs j, numaram conflictele cj. Programam in

ordine crescatoare in functie de cj

14
Algoritm start-time-first

15
Algoritm start-time-first
—  Algoritmul start-time-first poate fi implementat in O(nlogn).
—  Stocam clasele intr-o coada de prioritati (cheia-timpul de terminare a
ultimului curs)
—  Pentru a determina daca un curs j este compatibil cu o sala,
comparam sj cu cheia minima a salilor k din coada de prioritati
—  Pentru a adauga cursul j in sala k, crestem valoarea cheii lui k cu fj

—  Numarul total de operatii din coada de prioritati este de O(n)

—  Sortarea in functie de timpul de start este de O(nlogn)

—  Implementarea aceasta alege sala k al carei curs se termina cel mai


devreme

16
Analiza algoritmului start-time-first
—  Algoritmul start-time-first nu va pune doua cursuri in aceeasi sala, in
acelasi timp
—  Algoritmul start-time-first este optim
—  Fie d numarul de sali pe care le aloca algoritmul

—  Sala d este libera pentru vroiam sa o alocam cursului j, care este incompatibil
cu restul salilor d-1
—  Toate aceste d sali se elibereaza dupa timpul sj

—  Deoarece am sortat cursurile in functie de timpul de start, toate aceste


cursuri incep mai devreme de sj
—  Deci, avem d cursuri care se suprapun la timpul sj+Ɛ

—  Observatie -> toate orarele folosesc mai mult de d sali

17
Problema rucsacului
—  Un hot intra intr-un magazin si vede urmatoarele obiecte

—  Rucsacul sau are capacitatea de 4 kg. Ce trebuie sa ia astfel incat sa-si


maximizeze profitul?

18
Problema rucsacului fractional
—  Hotul poate sa ia o parte dintr-un obiect

19
Problema rucsacului 0-1
—  Hotul poate sa ia obiectul doar intreg.

20
Solutia Greedy pentru problema
rucsacului fractional
—  Sortam obiectele descrescator in functie de cost/kg

—  Daca rucsacul are capacitate 5 kg atunci solutia este:


21
—  O(nlogn)

—  Data fiind o multime de obiecte I

—  Fie P problema selectarii obiectelor din I, cu greutatea maxima

K, astfel incat valoarea lor sa fie maxima

—  Se calculeaza pentru

—  Se sorteaza descrescator in functie de

22
—  Fie k limita curenta a greutatii. Initial k=K.

—  La fiecare iteratie alegem obiectul i din capul listei de obiecte

neselectate. Daca , selectam obiectul i, iar .

—  Daca , luam doar o fractiune f din obiectul i,

—  care cantareste exact k. Algoritmul se incheie.

—  Costul obtinut este optim.

23
24
25
Fractii egiptene
—  2/3 = 1/2 + 1/6
—  6/14 = 1/3 + 1/11 + 1/231
—  12/13 = 1/2 + 1/3 + 1/12 + 1/156

—  Algoritm greedy:
—  Pentru nr/dr unde dr > nr, gasim cea mai mare fractie posibila.
—  6/14 calculam 14/6, i.e., 3
—  Apoi calculam 6/14 - 1/3, i.e. 4/42

26
27
28
Pe saptamana viitoare!

29

S-ar putea să vă placă și