Keresőalgoritmusok A problémamegoldó ágensek (problem solving agent) keresik a megoldást. Keresik azt a cselekvéssorozatot amely a kívánt állapotba vezet. Ha az algoritmusok nem informáltak (uninformed), a probléma definícióján kívül más információval nem rendelkeznek. Ezen kívül van még informált keresés is (informed). Ezek az algoritmusok rendelkeznek valamilyen elképzeléssel arról, hogy a megoldást merre kell keresni.
Problémamegoldó ágensek Az intelligens ágensek a teljesítménymértéküket maximalizálják. A feladat egyszerűsödik ha az ágens egy célt tud maga elé tűzni, és megpróbálja azt elérni. Legyen az ágensünk a romániai Arad városában országjáró körútja vége felé. Az ágens teljesítménymértékei: le szeretne barnulni, megtanulni románul, meglátogatni a nevezetességeket, élvezni az éjszakai életet, kerülni a másnaposságot, stb. Az ágens rendelkezik egy Bukarest – pl. Párizs repülőjeggyel másnapra. Értelmes célnak tűnik, hogy eljusson Bukarestbe. Az összes olyan célt el lehet vetni amely nem teszi lehetővé, hogy időben Bukarestbe érjen. Ezáltal korlátozva vannak az ágens számára elérhető dolgok száma.
Jól definiált problémák és megoldások Egy probléma megragadásához a következő 4 komponensre van szükség: Kiinduló állapot (initial state), amiből az ágens kezdi a cselekvéseit. A romániai ágens kezdeti állpota pl. Benn(Arad). Az ágens rendelkezésére álló lehetséges cselekvések (actions). A leginkáb használatos leírás az állapotátmenet függvényt alkalmazza (successor function).
Jól definiált problémák és megoldások Egy adott x állapot esetén az állapotátmenet – fv(x) visszaadja a rendezett (cselekvés, utódállapot) párok halmazát. A benn(Arad) állapotban az állapotátmenet függvény a menj(Nagyszeben), benn(Nagyszeben) menj(Temesvár), benn(Temesvár) menj(Nagyzerénd), benn(Nagyzerénd)
Jól definiált problémák és megoldások Az állapottér egy gráfot alkot melynek csomópontjai az állapotok, az élek pedig a cselekvések. Az állapottér egy útja (path) az állapotok egy sorozata, amely állapotokat a cselekvések egy sorozata köt össze. Célteszt (goal test), amely meghatározza, hogy egy adott állapot célállapot-e. A mi esetünkben ez a benn(Bukarest).
Jól definiált problémák és megoldások Útköltség (path cost) függvény, amely minden úthoz hozzárendel egy költséget. A problémamegoldó ágens azt a költségfüggvényt fogja választani amely a saját hatékonysági mértékének felel meg. A Bukarestbe siető ágens számára az idő a lényeg, így az útköltség lehetne az út km-ben kifejezett hossza. Az x állapoból az y állapotba vezető cs cselekvés lépésköltsége (step cost) lk(x,y,cs)
Megoldás A probléma megoldása (solution) a kiinduló állapotból a célállapotba vezető út. A megoldás minőségét az útköltségfüggvény méri, és egy optimális megoldásnak (optimal solution) a megoldások közt a legkisebb lesz az útköltsége.
A problémák megfogalmazása Az előző megfogalmazás a világ sok aspektusát figyelmen kívül hagyta (kivel utazunk, milyen a táj, van-e rendőr az út mellett, mit közvetít a rádió, milyen az időjárás, milyen az út állapota, stb.). Ezeket a részleteket kihagytuk az állapotleírásból. A részletek eltávolítását a reprezentációból absztrakciónak (abstraction) nevezzük.
A problémák megfogalmazása A cselekvéseket is absztrahálni kell. Kocsivezetéskor változik a kocsi és az ágens helye, fogy az özemanyag, szennyeződik a levegő. Mi csak a helyváltoztatást vesszük figyelembe. Számos cselekvést figyelmen kívül hagyunk (rádió bekapcsolása, ablakon való kinézés, „fordítsd a kormányt 3 fokkal balra”).
Megoldások keresése Miután definiáltuk a problémát, a megoldás megkeresése az állapottérben történő kereséssel történik. A keresési fák (search tree) az állpotteret együttesen definiáló kezdeti állapotból és az állapotátmenet függvényből generálnak. Ha egy állapotot több úton is elérhetünk, akkor keresési gráfról beszélünk.
Megoldások keresése
Keresési fa kezdete 3.6
Keresési fa A keresési fa gyökere az a keresési csomópont (search node) amely a benn(Arad) kezdeti állapotnak felel meg. Az első lépésben le kell ellenőrizni, hogy ez-e a célállapot (jussunk el Aradról Aradra). A keresést az aktuális állapot kifejtésével (expanding) tesszük, ezzel az állapotok egy új halmazát generáljuk (generating).
Keresési fa Ekkor három új állapotot kapunk: Benn(Nagyszeben) Benn(Temesvár) Benn(Nagyzerénd) Melyik utat válasszuk? A keresés lényege, hogy kiválasztunk egy utat, a többit pedig későbbre halasztani arra az esetre ha az első változat nem vezet eredményre.
Keresési fa Tegyük fel, hogy előzör Nagyzebent választottuk. Ellenőrizzük, hogy ez célállapot-e (nem), majd kifejtjük. Ekkor benn(Arad), benn(Fogaras), benn(Nagyvárad) és benn(Rimnicu Vilcea) állapotokat kapjuk. A keresést addig folytatjuk amíg meg nem találjuk a megoldást, vagy el nem fogynak a kifejtendő állapotok.
Keresési fa A kifejtendő állapot kiválasztását a keresési stratégia (search strategy) határozza meg.
Állapottér vs. keresési fa A romániai pélában az álapottér csak 20 állapotból áll, minden egyes városhoz tartozik egy állapot. Ebben az állapottérben viszon végtelen sok út vezet, így a keresési fa végtelen sok csomópontból áll. Pl. Arad-Nagyszeben, Arad-Nagyszeben-Arad, Arad-Nagyszeben-Arad-Nagyszeben. Egy jó keresési algoritmus nem követ ilyen utat.
Csomópontok Egy csomópont öt komponensből álló adatszerkezet: Állapot. Az állapottérnek a csomóponthoz tartozó állapota. Szülő csomópont: a keresési fa azon csomópontja amely a klrdlses csomópontot generálta. Cselekvés: a csomópont szülő-csomúpontjára alkalmazott cselekvés Út-költség: a kezdeti állapottól a kérdéses csomópontig vezető út költsége. Mélység: a kezdeti állapottól vezető út lépéseinek a száma.
Csomópont vs. állapot A csomópont egy adatnyilvántartásra használt adatszerkezet, amit a keresési fa leírására használunk. Az állapot a világ egy konfigurációja. Előfordulhat, hogy két különböző csomópont ugyanazt az állapotot tartalmazza.
Csomópontok Nyilván kell tartanunk a legenerált, kifejtésre váró csomópontokat is: ezt a listát peremnek (fringe) nevezzük. A perem minden eleme egy levélcsomópont (leaf node), amelynek a fában nincsenek követői. Az előző ábrán (3.6.) a fák pereme a vastagon bekeretezett csomópontokból áll.
Hatékonyság Teljeséég (completeness): az algoritmus garantáltan megtalálja a megoldást amennyiben az létezik. Optimalitás (optimality): a stratégia megtalálja az optimális megoldást (legkisebb útköltség). Időigény (time complexity): mennyi ideig tart a megoldás megtalálása? Tárigény (space complexity): mennyi memóriára van szükség a keresés elvégzéséhez?
Szélességi keresés (breadth first) A szélességi stratégia (breadth first search) egy egyszerű keresési stratégia ahol először a gyökércsomópontot fejtjük ki, a következő lépésben az összes a gyökércsomópontból generált csomópontot, majd azok követőit, stb. A keresési stratégia minden adott mélységű csomópontot hamarabb fejt ki, mielőtt bármelyik, egy szinttel lejjebbi csomópontot kifejtené.
Szélességi keresés (breadth first)
Ez a keresés teljes. Ha a legsekélyebb célcsomópont véges d mélységben fekszik, a szélességi keresés eljut hozzá az összes nála sekélyebben fekvő csomópontokat kifejtve (ha a b elágazási tényező véges). A legsekélyebb célcsomópont nem mindig optimális (függ az egyes utak költségétől).
Szélességi keresés (breadth first) Mekkorák az időigény és a tárigény? Tegyük fel, hogy minden egyes állapot kifejtésével b új állapot keletkezik. A keresési fa gyökércsomópontja b csomópontot generál az első szinten, amelyek mindegyike újabb b csomópontot (összesen b 2 ) generál a második szinten. A harmadik szint b 3 csomópontot generál, stb.
Szélességi keresés (breadth first) Ha a megoldás d mélységben van, a legrosszabb esetben a d-edik szinten az utolsót kivéve (mert a célt nem fejtjük ki) a csomópontok mindegyikét ki kell fejtenünk a (d+1)-edik szinten b (d+1) -b csomópontot generálva. A generált csomópontok száma: b+b 2 +b b d +b (d+1) -b=O(b (d+1) )
Szélességi keresés (breadth first) Minden legenerált csomópontot a memóriában el kell tárolni, mert vagy a perem eleme, vagy egy perembeli csomópont őse. A komplexitás exponenciális. Feltételezzük, hogy másodpercenként csomópontot generálunk, egy csomópont tárolásához 1000 bájtra van szükség.
Szélességi keresés (breadth first) A tárigény nagyobb probléma mint az időigény, de az időigény még mindig fontos tényező. Az exponenciális komplexitású keresési problémák közül csak a legkisebb problémapéldányok oldhatók meg.
Egyenletes költségű keresés A szélességi keresés optimális, ha minden lépés költsége azonos, mert mindig a legsekélyebb ki nem fejtett csomópontot fejti ki. Az egyenletes költségű keresés (uniform cost search) mindig a legkisebb útköltségű n csomópontot fejti ki először, nem pedig a legkisebb mélységű csomópontot. A szélességi keresés is egyenletes költségű keresés ha minden lépésköltség azonos.
Egyenletes költségű keresés Ez a keresési módszer nem foglalkozik azzal, hogy hány lépésbőláll egy bizonyos út, csak az összköltséggel törődik. Mindig végtelen hurokba kerül ha egy csomópont kifejtése zérus költségű cselekvéshez és ugyanahhoz az állapothoz való visszatérést eredményaz. A teljességet csak úgy garantálhatjuk, ha ha minden lépés költsége egy kis epszilon konstansnál nagyobb.
Egyenletes költségű keresés Ez azt jelenti, hogy egy út költsége az út mentén mindig növekszik. Az első kifejtésre kiválasztott célcsomópont egyben az optimális megoldás is. Ezt a keresést nem a mélység, hanem az útköltség vezérli, ezért a komplexitást nehéz a b és d függvényében jellemezni. Legyen C* az optimális megoldás költsége, és legyen minden cselekvés költsége legalább epszilon.Legrosszabb esetben az idő-és tárigény O(b (1+C*/epszilon) ), ami több lehet mint b d. Ez a keresés képes a kis lépésekből álló nagy fákat felkutatni a nagy és hasznos lépéseket tartalmazó utak előtt.
Mélységi keresés A mélységi keresés (depth first search) mindig a keresési fa legmélyebben fekvő csomópontját fejti ki.
Mélységi keresés A keresés azonnal a fa legmélyebb szintjére jut el, ahol a csomópontoknak már nincsenek követői. Kifejtésüket követően kikerülnek a peremből, és a keresés visszalép ahhoz a következő legmélyebben fekvő csomóponthoz amelynek még vannak ki nem fejtett követői
Mélységi keresés A mélységi keresés szerény tárigényű. Egyetlen, a gyökércsomóponttól egy levélcsomópontig vezető utat kell tárolnia, kiegészítve az út minden egyes csomópontja melletti kefejtetlen csomópontokkal. Egy kifejtett csomópont el is hagyható a memóriából ha az összes leszármazottja meg lett vizsgálva. Ha az elágazási tényező b, a maximális mélység pedig m, a tárigény bm+1. d=12 mélység eseténa keresés 118kbájtot igényelne 10Pbájttal szemben (tízmilliárdos redukció).
Mélységi keresés A mélységi keresés egy változata a visszalépéses keresés (backtracking search). Itt az összes kvető helyett csak egyet generálunk. Minden részben kifejtett csomópont emlékszik, melyik követője jön a legközelebb. Így csak O(m) memóriára van szükség O(bm) helyett.
Mélységi keresés A hátrány, hogy egy rossz választássalegy hosszú (akár végtelen) út mentén lefelé elakadhat, miközben egy más döntés elvezetne a gyökérhez közeli megoldáshoz. A ábrán először kifejti a teljes bal részfát, annak ellenére, hogy a megoldás a C csomópont. Ha a J csomópont is megoldás lenne, akkor az algoritmus azt adná vissza, ezért ez a keresés nem optimális. Ha a bal oldali részfa korlátlanul mély lenne és nem tartalmazna megoldást, a mélységi keresés soha nem állna meg, ezért a keresés nem teljes.
Mélységkorlátozott keresés A végtelen fák problémáját a mélységi keresés úgy küszöböli ki, hogy az utak maximális mélységére egy l korlátot ad. Az l mélységben lévő csomópontokat úgy kezeli mintha nem volnának követői. A módszer neve a mélységkorlátozott keresés MKK (depth limited search, DLS). A mélységkorlát a végtelen út problémáját megoldja, de behozza a nemteljesség egy újabb forrását ha l d-re sem optimális.
Mélységkorlátozott keresés A keresés időigénye O(b^l), tárigénye O(bl). A mélységi keresés olyan speciális méllységkorlátozott keresésnek tekinthető amikor l=végtelen. A mélységi korlátot néha a probléma ismeretére lehet alapozni. Például Románia térképén 20 város található, így tudjuk hogy ha létezik a megoldás akkor az maximálisan 19 lépés hosszú lehet, így l=19 egy lehetséges választás.
Mélységkorlátozott keresés Ha viszont a térképet jobban megnézzük, azt látjuk, hogy minden város maximálisan 9 lépésben elérhető. Ezt a számot az állapottér átmérőjének (diameter) nevezzük.
Iteratívan mélyülő mélységi keresés Ez a módszer (iterative deepening search) egy általános stratégia amit sokszor a mélységi kereséssel együtt alkalmaznak a legjobb mélységkorlát megtalálására. Az algoritmus fokozatosan növeli a mélységkorlátot (0, 1, 2,...) amíg meg nem találja a célt. Ez akkor következik be ha a mélységkorlát eléri a d-t, a legsekélyeben fekvő célcsomópont mélységét. Az iteratívan mélyülő keresés ötvözi a szélességi és a mélységi keresés előnyeit.
Iteratívan mélyülő mélységi keresés A mélységi kereséshez hasonlóan szerény O(bd) a memóriaigénye. A szélességi kereséshez hasonlóan teljes ha az elágazási tényező véges, és optimális ha az útköltség a csomópontok mélységének nem csökkenő függvénye. A 3.15 ábra ennek a keresésnek az első 4 iterációját mutatja be egy bináris fán, ahol az algoritmus a megoldást a negyedik iterációban találja meg.
Iteratívan mélyülő mélységi keresés Ez az algoritmus tékozlónak tűnhet mert sok állapotot többször is kifejt. A legmélyebb szinten (d) található csomópontokat csak egyszer fejtjük ki, egy szinttel feljebb kétszer, stb. Egészen a gyökér gyerekeiig, amelyeket d-szer fejtünk ki. A kifejtett csomópontok össz-száma: Cs(IMK)=(d)b+(d-1)b (1)b d Ez b d időkomplexitás.
Iteratívan mélyülő mélységi keresés
A szélességi keresésnél a legenerált csomópontok száma: Cs(SZK)=b+b b d +b (d+1) -b Ha b=10 és d=5: Cs(IMK)= Cs(SZK)= = Ha nagy a keresési tér, és a megoldás mélysége nem ismert, akkor az iteratívan mélyülő keresés ajánlott.
Kétirányú keresés Az az ötlet, hogy egyszerre elindítsunk egy keresést előre a kiinduló állapotból, illetve hátrafelé a célállapotból, és a keresés akkor fejeződik be ha a két állapot valahol találkozik (3.16 ábra). Az az érv, hogy b (d/2) +b (d/2) sokkal kisebb mint b d, illetve az ábrán a két kisebb kör összterülete kisebb mint annaka nagy körnek a területe amelynek középpontja a kiinduló állapot, és amely a peremével a célállapotot eléri.
Kétirányú keresés 3.16