OK Algoritmi Pretrage Grafovi 3

Embed Size (px)

Citation preview

GRAFOVSKI ALGORITMIPrilikom modeliranja sloenijih odnosa izmeu objekata esto se koriste grafovi. Oni mogu da modeliraju razliite odnose izmeu objekata, od tehnike, arheologije do psihologije, ukljuujui i najrazliitije probleme svakodnevnog ivota. Neki od primera algoritama u kojima se koriste grafovi su: Nalaenje najboljeg puta. (Ulice odgovaraju granama, a raskrsnice vorovima. Svakoj ulici i grani moe se pridodati vreme prolaska kroz njih, pa tako dolazimo i do teinskih grafova.) Problem pravljenja rasporeda asova se takoe moe shvatiti kao grafovski problem. Grupe se definiu kao vorovi, veza izmeu vorova postoji ako student eli da pohaa dve ili vie grupa ili ako imaju zajednikog predavaa. Prvi problem sa kojim se sreemo kod konstrukcije ovih algoritama je definisati ulazne podatke. Pretraga grafova nije trivijalan posao. Postoje dve osnovne vrste grafovskih algoritama. To su algoritmi pretraga u dubinu i pretraga u irinu. ALGORITMI - RAZAPINJUA STABLA Razapinjue stablo T je stablo grafa G, takvo da svaki vor grafa G predstavlja i vor stabla T. Takoe znamo da svaki povezan graf ima razapeto stablo. Kod ne povezanih stabala situacija je znatno komplikovanija. Prilikom pravljenja algoritama potrebno je da znamo kada smo vor i granu dodali stablu, da bismo eliminisali mogunost da neku vor upotrebimo vie puta, jer takav graf ne bi bio stablo. Takoe treba da znamo na koji nivo smo dodali vor, da bismo na sledeem nivou koristili samo vorove koje smo izabrali na predhodnom nivou. ALGORITMI - PRETRAGA U DUBINU Kod pretrage na dubinu pokuavamo da napravimo stablo najvee duine. Kada put stigne do kraja, obrazujemo list, vraamo se do roditelja tog lista i pokuavamo da napravimo novi put. Na roditelje se vraamo samo kada isprobamo sve mogue puteve koji kreu od njegovog deteta. Kod algoritma pretrage na daljinu svi vorovi moraju biti oznaeni i sve njegove grane tokom izvravanja algoritma prelaze se bar jedanput. Algoritam poinje od proizvoljnog vora koji proglaavamo korenom stabla. Zatim biramo vor koji je njemu susedan i formiramo granu. Zatim biramo vor koji je susedan predhodno izabranom voru i formiramo novu granu. Na tom putu treba vorove obeleiti da bi ga prelazili samo jedanput. Ako od bilo kog vora v preemo na vor w i vidimo da je on ve upotrebljen, tada granu (v,w) ne moemo da dodamo stablu. Takve grane zovemo povratne grane. Mora se proveriti da li je vor w roditelj vora v, poto tada takva grana ve postoji. Ako je grana (v,w) povratna grana, mi ostajemo na voru v i biramo susedan vor ako je to mogue. Bilo koja grana grafa G mora da bude ili grana stabla ili povratna grana.

1

Primer: Pretpostavimo da smo u umetnikoj galeriji, gde hodnici odgovaraju granama, a preseci hodnika vorovima. Mi hoemo da obiemo galeriju i vidimo sve slike. Slike se nalaze sa obe strane zida. Ako je graf Ojlerov, mogue je svaki hodnik obii tano jedanput. Poto graf ne mora da bude Ojlerov, mogue je grane prei vie puta. Ulazimo u hodnik uvek kada je to mogue. Kada stignemo na raskrsnicu prvi put , ostavimo kameni, i odlazimo novim hodnikom. Kada doemo do raskrsnice na kojom stoji kameni, vraamo se istim putem nazad i pokuavamo da doemo do nove raskrsnice. Ako su svi hodnici koji vode iz te raskrsnice pregledani, uklanjamo kameni i vraamo se putem kroz koji smo prvi put proli. Ovu raskrsnicu vie neemo prolaziti i nastavljamo etnju. Ovakav pristup zove se pretraga u dubinu DFS (dept-first-search). Ovi algoritmi su jednostavni i prilagodljivi rekurzivnim algoritmima. Algoritam - stablo pretrage u dubinu Pretpostavimo da su na poetku svi vorovi u stablu obeleeni sa n (nov), a kada ih upotrebimo oznaku menjamo u u (upotrebljen). 1. 2. 3. 4. Oznaimo sve vorove grafa G sa n. Izaberite proizvoljan vor v0 G i postaviti ga za koren stabla. Promeniti oznaku vora v0 sa n na u i neka je v = v0 . Ponavljati sledei postupak dogod postoji vor susedan voru v koji nije izabran. Izabetite vor w koji je susedan voru v. Ako vor w ima oznaku n, dodajte granu (v,w) skupu grana stabla, i promeniti oznaku vora w u u, neka je w=v, i ponoviti korak 4. Ako vor w ima oznaku u i ako w nije roditelj vora v, dodati granu (v,w) skupu povratne grane i ponoviti korak 4. 5. Ako je v v0 , neka je v= roditelj (v) i ponoviti korak 4. 6. Kraj. Do god bilo koji vor v ima susedan i neiskorien vor w, produava se put od vora v ka voru w. Kada vie ne moe da se ide dalje, prelazi se na korak 5 i vraa se na roditelja vora v.

2

