• Nem Talált Eredményt

A* keresés: a teljes becsült útköltség minimalizálása

In document Mesterséges Intelligencia (Pldal 122-128)

Az önhurkokat a nagyobb áttekinthetőség érdekében az ábrából kihagytuk

1. Informált (heurisztikus) keresési stratégiák

1.2. A* keresés: a teljes becsült útköltség minimalizálása

A legjobbat-először keresés leginkább ismert változata az A* keresés (a kiejtése ’A csillag’). A csomópontokat úgy értékeli ki, hogy összekombinálja g(n) értékét – az aktuális csomópontig megtett út költsége – és h(n) értékét – vagyis az adott csomóponttól a célhoz vezető út költségének becslőjét:

f(n) = g(n) + h(n)

Mivel g(n) megadja a kiinduló csomóponttól az n csomópontig számított útköltséget, és h(n) az n csomóponttól a célcsomópontba vezető legolcsóbb költségű út költségének becslője, így az alábbi összefüggést kapjuk:

f(n) = a legolcsóbb, az n csomóponton keresztül vezető megoldás becsült költsége.

Így amennyiben a legolcsóbb megoldást keressük, ésszerű először a legkisebb g(n) + h(n) értékkel rendelkező csomópontot kifejteni. Ezen stratégia kellemes tulajdonsága, hogy ez a stratégia több mint ésszerű: amennyiben a h függvény eleget tesz bizonyos feltételeknek, az A* keresés teljes és optimális.

Az A* optimalitását könnyű elemezni, ha az algoritmust a FA-KERESÉS-sel együtt alkalmazzuk. Ilyenkor A* optimális lesz, ha h(n) egy elfogadható heurisztika (admissible heuristic), azaz ha h(n) soha nem becsüli felül a cél eléréséhez szükséges költséget. Az elfogadható heurisztikák természetükből adódóan optimisták, mivel úgy gondolják, hogy a probléma megoldása kisebb költséggel jár, mint amekkora költséget a megoldás valójában igényel. Mivel g(n) az n csomópont elérésének pontos költsége, azonnali következményként adódik, hogy f(n) soha sem becsüli túl az n csomóponton keresztül vezető legjobb megoldás valódi költségét.

Az elfogadható heurisztikus függvények talán egyik legnyilvánvalóbb példája a Bukarestbe történő utazás során felhasznált hLMT légvonalban mért távolság. A légvonalban mért távolság elfogadható, mert bármely két pont között a legrövidebb távolság a légvonalban mért távolság, így a légvonalbeli táv soha nem becsülhet túl. A 4.3.

ábra a Bukarestet kereső A* fakeresés előrehaladását mutatja. A g értékeket a 3.2. ábrán látható lépésköltségekből számítjuk ki, a hLMT értékei a 4.1. ábrán adottak.

Fontos

Vegyük észre, hogy Bukarest először az (e) lépés peremében jelent meg, azonban kifejtésre nem került, mert Bukarest f-értéke (450) magasabb, mint Piteştié (417). Ezt úgy lehetne megmagyarázni, hogy lehet, hogy Piteştin keresztül létezik egy 417 költségű olcsó megoldás, így az algoritmus egy 450 költségű megoldást nem fog választani. Ebből a példából megalkothatjuk annak az általános bizonyítását, hogy a FA-KERESÉS-t használó A* algoritmus optimális, ha h(n) elfogadható. Tegyük fel, hogy a peremen egy G2 szuboptimális célcsomópont jelenik meg, és az optimális megoldás költsége legyen C*. Így mivel G2 szuboptimális és h(G2) = 0 (ami minden célállapotra igaz), tudjuk, hogy:

f(G2) = g(G2) + h(G2) = g(G2) > C*

Gondoljunk most egy perembeli n csomópontra, amely a megoldási útvonalon fekszik (ilyennek mindig léteznie kell, ha a megoldás létezik). Ha h(n) nem becsüli túl a megoldáshoz vezető út folytatását, akkor tudjuk, hogy:

f(n) = g(n) + h(n) ≤ C*

Kimutattuk tehát, hogy f(n) ≤ C* < f(G2), így G2 nem kerül kifejtésre, és az A* egy optimális megoldással tér vissza.

A bizonyítás összeomlik, ha a FA-KERESÉS helyett a 3.19. ábra szerinti GRÁF-KERESÉS algoritmust használjuk.

