Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Depth First Search Backtracking
Mélységi keresés Depth First Search Backtracking Get ahold of a network, and use the same network to illustrate the shortest path problem for communication newtorks, the max flow problem, the minimum cost flow problem, and the multicommodity flow problem. This will be a very efficient way of introducing the four problems. (Perhaps under 10 minutes of class time.)
2
Mélységi keresés-backtracking
Alapelv: Tetszés szerinti csúcstól (i) elindulva egy úton addig megyünk „mélyre”, ameddig lehet: vagy nincsen további szomszédos csúcs, vagy már jártunk ott. Ha így megakadunk, akkor visszalépünk (backtrack) az előző csúcshoz (pred (i), ha onnan tudunk továbbmenni, akkor megint elindulunk, és addig megyünk…, ha nem, akkor visszalépünk…)
3
Mélységi keresés-elvi algoritmus (rekurzió)
Procedure DFS (ÖF G: v1, …vn csúcsokkal) F: fa, kezdőértéke v1 visit(v1) Procedure visit(i: a G egy csúcsa) FOR j G minden i-vel szomszédos csúcsára, ami még nincsen F-ben F= j csúcs U {ij} él visit(j) END FOR Az algoritmust adatszerkezetekkel kell megvalósítani. Sokféle megvalósítás lehetséges-ld. programozás, nem e tárgy feladata. Az alábbiban F-et az order(csúcs) alapján lehet felépíteni, ez a tömb tartalmazza a csúcsok azonosítóinak sorrendjét.
4
Mélységi keresés-elvi algoritmus (rekurzióval)
Procedure DFS (ÖF G: v1, …vn csúcsokkal) F: fa, kezdőértéke v1 visit(v1) Procedure visit(i: a G egy csúcsa) FOR j G minden i-vel szomszédos csúcsára, ami még nincsen F-ben F= j csúcs U {ij} él visit(j) END FOR Az algoritmust adatszerkezetekkel kell megvalósítani. Sokféle megvalósítás lehetséges-ld. programozás, nem e tárgy feladata. Az alábbiban F-et az order(csúcs) alapján lehet felépíteni, ez a tömb tartalmazza a csúcsok azonosítóinak sorrendjét.
5
Mélységi keresés másképpen
Az algoritmus -felépít és lebont egy listát (LIST), aszerint, hogy tovább tudunk-e menni: LIST: ebbe beletesszük a kiválasztott csúcsokat addig, amíg a visszalépéskor az összes szomszédját meg nem látogattuk. Ha egy csúcs ki van választva, a következő csúcs, amit a lista végére fűzünk, ennek szomszédja. Mindig e LISTa végéről választjuk a következő csúcsot. Ha nem tudunk továbbmenni a kiválasztott csúcsból, akkor csúcsot töröljük a LIST végéről. (ez a visszalépés). Ez az elvi algoritmusban „rejtve van”, egy adott csúcsot meg kell vizsgálni, illeszkedik-e, ha nem, akkor nem hívjuk a visit eljárást.. -tárolja a csúcsnak a fa felépítésekor keletkező sorszámát, ezzel címkézzük a csúcsokat: order(csúcs azonosító)-tömb, ennek értéke az első értékadás után nem változik - tárolja a kiválasztott csúcs szülőjét: pred(csúcsazonosító)-tömb, ennek értéke az első értékadás után nem változik, ez csak a fa felépítésében a visszalépéskor kell -felhasznál egy szigorúan monoton 1-gyel növekvő segédváltozót: Next. Ez akkor növekszik csak, ha tudunk szomszédos csúcsba menni.
6
Algoritmus a mélységi keresésre
begin inicializálás // kezdőértékek beállítása while LIST ø do az i csúcsot választjuk a LISTából; if i szomszédos egy j csúccsal, vagyis van (i,j) él then megjelöljük (sárgával) a j csúcsot; pred(j) := i; // megjegyezzük az ősét next := next + 1 ; order(j) := next; // ez lesz a címkéje, ennek alapján építjük fel a fát a j csúcsot a listához fűzzük (append) LIST; //előrelépés end else töröljük i-t a LIST – ából // visszalépés end;
7
Kezdőértékek beállítása
Inicializálás begin minden csúcs jelöletlen a csúcsok halmazában; jelöljük kis a kezdőcsúcsot s; pred(s) = 0; /*ez megállapodás kérdése, ennek nincsen megelőzője, szülője*/ next := 1; order(s) := next; /*ebben a tömbben tároljuk a csúcsok cimkéit: a felépítendő fában ezen sorrend szerint vesszük a csúcsokat a rájuk illeszkedő élekkel együtt*/ LIST = {s} end
8
Alapbeállítás 1 2 4 5 3 6 9 7 8 1 2 4 5 3 6 9 7 8 1 1 pred(1) = 0 Next := 1 order(Next) = 1 LIST:= {1} Minden csúcs jelöletlen, a startcsúcs legyen az 1. LIST 1 Next 1
9
A csúcsok LIST-ájáról az utolsót választjuk
1 2 4 5 3 6 9 7 8 1 1 1 A mélységi keresésben , i lesz az utolsó csúcs a LIST-ában LIST 1 Next 1
10
Ha van szomszédos csúcs, akkor…
2 4 Megjelöljük a j csúcsot (2), és pred(j) := I 2 2 8 1 1 1 5 7 1 9 3 6 Kiválasztjuk az i-re illeszkedő él: (i,j) másik végpontját (2) Next := Next + 1 order(j) := Next j-t a LIST-ához adjuk LIST 1 2 1 2 Next
11
A LIST-áról az utolsó csúcsot választjuk: 2
4 2 2 2 8 1 1 1 1 5 7 1 9 3 6 Kiválasztjuk a 2 csúcsot LIST 1 2 1 2 Next
12
Ha van szomszédos csúcs, akkor…
2 4 4 Megjelöljük a j (most 4) csúcsot, és pred(4) := 3 2 2 2 3 8 1 1 1 1 5 7 1 9 3 6 Kiválasztjuk az i-re illeszkedő él: (i,j) másik végpontját:j (4) Next := Next + 1 order(j) := Next j-t a LIST-ához adjuk LIST 1 2 4 2 3 1 Next
13
a LIST-áról az utolsó csúcsot választjuk
2 4 4 4 2 2 2 2 3 8 1 1 1 1 1 5 7 A LIST-áról az utolsó csúcsot választjuk: 4 9 3 6 LIST 1 2 4 2 3 1 Next
14
Ha van szomszédos csúcs, akkor…
2 4 4 4 2 2 2 2 3 8 8 4 1 1 1 1 1 5 7 Next := Next + 1 order(j) := Next j-t a LIST-ához adjuk Kiválasztjuk az i-re illeszkedő él: (i,j) másik végpontját:8 Megjelöljük a j (most 8) csúcsot, és pred(8) := 4 9 3 6 LIST 1 2 4 8 1 3 2 4 Next
15
a LIST-áról az utolsó csúcsot választjuk
2 4 4 4 2 2 2 2 3 8 8 8 4 1 1 1 1 1 5 7 a LIST-áról az utolsó csúcsot választjuk: 8 9 3 6 LIST 1 2 4 8 3 2 1 4 Next
16
Ha NINCS szomszédos csúcs, akkor…
2 4 4 4 2 2 2 2 3 8 8 8 8 4 1 1 1 1 1 5 7 9 3 6 Az utolsó (i.) csúcsot, most 8, töröljük a listáról (de a fában már benne van, az order(8) nem változik) LIST 1 2 4 8 1 3 2 4 Next
17
a LIST-áról az utolsó csúcsot választjuk
2 4 4 4 4 2 2 2 2 3 8 8 8 8 4 1 1 1 1 1 5 7 a LIST-áról az utolsó csúcsot választjuk:4 9 3 6 LIST 1 2 4 8 1 4 2 3 Next
18
Ha van szomszédos csúcs, akkor…
2 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 1 1 1 1 5 5 7 Next := Next + 1 order(j) := Next j-t hozzáadjuk a LIST-ához Kiválasztjuk az i-re illeszkedő él: (i,j) másik végpontját:5 Megjelöljük a j (most 5) csúcsot, és pred(5) := 4 9 3 6 LIST 1 2 4 8 5 5 3 1 2 4 Next
19
A LIST-áról az utolsó csúcsot választjuk
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 1 1 1 1 5 5 5 7 a LIST-áról az utolsó csúcsot választjuk 9 3 6 LIST 1 2 4 8 5 1 2 5 3 4 Next
20
Ha van szomszédos csúcs, akkor…
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 1 1 1 1 5 5 5 7 Next := Next + 1 order(j) := Next j-t hozzáadjuk a LIST-ához Megjelöljük a j (most 6) csúcsot, és pred(6) := 5 Kiválasztjuk az i-re illeszkedő él: (i,j) másik végpontját:6 9 3 6 6 6 LIST 1 2 4 8 5 6 1 6 3 5 2 4 Next
21
A LIST-áról az utolsó csúcsot választjuk
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 1 1 1 1 5 5 5 5 7 A LIST-áról az utolsó csúcsot választjuk: 6 9 3 6 6 6 6 LIST 1 2 4 8 5 6 3 4 6 5 1 2 Next
22
Ha van szomszédos csúcs, akkor…
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 1 1 1 1 5 5 5 5 7 Kiválasztjuk az i-re illeszkedő él: (i,j) másik végpontját:9 Next := Next + 1 order(j) := Next j-t hozzáadjuk a LIST-ához Megjelöljük a j (most 9) csúcsot, és pred(9) := 6 9 9 3 6 6 6 7 6 LIST 1 2 4 5 8 6 9 7 3 1 2 4 6 5 Next
23
A LIST-áról az utolsó csúcsot választjuk
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 1 1 1 1 5 5 5 5 7 A LIST-áról az utolsó csúcsot választjuk: 9 9 9 9 3 6 6 6 6 7 6 LIST 1 2 4 5 8 6 9 7 1 2 4 6 5 3 Next
24
Ha van szomszédos csúcs, akkor…
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 5 5 5 5 7 7 Next := Next + 1 order(j) := Next j-t hozzáadjuk a LIST-ához Kiválasztjuk az i-re illeszkedő él: (i,j) másik végpontját:7 Megjelöljük a j (most 7) csúcsot, és pred(7) := 9 9 9 9 3 6 6 6 6 7 6 LIST 1 2 4 8 5 6 9 7 1 2 8 4 6 3 5 7 Next
25
A LIST-áról az utolsó csúcsot választjuk
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 5 5 5 5 7 7 7 A LIST-áról az utolsó csúcsot választjuk : 7 9 9 9 9 3 6 6 6 6 7 6 LIST 1 2 4 5 8 6 9 7 4 8 1 6 2 3 5 7 Next
26
Ha NINCS szomszédos csúcs, akkor…
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 5 5 5 5 7 7 7 7 9 9 9 9 3 6 6 6 6 7 6 7 csúcsot (utolsót) töröljük a List-áról LIST 1 2 4 8 5 6 9 7 1 2 8 4 6 3 7 5 next
27
A LIST-áról az utolsó csúcsot választjuk…
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 5 5 5 5 7 7 7 7 9 9 9 9 9 9 9 7 3 6 6 6 6 6 De a 9 csúcs nem szomszédos egyik, még nem látogatott csúccsal sem, Töröljük a listáról a 9 csúcsot: LIST 1 2 4 8 5 6 9 7 4 2 1 3 5 7 6 8 Next
28
A LIST-áról az utolsó csúcsot választjuk: 6
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 5 5 5 5 7 7 7 7 De a 6 csúcsnak nincsen nem látogatott szomszédja 9 9 9 9 9 9 3 6 6 6 6 6 6 7 6 Töröljük a listáról a 6 csúcsot: LIST 1 2 4 5 8 6 9 7 4 3 2 6 7 8 1 5 Next
29
A LIST-áról az utolsó csúcsot választjuk: 5
2 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 5 5 5 5 5 5 7 7 7 7 De az 5 csúcsnak nincsen nem látogatott szomszédja 9 9 9 9 9 9 3 6 6 6 6 6 6 7 6 Töröljük a listáról az 5 csúcsot: LIST 1 2 4 8 5 6 9 7 3 2 1 4 5 6 8 7 Next
30
A LIST-áról az utolsó csúcsot választjuk: 4
2 4 4 4 4 4 4 4 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 5 5 5 5 5 5 7 7 7 7 De az 4 csúcsnak nincsen nem látogatott szomszédja 9 9 9 9 9 9 3 6 6 6 6 6 6 7 6 Töröljük a listáról az 4 csúcsot: LIST 1 2 4 8 5 6 9 7 7 1 2 5 8 4 6 3 next
31
A LIST-áról az utolsó csúcsot választjuk: 2
4 4 4 4 4 4 4 2 2 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 5 5 5 5 5 5 7 7 7 7 De az 2 csúcsnak nincsen nem látogatott szomszédja 9 9 9 9 9 9 3 6 6 6 6 6 6 7 6 Töröljük a listáról az 2 csúcsot: LIST 1 2 4 5 8 6 9 7 6 3 1 4 5 7 2 8 Next
32
j-t hozzáadjuk a LIST-ához Megjelöljük a j (most 3) csúcsot, és
A LIST-áról az utolsó csúcsot választjuk: 1 Ha van szomszédos csúcs, akkor… 2 4 4 4 4 4 4 4 2 2 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 1 5 5 5 5 5 5 7 7 7 7 Next := Next + 1 order(j) := Next j-t hozzáadjuk a LIST-ához Megjelöljük a j (most 3) csúcsot, és pred(3) := 1 Kiválasztjuk az i-re illeszkedő él: (i,j) másik végpontját:3 9 9 9 9 9 9 3 3 6 6 6 6 6 6 7 9 6 LIST 1 3 2 4 8 5 6 9 7 9 1 2 5 8 7 6 4 3 Next
33
A LIST-áról az utolsó csúcsot választjuk: 2
4 4 4 4 4 4 4 2 2 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 1 1 5 5 5 5 5 5 7 7 7 7 De az 3 csúcsnak nincsen nem látogatott szomszédja 9 9 9 9 9 9 3 3 3 3 6 6 6 6 6 6 7 9 6 Töröljük a listáról az 3 csúcsot: LIST 1 2 4 8 5 6 9 7 9 8 5 3 4 2 6 7 1 Next
34
A LIST-áról az utolsó csúcsot választjuk: 1
2 4 4 4 4 4 4 4 2 2 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 1 1 1 1 5 5 5 5 5 5 7 7 7 7 De az 1 csúcsnak nincsen nem látogatott szomszédja 9 9 9 9 9 9 3 3 3 3 6 6 6 6 6 6 7 9 6 Töröljük a listáról az 1 csúcsot: LIST 1 3 2 4 5 8 6 9 7 9 5 2 1 3 4 7 6 8 Next
35
A LISTa ÜRES! 2 4 4 4 4 4 4 4 2 2 2 2 2 2 3 8 8 8 8 4 5 1 8 1 1 1 1 1 1 1 1 5 5 5 5 5 5 7 7 7 7 9 9 9 9 9 9 3 3 3 3 6 6 6 6 6 6 7 Ez az algoritmus vége 9 6 LIST 1 3 2 4 8 5 6 9 7 8 4 2 7 5 1 6 3 9 next
36
A Depth-First fa (DFT) 1 3 2 9 8 7 5 4 6 Minden részfa növekvő számozású pontokból áll
37
Alkalmazások: MI: n – királynő probléma: Tic-tac-toe:
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.