Seminar iz kolegija Algoritmi Problem odabira aktivnosti
U Varadinu, lipanj 2014. Sveuilite u Zagrebu Fakultet organizacije i informatike u Varadinu
Balen Ana-Marija / 42605
Seminar iz kolegija Algoritmi Problem odabira aktivnosti
Nositelj kolegija: Prof. dr. sc. Alen Lovreni
U Varadinu, lipanj 2014. Sadraj
Uvod .......................................................................................................................................... 4 Formalna definicija ..................................................................................................................... 5 Optimalno rjeenje ..................................................................................................................... 6 Rekurzivno rjeenje ................................................................................................................... 8 Rekurzivni pohlepni algoritam ................................................................................................. 8 Iterativni pohlepni algoritam ....................................................................................................... 9 Problem odabira aktivnosti u C-u ..............................................................................................12 Zakljuak ...................................................................................................................................14 Literatura ...................................................................................................................................15
Uvod
Problem odabira aktivnosti (eng. Activity selection problem) je matematiki optimizacijski problem izbora aktivnosti koje se obavljaju unutar odreenog vremenskog okvira, s obzirom na niz aktivnosti, od kojih svaka ima poetno vrijeme (si) i zavrno vrijeme (fi). Problem je odrediti najvei broj aktivnosti koje moe obavljati jedna osoba ili stroj, uz pretpostavku da jedna osoba moe obavljati samo jednu aktivnost u odreeno vrijeme. Klasini primjer ovog problema je raspored dogaanja za predavaonicu, od kojih svaki dogaaj ima poetno i zavrno vrijeme.
Formalna definicija
Prvi primjer je problem rasporeivanja nekoliko aktivnosti koje zahtijevaju koritenje zajednikih resursa, s ciljem odabira maksimalne veliine skupa meusobno kompatibilnih aktivnosti. Pretpostavimo da imamo skup S = {a 1 , a 2 , , a n } od n aktivnosti koje ele koristiti resurse, kao to su predavaonice, koje mogu biti koritene samo za jednu aktivnost u odreeno vrijeme. Svaka aktivnost a i ima vrijeme poetka s i i vrijeme zavretka f i , gdje vrijedi 0 s i < f i < . Aktivnosti a i i a j su kompatibilne ako se njihovi vremenski intervali ne preklapaju, tj. ako vrijedi s i f j ili s j f i . Problem odabira aktivnosti je odabir najveeg podskupa meusobno kompatibilnih aktivnosti. Na primjer, promotrite sljedei skup aktivnosti S koji su poredani u rastuem redoslijedu zavrnog vremena (f i ).
Slika 1. Skup aktivnosti poredanih u rastuem slijedu po zavrnom vremenu Na primjer, podskup {a 3 , a 9 , a 11 } sastoji se od meusobno kompatibilnih aktivnosti. To nije maksimalni podskup, jer je podskup {a 1 , a 4 , a 8 , a 11 } vei. Jo jedan vei podskup je {a 2 , a 4 , a 9 , a 11 }. Problem emo rijeiti u nekoliko koraka. Kreemo oblikovanje rjeenja dinamikim programiranje u kojem se kombiniraju optimalna rjeenja za dva podproblema kako bi formirali optimalno rjeenje za originalni problem. Uzimamo u obzir nekoliko mogunosti pri odreivanju koje podprobleme koristiti u optimalnom rjeenju. Vidjet emo da moramo uzeti u obzir samo jedan izbor pohlepni izbor. Kada smo napravili pohlepni izbor, jedan od podproblema je zasigurno prazan, tako da samo jedan neprazan podproblem ostaje. Na temelju tih promatranja, moramo razviti rekurzivni pohlepni algoritam za rjeavanje problema odabira aktivnosti. Zavrit emo proces razvijanja pohlepnog rjeenja pretvaranjem rekurzivnog algoritma u jedan ponavljajui. Premda su koraci koje moramo proi u ovom dijelu vie ukljueni nego je tipino za razvoj pohlepnog algoritma, oni ilustriraju vezu pohlepnog algoritma i dinamikog programiranja.
Optimalno rjeenje
Na prvi korak je pronai optimalnu podstrukturu i zatim ju iskoristiti za stvaranje optimalnog rjeenja za problem iz optimalnog rjeenja za podproblem. Moramo definirati prikladno mjesto podproblema. Zapoinjemo definiranje skupa S ij = { a k S : f i s k < f k s j } , S ij je podskup aktivnosti iz S koji moe zapoeti nakon to aktivnost a i zavri, i zavriti prije nego aktivnost a j zapone. U stvari, S ij sadri sve aktivnosti koje su kompatibilne s a i i a j i takoer kompatibilne sa svim aktivnostima koje ne zavravaju nakon to a i
zavri, i ne zapoinju prije nego to a j zapone. Kako bi se prikazale u cijelom problemu, dodajemo fiktivne aktivnosti a 0 i a n+1 i usvajamo konvencije da je f 0 = 0 i s n+1 = . Zatim S = S 0, n+1 , a rasponi za i i j su zadani s 0 i, j n + 1. Moemo dodatno ograniiti raspone za i i j. Pretpostavimo da su aktivnosti poredane u rastuem redoslijedu zavrnog vremena: f 0 f 1 f 2 f n < f n+1 . Tvrdimo da je S ij = svaki put kada je i j. Pretpostavimo da postoji aktivnost a k S ij za neki i j, tako da a i prati a j u sortiranom slijedu. Tada bi imali f i s k < f k s j < f j . Dakle, f i < f j , to je kontradiktorno naoj pretpostavci da a i slijedi a j redoslijedu sortiranja. Uz pretpostavku da imamo razvrstane aktivnosti u rastuem slijedu po zavrnom vremenu, moemo zakljuiti da je na prostor podproblema odabrati maksimalne veliine podskupa zajednikih kompatibilnih aktivnosti iz S ij , za 0 i < j n +1, znajui da su svi ostali S ij prazni. Da biste vidjeli podstrukturu problema odabira aktivnosti, razmotrimp neke neprazne podprobleme S ij i pretpostavite da rjeenje za S ij ukljuuje neke aktivnosti a k , tako da f i s k < f k s j . Koristei aktivnost a k generira dva podproblema, S ik (aktivnost koja poinje nakon to a i zavri, i zavrava prije nego a k zapone), i S kj (aktivnost koja poinje nakon to a k zavri, i zavrava prije nego a j zapone), od kojih se svaki sastoji od podskupa aktivnosti iz S ij . Rjeenje za S ij je unija rjeenja iz S ik i S kj , zajedno s aktivnosti a k . Broj aktivnosti u naem rjeenju za S ij je veliina rjeenja za S ik , plus veliina rjeenja za S kj , plus jedan (za a k ). Optimalna podstruktura ovog problema je sljedea. Pretpostavimo da optimalno rjeenje A ij za S ij ukljuuje aktivnost a k . Zatim rjeenja A ik za S ik i A kj za S kj koriteni unutar ovog optimalnog rjeenja za S ij moraju takoer biti optimalna. Uobiajeni cut and paste argument vrijedi. Ako imamo opciju A' ik za S ik koja ukljuuje vie aktivnosti od A ik , moemo odrezati (cut out) A ik iz A ij i zalijepiti (paste) u A' ik , tako stvarajui drugo rjeenje za S ij s vie aktivnosti od A ij . Budui da smo pretpostavili da je A ij optimalno rjeenje, mi smo izveli kontradikciju. Isto tako, ako smo imali rjeenje A kj za S kj s vie aktivnosti od A kj , moemo zamijeniti A kj s A' kj da bismo izveli rjeenje za S ij s vie aktivnosti od A ij . Sada koristimo nau optimalnu podstrukturu da bi prikazala kako moemo stvoriti optimalno rjeenje za problem iz optimalnog rjeenja za podproblem. Vidjeli smo da bilo koje rjeenje za neprazni podproblem S ij ukljuuje neke aktivnosti a k , i da bilo koje optimalno rjeenje sadri unutar optimalnih rjeenja za podproblem instance S ik i S kj . Dakle, moemo izgraditi podskupove maksimalne veliine meusobno kompatibilnih aktivnosti u S ij dijeljenjem problema u dva podproblema, traenjem maksimalno velikog podskupa A ik i A kj meusobno kompatibilnih aktivnosti za ove podprobleme i formiranjem naeg podskupa maksimalne veliine A ij od meusobno kompatibilnih aktivnosti kao A ij = A ik U {a k } U A kj . Optimalno rjeenje cijelog problema je rjeenje za S 0, n+1 .
Rekurzivno rjeenje
Drugi korak u razvoju rjeenja pomou dinamikog programiranja je rekurzivno definiranje vrijednosti optimalnog rjeenja. Za problem izbora aktivnosti, neka c[i, j] bude broj aktivnosti u podskupu maksimalne veliine meusobno kompatibilnih aktivnosti u S ij . c[i, j] = 0 kadgod je S ij = ; posebno, c[i, j] = 0 za i j. Sada razmislimo o nepraznom podskupu S ij . Kao to smo vidjeli, ako je a k koriten u podskupu maksimalne veliine za S ij , takoer koristimo podskup maksimalne veliine za podproblem S ik i S kj . Imamo ponavljanje c[i, j] = c[i, k] + c[k, j] + 1. Ova rekurzivna jednadba podrazumijeva da mi znamo vrijednost k koji nam je potreban. Postoje j i 1 mogue vrijednosti za k, odnosno, k = i + 1, , j 1. budui da podskup maksimalne veliine za S ij mora koristiti jednu od ovih veliina za k, provjeravamo ih sve kako bi pronali najbolju.
Rekurzivni pohlepni algoritam
Dajemo jednostavna, rekurzivna rjeenja kao i postupak rekurzivnog izbora aktivnosti. Potrebno je poetno i zavrno vrijeme aktivnosti, predstavljeni kao nizovi s i f, kao i polazni indeksi i i j za rjeavanje podproblema S i, j . Vraa skup maksimalne veliine meusobno kompatibilnih aktivnosti u S i, j . pretpostavljamo da su ulazne aktivnosti n poredane rastui po zavrnom vremenu. Ako nisu, moemo ih razvrstati ovim redom u O (n lg n) vremena, proizvoljno prekidajui vezu. Poetni poziv je REKURZIVNI ODABIR AKTIVNOSTI (s, f, 0, n+1).
REKURZIVNI ODABIR AKTIVNOSTI (s, f, i, j) 1 m i + 1 2 while m < j and s m < f i -pronalazi prvu aktivnost u S ij . 3 do m m + 1 4 if m < j 5 then return {a m } U RECURSIVE-ACTIVITY-SELECTOR (s, f, m, j) 6 else return
U danom rekurzivnom pozivu rekurzivnog odabira aktivnosti ( s, f, i, j), while petlja u linijama 2-3 trai prvu aktivnost u S ij . Petlja ispituje a i+1 , a i+2 , , a j-1 , sve dok ne nae prvu aktivnost a m kompatibilnu s a i , takva aktivnost ima s m f i . Ako se petlja zavri jer je pronala takvu aktivnost, postupak vraa u liniju 5 uniju {a m } i podskup maksimalne veliine od s mj vraen rekurzivnim odabirom aktivnosti (s,m f, m j). Alternativno, petlja se moe prekinuti jer je m j, u tom sluaju smo istraili sve aktivnosti ija su zavrna vremena prije nego a j bez traenja onog kompatibilnog s a i . U ovom sluaju, S ij = , pa procedura vraa u liniji 6. Uz pretpostavku da su aktivnosti ve sortirane po zavrnom vremenu, vrijeme trajanja poziva rekurzivnog odabira aktivnosti (s, f, 0, n+1) je (n). Tijekom svih rekurzivnih poziva, svaka aktivnost se ispituje tono jednom u while petlji u liniji 2. Konkretno, djelatnost a k se ispituje u zadnjem pozivu u kojem je i < k.
Iterativni pohlepni algoritam
Lako moemo pretvoriti nau rekurzivnu proceduru u iterativnu. Procedura rekurzivni odabir aktivnosti je skoro krajnje rekurzivna: njen kraj s rekurzivnim pozivom same sebe od operacije unije. To je obino jednostavan zadatak transformirati krajnje rekurzivnu proceduru u iterativnu formu; u stvari, neki kompajleri za odreene programske jezike izvode taj zadatak automatski. Kao to je reeno, rekurzivni odabir aktivnosti funkcionira za bilo koji podproblem S ij , ali vidjeli smo da trebamo uzeti u obzir samo podprobleme za koji je j = n + 1, tj. Podprobleme koji se sastoje od posljednjih aktivnosti za kraj. Postupak pohlepnog odabira aktivnosti je iterativna verzija procedure rekurzivnog odabira aktivnosti. Takoer se pretpostavlja da su ulazne aktivnosti poredane rastui po zavrnom vremenu. Prikuplja odabrane aktivnosti u skup A i vraa ovaj set kada je gotovo.
Slika 2. Rekurzivni odabir aktivnosti na 11 aktivnosti Aktivnosti razmatrane u svakom rekurzivnom pozivu pojavljuju se izmeu vodoravnih linija. Fiktivna aktivnost a 0 zavrava u vrijeme 0, te u inicijalnom pozivu, rekurzivnog odabira aktivnosti (s, f, 0, 12), je odabrana aktivnost a 1 . U svakom rekurzivnom pozivu, aktivnosti koje su ve bile odabrane su sive, a aktivnosti obojane u bijelo se razmatraju. Ako se poetno vrijeme aktivnosti javlja prije zavrnog vremena zadnje dodane aktivnosti (strelica izmeu njih pokazuje lijevo), onda je aktivnost odbijena. Inae (ako strelica pokazuje direktno iznad ili u desno) je izabrana. Posljednji rekurzivni poziv, rekurzivnog odabira aktivnosti (s, f, 11, 12) vraa . Set rezultata odabranih aktivnosti je {a 1 , a 4 , a 8 , a 11 }. POHLEPNI ODABIR AKTIVNOSTI (s, f ) 1 n length [s] 2 A {a 1 } 3 i 1 4 for m 2 to n 5 do if s m f i
6 then A A U {a m } 7 i m 8 return A Varijabla i indeksira najvie A, koje odgovara aktivnosti ai u rekurzivnoj verziji. Budui da se aktivnosti razmatraju poredane po rastuem zavrnom vremenu, f i je uvijek najvee zavrno vrijeme bilo koje aktivnosti u A. Tako je, f i = max {f k : a k A}. Linije 2-3 biraju aktivnost a 1 , inicijalizirajui A da sadri samo ovu aktivnost, i inicijalizirajui i da indeksira tu aktivnost. For petlja u linijama 4-7 pronalazi aktivnosti koje najranije zavravaju u S i, n+1 . Petlja promatra svaku aktivnost a m u prolasku petlje i dodaje a m u A ako je kompatibilna sa svim prethodno odabranim aktivnostima; takva aktivnost najranije zavrava u S i, n+1 . Da bismo vidjeli je li aktivnost a m kompatibilna sa svakom trenutnom aktivnosti u A dovoljno je provjeriti da njeno poetno vrijeme s m nije ranije od zavrnog vremena f i od posljednje dodane aktivnosti u A. Ako je aktivnost a m
kompatibilna, onda linije 6-7 dodaju aktivnosti a m u A i dodaju i uz m. Skup A vraen po pozivu pohlepnog odabira aktivnosti (s, f) je tonije set vraen pozivom rekurzivnog odabira aktivnosti (s, f, 0, n + 1). Kao i rekurzivna verzija, pohlepni odabir aktivnosti rasporeuje skup od n aktivnosti u vrijeme n, uz pretpostavku da su aktivnosti ve razvrstane uzlazno po zavrnom vremenu.
Problem odabira aktivnosti u C-u 1
1. #include<stdio.h> 2. #include<conio.h> 3. 4. void activities(int s[ ], int f[ ], int n) 5. { 6. int i, j; 7. printf ("Selected Activities are:\n"); 8. i = 1; 9. printf("A%d ", i); 10. for (j = 1; j < n; j++) 11. { 12. if (s[j] >= f[i]) 13. { 14. printf ("A%d ", j+1); 15. i = j; 16. } 17. } 18. } 19. 20. void main() 21. { 22. int s[ ] = {1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12}; 23. int f[ ] = {4, 5, 6, 7, 9, 9, 10, 11, 12, 14, 16}; 24. int n = sizeof(s)/sizeof(s[0]); 25. clrscr(); 26. activities(s, f, n); 27. getchar(); 28. getch(); 29. } Odabrane aktivnosti su A1, A4, A8 i A11.
1 S Interneta: http://scanftree.com/Data_Structure/activity-selection-problem
Slika 3. Prikaz odabira aktivnosti
Zakljuak
Problem odabira aktivnosti jedan je od svakodnevnih problema, moda na to netko ne gleda s programerske strane, ali ovaj problem ima programsko rjeenje. Programski, algoritam trai aktivnost ije je poetno vrijeme vee od zavrnog vremena prve aktivnosti, te slae cijeli skup meusobno kompatibilnih rjeenja problema bez konflikata. Konflikti su preklapanja aktivnosti. Najbolji primjer za laiki prikaz ovog problema jest raspored predavanja u odreenoj predavaonici. Predavanja poinju jedno za drugim bez ikakvih preklapanja. Takoer nije ni lako sloiti takav raspored, pogotovo ako postoji mnotvo aktivnosti. Potrebno je to vie aktivnosti svrstati u dani skup. Ponekad postoji mnotvo kombinacija kod slaganja, ali uvijek je najoptimalnije rjeenje najvei skup, znai to vie dogaaja. Literatura
[1] T. H. Comen, C. E. Leiserson, E. L. Rivest, C. Stein: Introduction to Algorithms, second edition, The MIT Press, Cambridge, Massachusetts, London, England, str. 370. [2] S. Dasgupta, C. H. Papadimitriou, U. V. Vazirani: Algorithms, 2006. g. [3] S Interneta: http://www.geeksforgeeks.org/greedy-algorithms-set-1-activity-selection- problem/, preuzeto 20.6.2014. [4] S Interneta http://scanftree.com/Data_Structure/activity-selection-problem, preuzeto 20.6.2014.