
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 | ||
|
è
|
,
ha F címkéjű és n nem levél |
||