Az algoritmus visszatérhet szuboptimális megoldással, mert a GRÁF-KERESÉS algoritmus elvetheti az ismétlődő állapothoz vezető optimális utat, ha az nem elsőnek került kiszámításra (lásd 4.4. feladat). A problémát kétféle módon lehet megoldani. Az első megoldás a GRÁF-KERESÉS olyan kiterjesztése, hogy az az ugyanahhoz a csomóponthoz vezető két út közül a drágábbat fogja elvetni (lásd az értékelést a 3.5. alfejezetben). A pótlólagos adminisztrálás nem egyszerű, de az optimalitást garantálni fogja. A második megoldásnál azt kell biztosítani, hogy a bármelyik ismétlődő csomóponthoz vezető optimális út mindig az, amit az algoritmus elsőnek követ – mint ahogy ez az egyenletes költségű keresésénél volt. Ez a tulajdonság akkor áll fenn, ha a h(n) függvényre extra követelményeket fogalmazunk meg, megkövetelve annak konzisztenciáját (consistency), másképpen monotonitását (monotonicity). A h(n) heurisztikus függvény konzisztens, ha minden n csomópontra és annak egy tetszőleges a cselekvéssel generált minden n′ utódcsomópontjára az n csomóponttól elért cél becsült költsége nem kisebb, mint az n′ -be kerülés lépésköltsége és az n′ csomóponttól elért cél becsült költsége:

h(n) ≤ c(n, a, n′) + h(n′)

Ez az általános háromszög egyenlőtlenség (triangle inequality) egy formája, amely azt fejezi ki, hogy egy háromszög egy oldala sem lehet hosszabb, mint a két másik oldal összege. Itt a háromszöget az n, az n′ és az n-hez legközebbi cél határozza meg. Könnyű megmutatni (4.7. feladat), hogy minden konzisztens heurisztika egyben elfogadható is.

Fontos

A konzisztencia legfontosabb következménye az, hogy: a GRÁF-KERESÉS-t használó A* algoritmus optimális, ha h(n) konzisztens.

4.3. ábra - Az A* keresés lépései Bukarest keresése során. A csomópontok az f = g + h

értékekkel vannak felcímkézve. A h-értékek a Bukaresttől légvonalban mért

távolságokat jelölik, melyeket a 4.1. ábrából vettünk át.

Bár a konzisztencia az elfogadhatóságnál szigorúbb követelmény, igazán nehéz olyan elfogadható heurisztikát találni, ami nem lenne egyben konzisztens. Az ebben a fejezetben tárgyalt összes elfogadható heurisztika mind konzisztens. Vegyük például a hLMT-t. Tudjuk, hogy az általános háromszög egyenlőtlenség teljesül, ha az oldalakat egyenes vonalú távolságokkal mérjük, és hogy az n és n′ közötti egyenesvonalú távolság c(n, a, n′)-nél nem nagyobb. A hLMT így egy konzisztens heurisztika.

Fontos

A konzisztencia egy másik fontos következménye az, hogy ha h(n) konzisztens, akkor az f(n) értékek akármilyen út mentén nem csökkennek. A bizonyítás bizonyos a mellett közvetlenül következik a konzisztencia definíciójából. Tegyük fel, hogy n′ az n utódja, ekkor:

g(n′) = g(n) + c(n, a, n′)

és

f(n′) = g(n′) + h(n′) = g(n) + c(n, a, n′) + h(n′) ≥ g(n) + h(n) = f (n)

A GRÁF-KERESÉS-t használó A* algoritmus által kifejtett csomópontok sorozata tehát f(n)-ben nem csökkenő. A kifejtésre választott első célcsomópont így egy optimális megoldás is egyben, mert minden utána következő csomópont legalább ilyen költséges lenne.

Ha az f-költségek sohasem csökkenek, bármilyen utat választunk, akkor az állapottérben határvonalakat (contour) húzhatunk be, hasonlóan egy topografikus térkép kontúrjaihoz. A 4.4. ábra erre mutat egy példát. A 400-zal felcímkézett határvonalon belül az összes csomópont f(n) értéke nem nagyobb 400-nál, és hasonló érvényes a többire is. Mivel az A* keresési algoritmus a legkisebb f értékkel rendelkező levélcsomópontot fejti ki először, láthatjuk, hogy az A* keresési algoritmus a gyökércsomópontból legyezőszerűen halad kifelé, növekvő f értékekhez tartozó koncentrikus sávokban hozzáadva a csomópontokat.

Az egyenletes költségű keresés esetén (A* keresés h = 0 mellett) a csomópontsávok a kiinduló csomópont köré húzott koncentrikus „köröket” alkotnak. Pontosabb heurisztikus függvény alkalmazásával a sávok a célállapot felé elnyúlnak, és keskenyebben fókuszálódnak az optimális út körül. Ha C* az optimális megoldási út költségét jelöli, akkor az alábbiakat jelenthetjük ki:

• Az A* keresési algoritmus kifejti az összes f(n) < C* értékkel rendelkező csomópontot.

• Ezek után az A* keresési algoritmus egy célcsomópont kiválasztása előtt még kifejthet néhány csomópontot a

„célhatárvonalon”, amelyekre f(n) = C*.

