Előadó: Dr. Várterész Magdolna
Módosítható megoldáskeresők osztályozozása: | 1. visszalépéses (backtrack) |
2. keresőgráffal |
2.2.2.2. Keresőgráffal megoldást keresők
Adatbázis: keresőgráf, egy fa. A
reprezentációs gráfnak a bejárt részét feszítő fa. Egy csúcspont lehet zárt
(az út közbenső csúcsa, rajtuk már továbbhaladtunk), vagy lehet nyílt
(az utak végén álló levelek, itt folytathatjuk majd a keresést).
Minden csúcsnak pontosan egy szülője lesz nyilvántartva a keresőgráfban (mivel
fa). Az éleket visszamutatók segítségével realizáljuk. Így tudunk majd
rekonstruálni.
(A visszalépéses megoldáskereső csak egy utat tartott számon. Itt több
út is számon van tartva, rajtunk múlik, hogy hol folytatjuk).
Művelet: kiterjesztés. Levélelemből kivitelezi a továbblépést, Így tudunk majd élnyire továbbmenni. Az összes lehetséges irányba továbbmegyünk majd. (Egy új, nem kiterjesztett csúcsra alkalmazzuk az összes alkalmazható operátort).
Vezérlő: melyik nyílt csúcs legyen
a következő lépésben kiterjesztve. A kiválasztott nyílt csúcsot tesztelni
tudja (célcsúcs, nem célcsúcs), s van egy út visszafelé is. A nyílt csúcsok
közül kell választania a megoldáskeresőnek.
Nincs megoldás: egyetlenegy nyílt csúcs sincs, amelyen a keresést folytathatnánk.
Szisztematikus keresőgráffal keresők
Szisztematikus keresőgráffal keresők:
2.2.2.2.1. Szélességi és mélységi kereső
A reprezentációs gráf csúcsait oly módon választjuk, hogy az 1. szinten, 2. szinten, stb. lévő csúcsokat vesszük.
mélységi szám: | g(s)=0 | a start csúcsé 0. 0 szintre
van a start -tól |
g(m)=g(n)+1 | a szülő mélységi száma + 1, ahol (n,m)
![]() |
Egy csúcs előállításakor mindig kiszámítjuk a mélységi számát.
Kiterjesztésre melyik csúcsot választjuk ki?
szélességi+mélységi: | egy adott csúcshoz vezető melyik út van éppen |
nyilvántartva? Mindegy, ezért a legelső számontartott | |
utat fogjuk nyilvántartani. |
1.
|
adatbázis inicializálása: |
![]() |
ö
|
|
rögzítsük a mélységi számot: |
0
|
ý
|
S0(0) nyílt (nyílttá tesszük) | |
visszamutató: |
0
|
ø
|
||
(azt is tudni kell, hogy az induló keresőgráf egyetlen csúcsa nyílt-e vagy zárt) | ||||
2.
|
Van-e nyílt csúcs? | |||
nincs: | be kell fejezni, nem tudjuk folytatni | |||
van: | ki kell választani a nyílt csúcsok közül egyet | |||
(az alapján, hogy mélységi v. szélességi a keresés) | ||||
A kiterjesztésre kiválasztott csúcsot teszteljük. | ||||
Célcsúcs? | ||||
nem: | kiterjesztjük, őt zárttá, gyermekeit nyílttá | |||
tesszük. Gyermekek visszamutatnak a szülőre, mélységi szám beírása. Vissza a 2. pontra. | ||||
igen: | sikeres vég, mutatók alapján van egy út vissza |
Szélességi, mélységi keresésnél nem cél az optimális megoldás kiválasztása: ha több út van az adott csúcsba, akkor tetszőlegesen tartjuk nyilván az egyiket (legegyszerűbb, ha maradunk az elsőnél). Mikor tesztelünk, a tesztelést előrehozhatjuk, mert nem cél az optimális megoldás.
Szélességi: tetszőleges reprezentációs gráfban ha
van megoldás, akkor a legkevesebb operátor alkalmazásával előállítható valamelyik
terminális. Mindig a legkisebb mélységi számú csúcsot teszteljük, terjesztjük
ki, ezért a legkisebb hosszúságú megoldást állítjuk elő.
Ha nincs a problémának megoldása, akkor azt a nyílt csúcsok elfogyásával felismeri.
Mélységi: tetszőleges, véges reprezentációs gráfban ha van megoldás, akkor a mélységi kereső megoldás a terminál. Ha nincs megoldás: felismeri.
(Mint látható, nem kell megkövetelni a körmentességet - ellentétben a backtrack-kel).
Implementálás:
Szélességi esetben a nyílt csúcsokat egy sorban tartjuk
nyilván, amelyből pont mélységi szám szerint növekvőleg fognak kijönni.
Mélységi esetben: veremben való kezelés.
Ezt
onnan lehet könnyen megjegyezni, hogy "a sor széles, a verem pedig mély"
:-)
Ha a reprezentációs gráf fagráf: kiterjesztéskor nem kell figyelni, hogy a gyermekek szerepeltek-e már vagy sem, mert nem szerepelhettek! (ui. fagráf esetén egy elemnek csak 1 szülője lehet, így egy elemet csak 1 irnyból, a szülő felől érhetjük el, s nem kell attól félnünk, hogy már korábban egy másik irányból kiterjesztették).
(a szélességi keresés is egyfajta opimális megoldást adott. Költség: út hossza).
r(n,m) ![]() |
,ahol (n,m) ![]() |
Minden csúcsnál számon tartjuk az odavezető út költségét.
g(s)=0 | ||
g(m)=g(n)+r(n,m) | ,ahol (n,m) ![]() |
|
g(n): szülő költsége,
g(n) ![]() |
||
r(n,m): a szülő és gyermek közti él költsége | ||
g*(n) | jelöljük így a start -ból
n -be jutás optimális költségét |
|
g(n) ![]() |
, n ![]() |
A nyílt csúcsok közül azt fogjuk kiterjesztésre kiválasztani, amelyik eddig a legolcsóbb volt (ott reméljük majd a legolcsóbb megoldást). A legkisebb költségű nyílt csúcsot választjuk ki kiterjesztésre.
Ha az új út kisebb költségűnek bizonyul mint a régi, akkor...
n
m
m szerepelt már akeresőgráfban: | ||
![]() |
Ha az új út költsége < régi, akkor | |
átállítjuk a mutatót ill. a költséget (zölddel jelölve) | ||
m lehetett nyílt: | ekkor átállítjuk a mutatót ill. a költséget (lásd fentebb) |
m lehetett zárt: | már vannak részgráfjai! Az m-ből induló részgráf összes |
csúcsába is kisebb költséggel juthatnánk el. Gond! |
DE! Bebizonyítható, hogy ha m zárt, akkor nem található hozzá vezető kisebb költségű út!
![]() |
Mivel m zárt (most ezt feltételezzük), akkor | |
az m-et hamarabb kellett kiterjeszteni,
mint n-et, azaz g(m) ![]() |
||
g(m) ![]() |
||
g(m) < g(n) + r(n,m) | ||
Így tehát az előbbi probléma nem fog minket érinteni. |
Mit garantál az optimális kereső? Tetszőleges reprezentációs gráfban ha van megoldás, akkor az optimális megoldással terminál. Ha nincs megoldás: jelzi.
Tesztelés: mikor teszteljük a csúcsokat, hogy terminális-e? Ez időnként előrehozható, például kiterjesztéskor, amikor előállítunk egy csúcsot akkor rögtön tesztelhetjük. Ez viszont csak csak szélességi és mélységi keresésnél működik ilyeténképpen, optimálisnál nem (ott csak kiválasztás után).
Heurisztikus keresőgráf
Heurisztika: a szisztematikus keresőgráffal
keresők a gráf jóval nagyobb részét használják (egy egész fát, míg a korábbiak
jóval kisebbet).
A heurisztika trükk, egyszerűsítés, mely a nagyméretű reprezentációs gráfban
a keresést tudja korlátozni. Csak a gráf azon részét kelljen előállítani, amelyben
a megoldást reméljük a tudásunk alapján (míg a szélességi bizonyos mélységig
az egészet feltárja).
Példa:
szélességi keresés esetén:
1 csúcsnak van d gyermeke, s l hosszú a legrövidebb megoldás. Hány csúcsú keresőgráfot állítana ez elő?
Vagyis a megoldás mérete a megoldás hosszának exponenciális mérete.
Heurisztikával: a nyílt csúcsok közül ha mindig azt terjesztenénk ki, ahol a megoldást reméljük:
1 + d + d + ... + d = 1 + l × d
Ez az ún. perfekt heurisztika. Persze perfekt heurisztikánk NINCS (hiszen ha ismernénk a megoldást, akkor nem kellene keresni)! De ez lenne az ideális. A lényeg: csökkentsük a keresőgráf méretét!
(A legjobb irányban haladó keresés).
h(n) ![]() |
becslő függvényérték, ahol n-ből meg tudjuk becsülni a célbajutás |
optimális költségét | |
h(n) ![]() |
|
h(t) = 0 | , ha t ![]() |
h(n) = ![]() |
, ha egy csúcsból (n-ből) nem érhető el egyetlen terminális sem, |
akkor valamilyen nagyon nagy számmal jelöljük |
A keresőgráfban minden n csúcshoz előállítjuk h(n)-t.
Kiterjesztésre kiválasztás: legkisebb heurisztikájú
nyílt csúcs
(CSAK ezt tárolja: abból a csúcsból kb. milyen hosszú lesz a hátralévő út. A
múltról NEM tárol semmit.
Míg az optimális kereső: ami ADDIG a legolcsóbb volt, a múltat figyelte.
Ez: a jövőt nézi, milyen hosszú lesz még.)
Általában az elsőként nyilvántartott utat szoktuk nyilvántartani. Vagyis: ha kiterjesztés során előállítunk egy csúcsot, s szerepelt a keresőgráfban: nem foglalkozunk vele; nem szerepelt: nyílt csúcs lesz, visszamutatóval.
1.
|
Adatbázis inicializálása: start
csúcs, heurisztika megállapítása, nyílttá tesszük |
|||
2.
|
Van-e nyílt csúcs? | |||
nincs: | nincs megoldás | |||
van: | kiválasztjuk a legkisebb heurisztikájút, s teszteljük. Célcsúcs? | |||
igen: | rendben, visszamutatók alapján megvan a megoldás | |||
nem: | kiterjesztjük. A keresőgráfban még nem szereplő gyermekeit | |||
felvesszük a nyílt csúcsok közé, szülőre visszamutatnak, becslés esetükben. A szülőt zárttá tesszük. |
Nincs minősített
megoldáskeresés. A terminálási feltételek előrehozhatók; például kiterjesztéskor
gyermekek tesztelése.
Mit garantál? tetszőleges véges gráf esetén ha a reprezentációs gráf tartalmaz megoldást, akkor véges sok lépésen belül megoldást állít elő. Ha nincs megoldás: jelzi.
Probléma: ha a heurisztika nem elég jó, akkor a keresés biztonságát, a garanciát elveszíthetjük.
![]() ![]() ![]() |