Algoritam pretrage u dubinu procedura : pretraga u dubinu (G povezan graf sa cvorovima v0 ,L , vn ) T = stablo koje sadri samovorove v 0 poseti v1 procedura : poseti vvor G za svakivor w susedan voru v i nije jo iz T poni dodajvor w i granu (v ,w ) stablu T poseti w kraj Primer: Uoimo graf na slici. Napraviti njegovo razapinjue stablo.b a c

d

e

f g

h

Biramo na proizvoljan nain vor a za koren. Menjamo oznaku vora a iz n u u. Kako je vor b sucedan voru a i poto b ima oznaku n, dodajemo granu (a,b) skupu grana i menjamo oznaku vora b iz n u u. Sa vora b prelazimo na vor d, jer je on susedan voru b. Oznaku n vora d menjamo u u, i dodajemo granu (b,d) skupu grana. Kako vor d ima vie susednih vorova , biramo izmeu vorova a, f ili g. Od naeg izbora zavisi izgled stabla, to znai da pretraga u dubinu ne daje uvek isto stablo. Ako izaberemo vor g, koji ima oznaku n, menjamo je u u i granu (d,g) dodajemo skupu grana. Posle vora g biramo vor f, koji je susedan voru g, menjamo mu oznaju u u i granu (g,f) dodajemo skupu grana. Posle vora f biramo vor d. Ali vor d ima oznaku u i zato granu (d,f) dodajemo skupu povratnih grana. Poto vie nema vorova osim njegovih roditelja, koji je susedan voru f, vraamo se na vor g. Ali kako ne postoji ni jedan vor susedan sa g, vraamo se u vor d. Jedini vor susedan voru d je vor a, koji ima oznaku u, pa granu (d,a) dodajemo skupu povratnih grana i vraamo se u vor b. Kako nema nijedan vor koji je susedan voru b, vraamo se u vor a. Iz vora a biramo jedan od preostalih vorova c ili e. Ako izaberemo c, njegovu oznaku n menjamo u u i granu (a,c) dodajemo skupu grana. Poto je vor e susedan sa vorom c, menjamo mu onaku u u i dodajemo granu (c,e) skupu grana. Ako bi izabrali vor a kao 3

susedan voru e, a on ima oznaku u, grana (e,a) bi se dodala skupu povratnih grana. i vraamo se vor e. vor h je susedan vor voru e, menjamo mu oznaku u u i dodajemo granu (e,h) skupu grana. Nije preostao nijedan vor za proveru iz h, pa se vraamo u vor e, a iz njega u c i konano u a.a a a a b b d c g f a g f b d g a b d g f b d a a b c d g f

a

b d g

c e

b

c d g e

b

c d g e

ALGORITMI - PRETRAGA U IRINU

f

f

f

h

Algoritam poinje od proizvoljnog vora koji proglaavamo korenom stabla. Zatim biramo sve vorove koji su njemu susedni i formiramo grane. Ovi vorovi su nivoa 1. Sada emo uzeti svaki od vorova nivoa 1 i za svaki vor koji je njemu susedan, a ranije nije uzet dodajemo granu. vorovi koje smo dodali u ovom koraku imaju nivo 2. Postupak ponavljamo sve dok stablu ne dodelimo sve vorove grafa G. Ovakav pristup zove se pretraga u [irinu BFS (breadth-first-search). Algoritam - stablo pretrage u irinu Skup vorova grafa obeleavamo sa V, grana sa E, a vorove stabla sa V T i grane sa E T . Izaberite proizvoljan vor v0 G i postaviti ga za koren stabla. Neka je v0 V i nivo L ( v0 = 0 ) . 2. Za svaki vor v V V T , takav da je vor v susedan voru v0 , neka v V T , ( v0 , v ) E T i L ( v ) = 1 1.T

3. 4.

Neka je i=1. T Izaberite v j V , tako da je L ( v j ) = i

4

5.T

v V T , ( v0 , v ) E 6. Ponavljati korak 5 dok ne ispitate sve elemente skupa T V V . 7. Ponavljati korake 4,5 i 6 dok ne ispitate sve vorove v j za koje je L ( v ) = i 8. Neka je i=i+1 9. Ponavljati korake 4-8 sve dok ne bude V = V T Algoritam pretrage u irinu procedura : pretraga u irinu (G povezan graf sa cvorovima v0 ,L , vn ) T = stablo koje sadri samovorove v 0 L je prazno definii nivo Lvora v 0

Izaberite v V V T . Ako je vor v susedan voru v j , neka i L ( v) = i +1

dok ( while ) L nije prazno poni pomeri prvivor ,v ,iz L za svaki susedni w od v if w nije iz L i nije iz T onda(then) poni dodajvor w na kraj liste L i granu (v ,w ) stablu T kraj

Primer: Uoimo graf na slici.a b

c d e f

T Biramo na proizvoljan nain vor a za koren. Tada je L ( a ) = 0, a V . Kako je vor b

T T sucedan voru a neka b V , L ( b ) = 1, ( a, b ) E .vor c je takoe susedan sa vorom

5

T T a, tako da je c V , L ( c ) = 1, ( a, c ) E . Konano i vor d je susedan sa vorom a i

Razmotrimo sada sve vorove novoa 1. Ako ponemo od L ( b ) = 1, odredimo vorove koji su susedni, a do sada nisu iskorieni. Poto je vor f susedan voru b, neka f V T , L ( f ) = 2, ( b, f ) ET . Poto je vor e susedan voru c, neka je e V T , L ( e ) = 2, ( b, e ) ET . Kako smo upotrebili sve vorove, postupak je zavren.

d V T , L ( d ) = 1, ( a, d ) ET .

a

a

b b c d

c d

f

e

6