Intuitíven nyilvánvaló, hogy az első megtalált megoldásnak optimális megoldásnak kell lennie, hiszen a következő határvonalakon az összes csomóponthoz nagyobb f költség, ebből adódóan nagyobb g költség tartozik (mivel minden célállapotra h(n) = 0). Intuitíven az is nyilvánvaló, hogy az A* keresési algoritmus teljes.

Ahogy egyre növekvő f értékű sávokat adunk a kereséshez, előbb-utóbb elérünk egy sávot, amelyhez tartozó f érték megegyezik egy célállapothoz vezető út költségével.4

4.4. ábra - Románia térképe. Az ábra Arad mint kiinduló állapot esetén az f = 380, f = 400 és f = 420 értékekhez tartozó határvonalat mutatja. Egy adott határvonalon belüli csomópontokhoz a határvonal értékénél kisebb f költség tartozik.

4 A teljesség megkívánja, hogy a C* költségnél kisebb vagy azzal egyenlő költségű csomópontokból véges sok legyen. Ez a feltétel akkor lesz igaz, ha minden lépésköltség egy véges ε-nál nagyobb és b véges.

Vegyük észre, hogy az A* nem fejt ki f(n) > C* tulajdonságú csomópontokat. A 4.3. ábrán például Temesvár nem kerül kifejtésre annak ellenére, hogy ez a gyökérnek egy utódcsomópontja. Azt mondjuk, hogy a Temesvár alatti fát lenyestük (pruned). Mivel hLMT elfogadható, az algoritmus biztonságosan figyelmen kívül hagyhat egy ilyen fát, miközben az optimalitást garantálja. A nyesés gondolata – a lehetőségek eliminálása anélkül, hogy megvizsgálnánk azokat – igen fontos az MI sok területén.

Egy végső észrevétel, az ilyen típusú – a gyökérből kiinduló utakat bővítő – optimális algoritmusok közül az A* keresési algoritmus bármely adott heurisztikus függvény mellett optimális hatékonyságú (optimally efficient).

Ez azt jelenti, hogy egyetlen más optimális algoritmus sem fejt ki garantáltan kevesebb csomópontot, mint az A* (kivéve talán az f(n) = C* típusú csomópontok körét, ahol holtverseny alakulhat ki). Ez azért van, mert az összes olyan algoritmus, amelyik nem fejti ki az összes csomópontot, melyre f(n) < C*, kockáztatja az optimális megoldás elkerülését.

Felettébb örömteli hír számunkra, hogy az A* keresési algoritmus teljes, optimális és az összes ilyen jellegű algoritmus között optimálisan hatékony. Sajnos ez azonban nem jelenti azt, hogy az A* algoritmus megoldja az összes kereséssel kapcsolatos problémánkat. A buktató a dologban az, hogy a legtöbb probléma esetén a csomópontok száma a keresési tér célhatárvonalon belüli részén a megoldás hosszának még mindig exponenciális függvénye. Bár az eredmény bizonyítása túlmutat ezen könyv keretein, megmutatható, hogy az exponenciális növekedéssel mindenképp szembe kell néznünk, kivéve, ha a heurisztikus függvényünk hibája legfeljebb az aktuális útköltség logaritmusával nő. Az exponenciálisnál lassabb növekedés feltétele matematikai megfogalmazásban:

|h(n) – h*(n)| ≤ O(log h*(n))

ahol h*(n) az n csomópontból a célcsomópontba való eljutás valódi költségét jelöli. Majdnem minden, a gyakorlatban használt heurisztikus függvény esetén a hiba legalább arányos az útköltséggel, és az ebből adódó exponenciális növekedéssel egyetlen számítógép sem tud megbirkózni. Ezért ahhoz ragaszkodni, hogy egy optimális megoldást találjunk, gyakran nem is praktikus. Használhatjuk az A* olyan változatát, amely a szuboptimális megoldásokat gyorsan megtalálja, vagy pedig dolgozhatunk pontosabb, de nem elfogadható heurisztikákkal. Egy jól megválasztott heurisztikus függvény ettől függetlenül a nem informált keresési algoritmusokhoz képest jelentős megtakarítást eredményezhet. A 4.2. alfejezetben megvizsgáljuk, hogy hogyan is lehet jó heurisztikus függvényt tervezni.

Az A* algoritmusnak azonban nem a szükséges számítási idő a nagy problémája. Mivel az összes legenerált csomópontot a memóriában tárolja (ahogy ezt az összes GRÁF-KERESÉS algoritmus teszi), ezért az algoritmus általában lényegesen hamarabb felemészti a rendelkezésére álló memóriát, mintsem kifutna az időből. Ezért az A* sok nagyméretű problémához nem praktikus. A közelmúltban kifejlesztett algoritmusok a végrehajtási idő

kismértékű növekedése mellett a memóriaproblémát megoldották, anélkül hogy feláldoznák az optimalitást vagy a teljességet. Ezekkel az algoritmusokkal fogunk most foglalkozni.

In document Mesterséges Intelligencia (Pldal 122-128)