Állapottér-reprezentáció elemei II. Állapottér-reprezentáció Állapottér: a feladat homlokterében álló adat (objektum) lehetséges értékeinek (állapotainak) halmaza lényegében egyetlen típusérték-halmaz és annak összetett szerkezetű reprezentációja a típus invariánssal Műveletek: állapotból állapotba vezetnek megadásukhoz: előfeltétel és hatás-leírás Kezdő állapot(ok) vagy azokat leíró kezdőfeltétel Célállapot(ok) vagy feltétel Megoldás: műveletek sorozata Az állapottér általában nem azonos a problématérrel, hiszen a problématér elemei, azaz a lehetséges válaszok a műveletsorozatok, nem pedig az állapotok. Kiinduló válasz a kezdő állapotból induló nulla hosszú műveletsorozat Egy műveletsorozatnak (válasznak) szomszédjai azok a sorozatok, amelyek egy újabb művelettel hosszabbak. Hanoi tornyai probléma Kezdőállapot Célállapot [,,] C B A [,,] A B C Állapottér: Állás = vec( [A,B,C];{,,}) megjegyzés : a rudakon lentről felfelé csökkenő méret szerint helyezkednek el a korongok Művelet: Rak(honnan, hová):állásállás HA a-ban (a:állás) a honnan nem üres, és a hová üres vagy a legfelső korongja nagyobb, mint honnan legfelső korongja AKKOR a[honnan legfelső korongja] := hová Művelet: Rak(honnan, hová):állásállás (a:állás) Implementáció l,i=search i=a..c (a[i]=honnan) i-t akarjuk mozgatni l,j=search i=a..c (a[j]=hová) j-re akarunk rakni Hanoi tornyai [,,] [,,] [,,] állapot gráf [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] HA l és (l vagy i<j) AKKOR a[i] := hová [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,] [,,]
Állapottér-reprezentáció állapot gráfja Állapot gráf az állapottér-repr. reprezentációs gráfja állapot csúcs művelet hatása irányított él művelet költsége élköltség kezdő állapot csúcs állapotok csúcsok műveletsorozat hatása irányított út Az útkeresés hatékonysága a problématér bonyolultságán múlik, ami a reprezentációs gráf (itt ez az állapotgráf) bonyolultságától függ csúcsok és élek száma ( csúcs, csúcsból kivezető él max: ) utak száma, hossza (adott csúcsból kivezető k hosszú utak száma, ha a közvetlen visszalépést kizárjuk: k ) körök gyakorisága és hossza általános állapot n-királynő probléma. feltétel Állapottér: Tábla = mátrix([..n,..n];{, _ }) invariáns: a királynők ( jelű mezők) száma = n Művelet: Áthelyez(x,y,u,v):TáblaTábla (a:tábla) HA (a[x,y]=) és (a[u,v]=_ ) AKKOR a[x,y], a[u,v] := a[u,v], a[x,y] Sok modellje lehet ugyanannak a feladatnak: keressük meg a legkisebb problématerűt o Az. reprezentációban az állapottér mérete : de még ennél is nagyobb egy adott állapotból kiinduló utak száma (azaz a problématér mérete.) n n o Bővítsük az állapotteret az n-nél kevesebb királynőt tartalmazó állásokkal, de használjunk új műveletet : a királynő-felhelyezést. Ekkor a problématér csak a legfeljebb n hosszú utakból áll majd, és a megoldást a pontosan n hosszúak között találjuk. o A műveletek előfeltételének szigorításával csökken a problématér: - Először az első sorba, aztán a másodikba, és így tovább helyezzünk fel egy-egy királynőt! Ekkor az n hosszú utak száma: n n - Ütést tartalmazó állásra ne rakjunk fel újabb királynőt! kezdőállapot n-királynő probléma. közbülső állapot állapot Állapottér: Tábla = mátrix([..n,..n];{, _ }) invariáns: a királynők ( jelű mezők) száma n csak az első valahány sorban van egy-egy királynő Művelet: Helyez(oszlop):TáblaTábla (a:tábla) HA királynők száma < n és nincs ütés a táblán és jelölje a sor a soron következő üres sort AKKOR a[sor,oszlop] := 9 0 A művelet előfeltételének bonyolultsága csökkenthető ha o az állapotteret (vagy annak invariánsát) módosítjuk és o a művelet hatását ennek megfelelően szigorítjuk (ugyanaz a megszorítás vándorol a specifikáción belül) Például o A királynők számát eltároljuk az állapotban (ebből ismert lesz a következő üres sor is) ahelyett, hogy mindig kiszámolnánk. o Kikötjük az invariánsban, hogy nincs ütés a táblán ahelyett, hogy ezt mindig ellenőrizzük. Ennek betartásához azonban nem szabad alkalmazunk olyan műveletet, ami ütést hoz létre. o De ha tároljuk, hogy mely üres mezőket tartanak ütés alatt a királynők, akkor konstans időben eldönthető, hogy egy újonnan elhelyezett királynő ütné-e az előzőeket. kezdőállapot: db = 0 n-királynő probléma. közbülső állapot: db = állapot : db = Állapottér: Tábla = rec(m:mátrix([..n,..n];{,, _ }), db:n) invariáns: csak az első db sorban van egy-egy királynő (), db n, királynők nem ütik egymást, egy királynő által ütésben álló (foglalt) üres mezőt, _ az ütésben nem álló szabad mezőt jelöli
n-királynő probléma. -királynő állapot gráf Művelet: új királynő felhelyezése a soron következő üres sor szabad mezőjére (invariáns tartó művelet) Helyez(oszlop):TáblaTábla (a:tábla) HA a. db < n és a.m[a.db+,oszlop]= _ AKKOR a.db:=a.db+ a.m[a.db,oszlop] := minden megfelelő i,j -re: a.m[i,j] := Kezdőállapot: a.m üres mátrix, a.db=0 Célállapot: a.db=n kezdőállapot: tetszőleges Tologató játék (-as, -ös) állapot: szokásos Állapottér: Tábla = rec(mátrix:{0..}, üreshely :{..} {..}) invariáns: a mátrix sorfolytonos kiterítése a 0.. számok permutációja, az üreshely a 0 elem sor és oszlopindexe. Művelet: Tol(irány):TáblaTábla (a:tábla) HA a.üreshely+irány egy érvényes pozíció AKKOR a.mátrix[a.üreshely], a.mátrix[a.üreshely+irány] := a.mátrix[a.üreshely+irány], a.mátrix[a.üreshely] a.üreshely := a.üreshely+irány A keresés szempontjából a reprezentációs gráfnak csak a csúcsból elérhető része érdekes, ez az, amit egy keresés felfedhet a gráfból. A felfedett részt (a keresési teret) is sokszor csak torzultan látja : Ha a keresés nem vizsgálja, hogy egy már korábban elért állapotba jutott-e el újra, akkor nem az eredeti állapot gráfot, hanem annak fává kiegyenesített változatát látja. Nem feltétlenül baj, ha a keresési tér végtelen nagy lesz, ha cserébe nincsenek már benne körök. A szülőcsúcsba való visszalépést viszont érdemes direkt módon kizárni, hiszen így egy egyszerű vizsgálattal felesleges éleket, oda-vissza köröket hagyhatunk el a keresési térből. állapot Keresési tér duplikátum Fekete-fehér kirakó Egy n+m+ hosszú sínen n fekete és m fehér lapka és egy üres hely van. Egy lapkát szomszédos üres helyre tolhatunk vagy a szomszéd felett üres helyre ugrathatunk. Kezdetben a feketék után jönnek a fehérek, majd az üres hely. Kerüljenek a fehérek a feketék elé! Állapottér: Sín =rec(v:vec( [..n+m+];{b, W,_}), poz:[.. n+m+]) invariáns: egy üres hely, poz az üres hely inexe, n darab B és m darab W Műveletek: TolBal, TolJobb, UgrikBal, UgrikJobb: Sín Sín Például: TolBal (üres helyet toljuk balra) HA a.poz (a : Sín) AKKOR a.v[a.poz-] a.v[a.poz] : a.poz :=a.poz- Kezdőállapot: [B,, B, W,, W, _ ] Célállapot: i,j [.. n+m+], i<j : (a.v[i]=b a.v[j]=w)
0 m Fekete-fehér kirakó állapot gráfja Kancsók problémája B _ W W _ B W W W B _ W W B W _ W _ W B B W W W W B B W _ W _ W B W W _ B W W W B _ W W _ B Három kancsóban, egy öt, három és két literesben, együttesen liter bor van. Kezdetben az öt literes kancsó van tele. Töltögetéssel érjük el, hogy a két literesbe pontosan liter bor kerüljön! Állapottér: Kancsók= vec( [,,];[0..]) invariáns: i [,,] v[i] = i{,,}: v[i]i Kezdő állapotból elérhető állásokban egyik kancsó üres vagy teli. Művelet: Tölt(i,j): Kancsók Kancsók (v : Kancsók) HA i,j[,,] ij min(v[i], j-v[j])>0 AKKOR v[i],v[j] := v[i]-min(v[i], j-v[j]),v[j]+min(v[i], j-v[j]) Kezdőállapot: (, 0, 0) Célállapot: (x, y, ) ahol x [0..], y [0..], x+y= 9 0 Kancsók-probléma állapot gráfja 0 0 0 0 0 0 0 0 Kancsók-probléma állapot gráfjának másik ábrázolása l 0 l 0 Műveletek: ütközésig l - l l - l l - l l 0 Misszionárius kannibál probléma Misszionárius kannibál állapot gráf n misszionárius és n kannibál át akar kelni egy folyón egy h személyes csónakban az evezés nem Állapottér: Part = rec(m:[0..n], k:[0..n], c:l) külön állapot invariáns: nincs emberevés, azaz I(m,k) m=k m=0 m=n Kezdőállapot: (n,n,igaz) Célállapot: (0,0,hamis) Műveletek: Át(x,y):PartPart és Vissza(x,y):PartPart (a:part) HA a.c xa.m ya.k HA a.c xn a.m yn a.k x+yh I(a.m x, a.k y) x+yh I(a.m+x, a.k+y) AKKOR a.c:=hamis : AKKOR a.c:=igaz : a.m:=a.m x: a.k:=a.k y a.m:=a.m+x: a.k:=a.k+y Ha egy átevezés előtt és után nincs emberevés, akkor a csónakban sincs. a megoldási út folytonos és szaggatott élek váltakozó sorozata Vissza(0,) Át(0,) (,0) hamis igaz 0 k (,,) esetnél állapot (0,0) (,) (0,) Megoldhatóság feltétele: h vagy h- n
SAT kielégíthetőségi probléma. SAT kielégíthetőségi probléma. Adott egy KNF nullad-rendű formula n darab ítéletváltozóval. Pl: F(x) = (x x x ) (x x x ) (x x ) (x x x ) A változók milyen értéke mellett lesz az F formula igaz? Állapottér: I = vec( [..n];{igaz, hamis}) Művelet: Vált(i): I I (a : I) a[i] := a[i] Kezdőállapot: tetszőleges interpretáció Célállapot: F-nek a állapot szerinti interpretációja igaz Hogyan csökkenthető a problématér mérete? Adott egy KNF nullad-rendű formula n darab ítéletváltozóval és K darab klózban. A változók milyen értéke mellett lesz a formula igaz? Állapottér: I = rec(v: vec ( [..n];{igaz, hamis, }), i:n, db:n) invariáns: az első i változónak van már értéke és db az igaz klózok száma 0 i n, 0 db K Műveletek: Igaz: I I és Hamis: I I (a : I) i := i+: a.v[i] := igaz i := i+: a.v[i] := hamis a.db újraszámolása az i-dik változót tartalmazó klózokban Kezdőállapot: ([,, ], 0) Célállapot: a.db=k SAT állapot gráfok Feladatok. reprezentáció Állapot gráf: csúcsok (állapotok) száma: n. Minden csúcsból n él indul ki, bármelyik csúcsból bármelyik csúcsba el lehet jutni. Adott csúcsból induló K hosszú utak száma n K, A legfeljebb K hosszú utak száma (ami a problématérnek csak egy része) : (n K )/(n ). reprezentáció Állapot gráf: K mélységű bináris fa, csúcsok (állapotok) száma: K+ Problématér elemei: csúcsból induló K hosszú utak. Száma: K. Utazó ügynök probléma. Gráf színezési probléma. Sakktábla bejárása lóval. Rubik kocka. Bűvös négyzet. -ös mátrix 0,-esekkel úgy, hogy minden -es más. Ábrarajzolás egy vonallal. Útvonal tervezés városban (egyirányú utcák) 9. Nagypapa játéka