Előadó: Dr. Várterész Magdolna
2.4. Probléma-redukcióval leírt feladatok megoldását kereső módszerek
Osztályozásuk:
2.4.1. Backtrack (visszalépéses)
állapottér-reprezentáció esetén: | adatbázis: | start csúcsból induló valamilyen
út a |
reprezentációs gráfban. Aktuális út. Aktuális állapot: az út végi csúcs. Ennek a vizsgálata döntötte el, hogy hogyan tovább. | ||
ÉS-VAGY gráf esetén: | adatbázis: |
egy hiperút, a |
Ebből szeretnénk megoldást készíteni. Aktuális hiperút. | ||
Levelei: | az eredeti problémának valamilyen szintű | |
részproblémái. Ha a levelek mind egyszerű megoldható problémák: megoldás: | ||
Csúcsok: | probléma, részprobléma, amit éppen reprezentál |
Miket tartunk nyilván a csúcsokban?
Amikor egy csúcsot előállítunk megnézzük, hogy az egyszerű problémák között szerepelt-e már? Háromféle címkét fogunk alkalmazni:
Műveletek: | 1. redukciós operátorok |
2. visszalépés |
A vezérlő:
1.
|
inicializálás: |
|
![]() |
||
ha a címka F, akkor keresésről van szó | ||
2.
|
keresés (pszeudó-kód): | |||||
van = választFlevél(n); //(*) | ||||||
while (van) | ||||||
{ | ||||||
op = választRedOp(n);//(*) | ||||||
if (op != 0) | ||||||
{ | ||||||
GY = alk(n, op); | ||||||
hiperútbővítés(GY, n, op); | ||||||
if (Ncímkéjű(n, m)) visszalép(m); | ||||||
} | ||||||
else visszalép(n); | ||||||
van = választFlevél(n); | ||||||
} | ||||||
magyarázat: | ||||||
egy F címkéjű levéllel tér vissza, ha van ilyen | ||||||
addig dolgozunk, míg van F címkéjű csúcs | ||||||
a kiválasztott csúcs esetében választunk egy operátort | ||||||
ha van alkalmazható operátor, akkor (7-8-9), különben meg visszalépés | ||||||
előállítjuk a csúcs gyermekeit (GY) | ||||||
a gyermekeket felfűzzük: maga a probléma, szülő mutat az 1. gyermekre, | ||||||
gyermekek köv. mutatója a testvérre mutat, | ||||||
gyermekek visszamutatnak a szülőre, | ||||||
felcímkézzük a gyermekeket | ||||||
a szülőtől bejárjuk a gyermekeket, s N címkéjűt keresünk | ||||||
ha találunk (m-ben adja vissza), akkor visszalépés | ||||||
ha az 5-ös pontban nem találtunk alkalmazható operátort, akkor visszalépés | ||||||
keressük a következő F címkéjű csúcsot. | ||||||
Ha a start csúcsból lépünk
vissza: sikertelen a megoldáskeresés. |
Beszélhetünk szisztematikus ill. heurisztikus keresésről. Ezen
megoldáskeresők a (*)-gal jelölt két választásban
térhetnek el lényeges módon (valasztFlevel
, valasztRedOp
).
Heurisztikus esetben hogyan válasszunk? HA van becslés a megoldás költségére,
akkor válasszuk a LEGNEHEZEBBET! A valasztFlevel()
válassza a legnehezebb
problémát!
2.4.2. Keresőgráffal megoldást keresők
Állapottér-reprezentációs esetben akkor volt meg a megoldás, amikor a tesztelésre kiválasztott csúcs eleget tett a célfeltételnek.
Problémaredukciós esetben a terminálás figyelésére bevezetjük a címkemódszert. Háromféle címkét fogunk alkalmazni:
Két eljárás: | - címkéző | (az előbb a visszalépéses módszernél |
tulajdonképpen egy ilyet használtunk. Amikor az adatbázisba bekerül egy új csúcs, akkor azt címkézzük). | ||
- címkemódosító | (a címkék módosíthatóak. Ha a címkéző egy F-től | |
különböző címkét ad egy csúcsnak, akkor ennek a szülőre nézve következményei lesznek). | ||
![]() |
![]() |
|
ha ő VAGY-gyermek, akkor a szülő is M lesz | ekkor még nem tudunk mit mondani! | |
![]() |
![]() |
|
még nem tudunk mit mondani! | ha ő ÉS-gyermek és N címkéjű, akkor a szülő is N lesz |
Ha a csúcsnál egy F-től különböző címke jelenik meg, akkor
indul a címkemódosító eljárás a csúcs szülőjére nézve.
Ha a start csúcsban M címke
jelenik meg: |
van megoldás, előállt a megoldás |
Ha a start csúcsban N címke
jelenik meg: |
nem oldható meg |
Egyedül a start
csúcs címkéjét kell tehát
figyelni! Ha F: folytatjuk a keresést. Ha M, N: sikeres, sikertelen terminálás.
Az adatbázis ebben az esetben egy keresőgráf. Hiperutak,
melyek a start
csúcsból indulnak. Ezek valamelyikéből remélünk
megoldást. ÉS-VAGY fagráfok.
A hiperutak közül választunk egyet, másrészt ha kiválasztottuk: ezen a hiperúton
a még meg nem oldott problémák közül IS választani kell.
Itt is beszélhetünk szisztematikus ill. heurisztikus keresésről. Heurisztikus esetben: melyik hiperúton reméljük a megoldást, ill. azon belül a legnehezebb megoldást választjuk ki.
Ha kiválasztottuk: kiterjesztjük. Az összes redukciós
operátort alkalmazzuk rá. A leveleket címkézzük, s ha kell módosítjuk a szülőt
is. Megoldás: a start
csúcs címkéje M-re vált.
Az N címkéjű csúcsokból induló hiperútrészleteket töröljük.
Az A-algoritmus valamilyen módosítását fogjuk alkalmazni. Ez lesz az:
Adatbázis: s-ből induló hiperutak (keresés során már felderített hiperutak)
csúcsinformáció: | maga a probléma |
![]() |
1. gyermekre mutató mutató | ||
következő ÉS testvér (új) | ||
következő VAGY testvér (új) | ||
szülőre mutató mutató | ||
kiértékelő-függvény (új) | ||
címke | ||
információ a redukciós operátorokról |
Művelet: kiterjesztés művelete (pszeudó-kóddal):
while (vanMégRedOp(n, op)) | |
{ | |
GY = alk(n, op); | |
hiperútbővítés(GY, n, op); | |
} | |
címkemódosító(); | |
kiértékelőfüggvényMódosító(); | |
NcímkéjűHiperutakEltávolítása(); |
Vezérlő: (pszeudó-kóddal):
1.
|
inicializálás: |
|
![]() |
||
2.
|
van = választHiperút(h); | |
while (van && (címke(h)!=M)) | ||
{ | ||
választFlevél(h, n); | ||
kiterjeszt(h, n); | ||
van = választHiperút(h); | ||
} |
Kiértékelőfüggvény:
æ
|
0, ha M címkéjű | ||
ç
|
![]() |
||
f(n) =
|
í
|
||
ç
|
h(n), ha F címkéjű és n levél | ||
è
|
![]() |
![]() ![]() ![]() |