Szerkesztő:BotlikRoland/Iteratívan mélyülő mélységi keresés
A számítástechnikában az iteratívan mélyülő keresés (IDA) vagy pontosabban az iteratívan mélyülő mélységi keresés[1] (IDDFS) egy állapottér / gráf keresési stratégia, amely a mélységi keresés egy mélységkorlátozott verziója, melyben ismételten fut végig a gráf elemein egyre nagyobb mélységben, amíg meg nem találja a keresett elemet. Az IDDFS optimális, akárcsak a szélességi keresés, de sokkal kevesebb memóriát használ; minden iterációban az adott mélységben azonos módon járja be a gráf csúcsait, mint a mélységi keresés, de kumulált sorrendben a csúcsokat valójában a szélességi keresés sorrendjében látogatja meg először.
Algoritmus irányított gráfokra
[szerkesztés]A következő pszeudokód az iteratívan mélyülő mélységi keresést (IDDFS) mutatja be egy irányított gráfon alkalmazott rekurzív mélységkorlátozott mélységi keresés (DLS) szempontjából. Az IDDFS ezen megvalósítása nem veszi figyelembe a már meglátogatott csúcsokat, ezért nem működik irányítatlan gráfokon.
function IDDFS(root) is for depth from 0 to ∞ do found, remaining ← DLS(root, depth) if found ≠ null then return found else if not remaining then return null function DLS(node, depth) is if depth = 0 then if node is a goal then return(node, true) else return (null, true) (Nem találtuk meg, de még lehet gyerekeleme) else if depth > 0 then any_remaining ← false foreach child of node do found, remaining ← DLS(child, depth−1) if found ≠ null then return (found, true) if remaining then any_remaining ← true (Legalább egy csúcsot találtunk az adott mélységben, ezért hagyjuk az IDDFS-t tovább dolgozni) return (null, any_remaining)
Ha megtaláljuk a keresett csúcsot, akkor a DLS megállítja a rekurziót és visszaadja, hogy nem kell több iteráció. Különben, ha van akár egy elem is azon abban a mélységben, akkor a remaining változó engedi az IDDFS függvényt tovább futni.
A rendezett kettesek hasznosak, mint visszatérési értékek, mert ezzel vezérelhetjük az IDDFS-t, hogy folytassa a mélyítést, vagy álljon meg, abban az esetben, ha nem tudjuk, hogy a keresett elem milyen mélységben található. Másik megoldásként használhatunk egy megkülönböztetett értéket, ami jelezni tudja, hogy nem találtuk meg a keresett értéket, vagy visszaadja a hátralévő csúcsokat.
Tulajdonságok
[szerkesztés]Az IDDFS egyesíti a mélységi keresés tárhatékonyságát és a szélességi keresés teljességét (ha véges számú él indul csak csúcsokból). Ha létezik megoldás, akkor a legrövidebb utat adja vissza (legkevesebb éllel rendelkező utat).[2]
Mivel iteratív mélyítésnél a csúcsokat többször is érintjük, pazarlásnak tűnhet az ilyen módon történő bejárás, de mivel a legtöbb csúcs a fa legalsó szintjén található, ezért a fentebbi szinteken lévő csúcsok érintése nagyságrendileg nem számít túl sokat.
Az IDDFS fő előnye a játék fa alapú keresésekben, hogy a keresés eleje hajlamos javítani a gyakran használt heurisztikus algoritmusokat - pl. a gyilkos lépés heurisztikáját vagy az alfa-béta vágást - így az egyes ágakra egy pontosabb becslést tud adni és a keresés korábban befejeződik, mert összességében jobb sorrendben dolgozzuk fel a fát. Például az alfa-béta vágás akkor a leghatékonyabb csak, ha elsőre a legjobb lépést vizsgálja.
A második előnye, hogy az algoritmus gyorsan reagál, mert a kezdeti iterálásoknál kis (mélység) -t használ, és ezeket extrém gyorsan tudja kiszámolni. Ez lehetővé teszi az algoritmus számára, hogy a keresés már a futás korai stádiumában, szinte azonnal jó irányba induljon, és növekedésével ez csak egyre pontosabbá válik. Interaktív környezetben, például sakkjátszó programban történő alkalmazás esetén ez a képesség lehetővé teszi a program számára, hogy bármikor elvégezhessen egy lépést, az addig a pillanatig elvégzett keresés aktuálisan legjobbnak ítélt lépéssel. Ezt megfogalmazhatjuk úgy is, hogy a keresés minden mélységnél egyre pontosabb választ ad corekurzív (a rekurzió ellentéte) módon, habár minden egyes lépésén belül egyébként rekurzívan jár el. A hagyomás mélységi keresés erre nem képes, nem tud bármely pillanatban eredményt adni.
Aszimptotikus elemzés
[szerkesztés]Időbonyolultság
[szerkesztés]Az IDDFS időbonyolultsága egy (kiegyensúlyozott) fában megegyezik a szélességi-keresésével, azaz , ahol az elágazási tényező és pedig a keresett érték mélysége.
Bizonyítás
[szerkesztés]Egy iteratívan mélyülő keresésben a csomópontok adott mélységben 1-szer ágazik el , pedig kétszer ágazik el, és így tovább egészen a keresési fa gyökeréig, ami -szer ágazik el. Így az elágazások száma összesen egy iteratív mélységi keresésben:
ahol az elágazások száma mélységen, az elágazások száma mélységen és így tovább. Abban az esetben, ha kiemelünk -t, akkor a következő képletet kapjuk:
Most nézzük meg, mi történik, ha Így most a képletünk a következőképpen alakul:
Ez kevesebb, mint a végtelen sorozat
amely képlet a következőhöz konvergál
- , ha
Vagyis, ahova eljutottunk az a következő:
, ha
Mióta tudjuk, hogy vagy biztosan egy konstans, amely független -től (mélység), ha (azaz, ha az elágazási tényező nagyobb mint 1), az iteratív mélységi keresés futási ideje .
Példa
[szerkesztés]Amennyiben és a számunk az alábbi lesz:
Mindent összevetve, egy iteratív mélységi keresés az 1-es mélységből lefelé haladva egészen mélységig csak körülbelül -al több csúcs elágazást tesz (ennyivel több csúcsot vizsgál) mint egy sima szélességi keresésben vagy mint egy mélységében limitált keresésben mélységig, amennyiben .[3]
Minél nagyobb az elágazási tényező, annál kevesebbszer kell vizsgálni a "helytelen" utakat (vagyis ezeket gyorsan ki tudjuk zárni), de még akkor is, ha az elágazási tényező az 2, az iteratív mélységi keresés csupán kétszer olyan hosszú ideig tart, mint egy teljes szélességi keresés. Ez azt jelenti, hogy az időbonyolultsága az iteratív mélyítésnek továbbra is lesz.
Tárbonyolultság
[szerkesztés]Az IDDFS tárbonyolultsága ahol a keresett elem mélysége.
Bizonyítás
[szerkesztés]Mivel az IDDFS bármely pillanatban egy mélységi keresést végez el, csak egy csúcspont ágat kell tárolnia egyszerre, amely ágat éppen vizsgál. Mivel biztosan megtalálja a keresett elemet a fában, jelen esetben a maximum mélysége lesz, ennélfogva a maximum tárigénye lesz.
Általánosságban, az iteratív mélyítés az előnyben részesített keresési módszer, amennyiben nagy keresési tárhelyünk van és a keresett elem mélysége nem ismert.
Példa
[szerkesztés]A következő grafikonhoz:
Irodalomjegyzék
[szerkesztés]- ↑ Korf (1985). „Depth-first Iterative-Deepening: An Optimal Admissible Tree Search”. Artificial Intelligence 27, 97–109. o. DOI:10.1016/0004-3702(85)90084-0.
- ↑ David Poole: 3.5.3 Iterative Deepening‣ Chapter 3 Searching for Solutions ‣ Artificial Intelligence: Foundations of Computational Agents, 2nd Edition. artint.info. (Hozzáférés: 2018. november 29.)
- ↑ Artificial Intelligence: A Modern Approach (1994. december 1.)
[[Kategória:Gráfalgoritmusok]]