Iteratív mélyítés A* algoritmus

Az iteratív mélyítésű A* (IDA*) algoritmusa egy gráfbejáró útkereső algoritmus, amely egy kijelölt kezdőpont és a célpontok halmazának bármely eleme között megtalálja a legrövidebb utat. Az iteratív, mélységi keresés egy változata, alapötlete, hogy egy heurisztikus függvényt használ annak a kiértékelésére, hogy mennyi a fennmaradó költsége a cél elérésének az A* kereső algoritmusban. Mivel egy mélységi kereső algoritmus, a memóriaigénye kevesebb, mint az A algoritmusé, de ellentétben a szokásos iteratív mélyítéssel, a legígéretesebb csomó megtalálására fókuszál, éppen ezért nem megy mindenhol ugyanabba a mélységbe a keresőfában. Az A* -gal ellentétben az IDA* nem használ dinamikus programozást, így gyakran ugyanazokat a csomópontokat járja be újra és újra.

Míg a standard iteratív mélységi kereső a keresési mélységet használja minden egyes iterációhoz, az IDA* a sokkal egyértelműbb képletet alkalmazza, ahol a gyökértől az n. csomópontig való eljutás költsége, egy problémaspecifikus heurisztikus becslése n-től a célig való eljutás költségének.

Az algoritmust először Richard Korf írta le 1985-ben.[1]

Leírás szerkesztés

Az iteratív A* algoritmus a következőképpen működik. Minden egyes iterációnál végrehajt egy mélységi keresést a fán, és levág egy ágat, aminek a teljes   költsége meghalad egy adott küszöböt. Ez a küszöb a költség becsült értéke kezdeti állapotban, és minden egyes iterációval emelkedik. Minden iterációnál a következő iterációhoz használt küszöbérték az összes érték minimális költsége, amely meghaladta az aktuális küszöböt.[2]

Akárcsak az A*-nál, a heurisztikának bizonyos tulajdonságokkal kell rendelkeznie az optimálisság garantálása érdekében (legrövidebb utak). Lásd később a tulajdonságoknál.

 path aktuális keresési útvonal (úgy viselkedik, mint egy verem)
 node aktuális csomópont (az utolsó csomópont az aktuális útvonalon)
 g az aktuális csomópont elérésének költsége
 f a legolcsóbb út becsült költsége (gyökér..csomópont .. cél)
 h ( node ) a legolcsóbb útvonal becsült költsége ( csomópont .. cél)
 cost ( node, succ ) lépés költségfüggvény
 is_goal (node) cél teszt
 successors (node ) bővítő függvény, kibővített csomópontok g + h szerint (csomópont)
  ida_star ( root ) vagy NOT_FOUND-ot, vagy a legjobb elérési utat és annak költségét adja vissza
 
 eljárás ida_star ( root )
  bound   : = h ( root )
  path   : = [ root ]
  ciklus
   t   : = keresés ( path, 0, bound )
   ha t = FOUND, then return (path, bound)
   ha t = ∞, then return NOT_FOUND 
   bound   : = t
   ciklus vége
 eljárás vége
 
 függvény keresés ( path, g, bound )
  node   : = path.last
  f   : = g + h ( node )
  ha f > bound, then return f
  ha is_goal ( node ), then return FOUND
  min   : = ∞
  for succ in successors (node) do
   ha succ not in path, then
    path.push(succ)
    t   : = keresés ( path, g + cost( node, succ ), bound )
    ha t = FOUND, then return FOUND
    ha t < min, then min   : = t
    path.pop()
   ha vége
  for vége
  return min
 függvény vége 

Tulajdonságok szerkesztés

Akárcsak A*, IDA* is garantáltan megtalálja a legrövidebb utat egy adott kezdeti csomóponttól bármely célig az adott gráfban, ha a heurisztikus függvény megengedő,[2] azaz

 

bármely n csomópontra, ahol h* az n től induló legrövidebb út elérésének tényleges költsége a legközelebbi célhoz (a "tökéletes heurisztika").[3]

Az IDA* akkor hasznos, ha a probléma memóriakapacitása korlátozott. Az A* keresés eltárolja számos fel nem fedett csomópont sorozatát, ami így gyorsan telíti a memóriát. Ezzel szemben, mivel az IDA* csak az aktuális úton lévő csomópontokat tárolja el, a memóriaigénye az általa gyártott megoldás hosszával egyenesen arányos. Időbeli összetettségét Korf és munkatársai úgy vizsgálták, hogy feltételezték, hogy a h heurisztikus költség értékének becslése konzisztens, azaz

 

bármely n csomóra és annak n’ szomszédjára. Azt a következtetést vonták le, hogy összehasonlítva egy brute-force fabejáró algoritmussal egy exponenciális méretű feladaton, IDA kisebb keresési mélységbe megy (egy konstans tényezővel kisebb), de az elágazási tényező nem változik.[4]

A rekurzív legjobbat-először keresés egy másik memóriaigényes fajtája az A* nak, ami a gyakorlatban gyorsabb az IDA* algoritmusnál, mivel kevesebb csomópontot kell újragenerálnia.[3]

Alkalmazások szerkesztés

Az IDA* elsősorban olyan problémákra alkalmazható jól, mint a tervezés.[5]

Jegyzetek szerkesztés

  1. 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.  
  2. a b Korf (1985). „Depth-first iterative deepening” (english nyelven), 7. o.  
  3. a b Bratko, Ivan. Prolog Programming for Artificial Intelligence. Pearson Education, 282–289. o. (2001) 
  4. Korf (2001). „Time complexity of iterative-deepening-A∗”. Artificial Intelligence 129 (1–2), 199–218. o. DOI:10.1016/S0004-3702(01)00094-7.  
  5. Bonet (2001). „Planning as heuristic search”. Artificial Intelligence 129 (1–2), 5–33. o. DOI:10.1016/S0004-3702(01)00108-4.  

Fordítás szerkesztés

Ez a szócikk részben vagy egészben az Iterative deepening A* című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.