Vous êtes sur la page 1sur 15

Sveuilite u Zagrebu

Fakultet organizacije i informatike u Varadinu












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.

Vous aimerez peut-être aussi