Depth First Search Backtracking

Slides:



Advertisements
Hasonló előadás
A Dijkstra algoritmus.
Advertisements

Készítette: Kosztyán Zsolt Tibor
Nevezetes algoritmusok
Készítette: Mester Tamás METRABI.ELTE.  Adott egy G irányított vagy irányítás nélküli, véges gráf. Az eljárás célja a G gráf összes csúcsának bejárása.
MESTERSÉGES INTELLIGENCIA (ARTIFICIAL INTELLIGENCE)
Illés Tibor – Hálózati folyamok
Benczúr Zsolt VBA gyorstalpaló Benczúr Zsolt
Gráfok szélességi bejárása
Gazdaságmatematika 6.szeminárium.
Egydimenziós tömbök. Deklarálás: var valtozónév:array[kezdőérték..végsőérték]of típus; type típusnév = array [kezdőérték..végsőérték] of típus; var valtozónév:
Készítette: Pető László
OPERÁCIÓKUTATÁS Kalmár János, 2012 Tartalom A nulla-egy LP megoldása Hátizsák feladat.
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
AVL fák.
IRE 4 /32/ 1 Óbudai Egyetem, NIK Dr. Kutor László2011. TÁMOP – I ntelligens R endszerek E lmélete 4.
Prím algoritmus.
Dijkstra algoritmus. Kiválasszuk a legkisebb csúcsot, ez lesz a kezdőcsúcs, amit 0-val címkézünk és megjelöljük sárgaszínnel. Szomszédjai átcímkézése.
„Országos” feladat. Feladat: Egy tetszőleges, színes országokat tartalmazó térképen akar eljutni egy kommandós csapat egy országból egy másikba. Viszont.
Szélességi bejárás A szélességi bejárással egy irányított vagy irányítás nélküli véges gráfot járhatunk be a kezdőcsúcstól való távolságuk növekvő sorrendjében.
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Nevezetes algoritmusok Beszúrás Van egy n-1 elemű rendezett tömbünk. Be akarunk szúrni egy n-edik elemet. Egyik lehetőség, hogy végigszaladunk a tömbön,
Mélységi bejárás.
Gráf szélességi bejárása
Készítette: Lakos Péter.  Adott egy élsúlyozott, véges gráf  Negatív élsúlyokat nem tartalmaz  Lehet irányított vagy irányítatlan  Továbbá adott egy.
Lénárt Szabolcs Páll Boglárka
Listák, Vermek és Várakozási Sorok. Vermek Def: Egy sajátos lista amelyben minden beszúrási illetve törlési művelet csak a lista egyik végén történik.
Hierarchikus lista Kétféle értelemezése van:
Tömbök és programozási tételek
Rendezések és szövegkezelő függvények
Összetett adattípusok
1 AAO folytatás ++ Csink László. 2 Rekurzív bináris keresés (rendezett tömbben) public static int binker(int[] tomb, int value, int low, int high) public.
Fák.
A Dijkstra algoritmus.
Nevezetes algoritmusok: Fa megvalósítása Készítette: Várkonyi Tibor Zoltán.
Logikai programozás 5..
1 Szélességi Bejárás Györgyi Tamás – GYTNAAI.ELTE 2007 Március 22 Algoritmusok És Adatszerkezetek 2 Gráfalgoritmus S b a d e f h g c.
1 Dijkstra Algoritmusa Györgyi Tamás – GYTNAAI.ELTE 2007 Április 02 Algoritmusok És Adatszerkezetek 2 Gráfalgoritmus S a b c d e
Az ábrán az inicializáló blokk lefutása utáni állapotot láthatjuk. A KÉSZ halmazhoz való tartozást színezéssel valósítjuk meg. A nem KÉSZ csúcsok fehérek,
Mélységi bejárás Az algoritmus elve: Egy kezdőpontból kiindulva addig megyünk egy él mentén, ameddig el nem jutunk egy olyan csúcsba, amelyből már nem.
Kruskal-algoritmus.
Feladatok (értékadás)
Business Mathematics A legrövidebb út.
Algoritmus és adatszerkezet Tavaszi félév Tóth Norbert1 Floyd-Warshall-algoritmus Legrövidebb utak keresése.
Útkeresések.
SZÉLESSÉGI BEJÁRÁS Pap Imre DVX468. A bejárás Meglátogatjuk az első csúcsot, majd ennek a csúcsnak az összes szomszédját. Aztán ezen szomszédok összes.
Objektum orientált programozás
Diszjunkt halmazok adatszerkezete A diszjunkt halmaz adatszerkezet diszjunkt dinamikus halmazok S={S 1,…,S n } halmaza. Egy halmazt egy képviselője azonosít.
Gráf szélességi bejárása. Cél Az algoritmus célja az, hogy bejárjuk egy véges gráf összes csúcsát és kiírjuk őket a kezdőcsúcstól való távolságuk szerint.
Szélességi bejárás Gráf-algoritmusok Algoritmusok és adatszerkezetek II. Gergály Gábor WZBNCH1.
Prim algoritmus Algoritmusok és adatszerkezetek 2. Újvári Zsuzsanna.
MÉLYSÉGI BEJÁRÁS FZGAF0 – PINTÉR LÁSZLÓ. ALGORITMUS ELMÉLETE Egy s kezdőpontból addig megyünk egy él mentén, ameddig el nem jutunk egy olyan csúcsba,
Szélességi bejárás. Véges gráf összes csúcsának bejárása a kezdőcsúcstól való távolságuk szerinti növekvő sorrendben Egy csúcsot egyszer járunk be Egyenlő.
Dijkstra algoritmus. Az algoritmus működése  Kezdésnél a kezdő csúcson kívül minden csúcs távolsága legyen ∞, a kezdő csúcs távolsága 0.  Feltételes.
Algoritmus DAG = irányított körmentes gráf. Először ezt a tulajdonságot ellenőrizzük (mélységi bejárással), aztán rendezzük: Q: Sor adatszerkezet, kezdetben.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozás II. Gráfok Dijkstra algoritmus Kruskal algoritmus.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Alapvető programozási tételek megvalósítása Czigléczky Gábor 2009.
A Dijkstra algoritmus.
Gráfok szélességi bejárása Dijkstra algoritmus
BFák Kiegyensúlyozott keresőfák
Piros-fekete fák Beszúrás, ill. törléskor a fa elveszítheti az egyensúlyát. A piros-fekete fák: az egyensúly megtartását biztosítják. +1 bit információ.
Algoritmusok és Adatszerkezetek I.
Nem módosítható keresések
Informatikai gyakorlatok 11. évfolyam
Algoritmusok és Adatszerkezetek I.
Gráfalgoritmusok G=(V,E) gráf ábrázolása
Dijkstra algoritmusa: legrövidebb utak
Dijkstra algoritmusa: legrövidebb utak
Dijkstra algoritmusa: legrövidebb utak
Gráfalgoritmusok G=(V,E) gráf ábrázolása
2-3-fák A 2-3-fa egy gyökeres fa az alábbi tulajdonságokkal:
Előadás másolata:

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.)

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…)

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.

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.

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.

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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Alkalmazások: MI: n – királynő probléma: http://students.ceid.upatras.gr/~papagel/project/kef5_8.htm Tic-tac-toe: http://ostermiller.org/calc/tictactoe.html http://boulter.com/ttt/