Kétirányú keresés

A Wikipédiából, a szabad enciklopédiából

A kétirányú keresés egy keresőalgoritmus egy gráfban: egy irányított gráfban megkeresi a legrövidebb utat a kezdeti csúcstól a célcsúcsig.

Két keresés zajlik párhuzamosan: az egyik a kezdeti csúcstól előre, a másik a célcsúcstól visszafelé. Amikor találkoznak, az algoritmus leáll. Ezt a technikát az indokolja, hogy sok esetben gyorsabb.

Andrew Goldberg és társai meghatározták a helyes leállási feltételeket a Dijkstra-algoritmusra vonatkozóan.[1]

Akárcsak az A* algoritmus, a kétirányú keresés is vezérelhető a célcsúcsig (az előre mutató fában), illetve a kezdőcsúcsig (a hátrafelé mutató fában) hátralevő út heurisztikus becslésével.

Ira Pohl volt, aki 1971-ben először megtervezett és megvalósított egy kétirányú heurisztikus keresőalgoritmust. A kezdő, illetve a célcsúcsból induló keresőfák nem találkoztak a megoldási tér közepén.[2] Champeaux 1977-ben javította ezt a hibát.[3]

Az egyirányú A* algoritmus által megengedett heurisztikát használó megoldás legrövidebb úthosszal rendelkezik; ugyanez a tulajdonság érvényes a BHFFA2 kétirányú heurisztikus változata számára is, amelyet a de Champeaux ismertetett (1983). A BHFFA2 többek között gondosabb kimeneti feltételekkel rendelkezik, mint a BHFFA.

Leírás[szerkesztés]

A kétirányú heurisztikus keresés egy állapottér-keresés, ahol egy bizonyos állapotból egy másik állapotba kerül. Ez egyidejű kereséssel történik -től -ig és -től -ig. Egy érvényes operátor listával tér vissza, amelyeket -re alkalmazva megkapjuk -t.

Bár úgy tűnhet, hogy az operátoroknak a fordított kereséshez invertálhatónak kell lenniük, csak akkor szükséges, ha bármilyen csomópontra meg akarjuk találni szülőcsomópontjainak halmazát úgy, hogy minden szülő csomópontból létezzen néhány érvényes operátor -hez. Ezt gyakran hasonlítják az útvonal-keresési területen egy egyirányú utcához: nem szükséges mindkét irányba haladni, de az utca végén állva meg kell határozni az utca kezdetét, mint lehetséges útvonalat.

Hasonlóképpen, az inverz ívekkel rendelkező élekhez (például az ívek minden irányba futnak) nem szükséges, hogy mindegyik irány azonos költségekkel járjon. A fordított keresés mindig az inverz költséget (például az ív költségét előre irányban) fogja használni. Formálisabban, ha egy csomópont egy szülővel, akkor , amelyet úgy definiálnak, hogy „-től -ig terjedő költség” (Auer Kaindl 2004).

Terminológia és jelölések[szerkesztés]

a keresési fa elágazási tényezője.
az csomópontból az csomópontba való mozgás költsége.
a gyökér és az csomópont közötti költség.
az csomópont és a cél közötti távolság heurisztikus becslése.
a kezdő állapot.
a cél állapota (néha , nem összetévesztendő a függvénnyel).
az aktuális keresési irány. Megegyezés szerint a egyenlő 1-gyel előre irányban és 2-vel hátrafelé irányban (Kwa 1989).
az ellenkező keresési irány (például ).
a keresési fa d irányban. Ha , akkor a gyökér , ha , akkor a gyökér .
a levelei (néha néven hivatkoznak rá). Ebből a készletből választunk ki egy csomópontot a bővítéshez. A kétirányú keresésben ezeket néha „határoknak” vagy „hullámfrontoknak” nevezzük, utalva arra, hogy miként jelennek meg, ha a keresést grafikusan ábrázoljuk. Ebben a metaforában egy „ütközés” akkor következik be, amikor a bővítési fázisban egy „hullámfront” csomópontjának utódai vannak az ellentétes „hullámfronton”.
a leveleket nem tartalmazó csomópontjai. Ez a halmaz tartalmazza a keresés által már érintett csomópontokat.

A kétirányú heurisztikus keresés megközelítései[szerkesztés]

A kétirányú algoritmusok nagyjából három kategóriába sorolhatók:

  • Front-to-Front (elölről előre)
  • Front-to-Back vagy Front-to-End (elölről hátra)
  • kerületkeresés (Kaindl Kainz, 1997)

Ezek a heurisztika kiszámításához használt függvényben különböznek.

Front-to-Back (elölről hátra)[szerkesztés]

Az elölről hátra algoritmusok kiszámítják egy csomópont értékét az és az ellentétes keresési fa gyökéreleme, vagy közötti heurisztikus becslés felhasználásával.

Az elölről hátra a legaktívabban kutatott a három kategória között. A jelenleg legjobb algoritmus (legalábbis a Tizenöt kirakó tartományban) a BiMAX-BS*F algoritmus, amelyet Auer és Kaindl készített 2004-ben.

Front-to-Front (elölről előre)[szerkesztés]

Az elölről előre algoritmusok kiszámítják egy csomópont értékét az n és a néhány részhalmaza közötti heurisztikus becslés felhasználásával. A kanonikus példa a BHFFA (kétirányú heurisztikus front-front algoritmus) példája, ahol a függvény az összes aktuális csomópont és az ellenkező fronton lévő csomópontok közötti összes heurisztikus becslés minimuma. Vagy formálisan:

ahol a az és csomópontok közötti távolság megengedett (vagyis nem túlbecsült) heurisztikus becslését adja vissza.

Az elölről előre algoritmus túlzottan számításigényes. Minden alkalommal, amikor egy csomópont felkerül a nyílt listára, ki kell számítani annak értékét. Ez magában foglalja egy heurisztikus becslés kiszámítását -től az összes szemben lévő halmaz csomópontjához, a fentebb leírtak szerint. Az halmazok nagysága exponenciálisan növekszik minden olyan tartomány esetében, ahol .

Jegyzetek[szerkesztés]

  1. http://www.cs.princeton.edu/courses/archive/spr06/cos423/Handouts/EPP%20shortest%20path%20algorithms.pdf
  2. Pohl, Ira (1971). „Machine Intelligence” 6, 127–140. o, Kiadó: Edinburgh University Press.  
  3. (1977) „An improved bidirectional heuristic search algorithm”. Journal of the ACM 24 (2), 177–191. o. DOI:10.1145/322003.322004.  

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben a Bidirectional search 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.