Mesterséges intelligencia 4. laborgyakorlat Kényszerkielégítési feladatok (Constraint Satisfaction Problems CSPs) Egy kényszerkielégítési problémát az X 1, X 2,..., X n változók egy sorozatával, és a rajtuk értelmezett C 1,C 2,,...,C m kényszerrel értelmezzük. Minden X i változó egy D i doméniumból veszi a lehetséges értékeit. Minden C i kényszer a változók egy részhalmazára vonatkozik, és specifikálja a részhalmazban a változók megengedett kombinációját. A probléma egy állapotát a változókhoz rendelt értékek határozzák meg: {X i = v i, X j = v j,...}. Egy olyan hozzárendelés, amely kielégíti a C 1,C 2,,...,C m kényszereket konzisztens, vagy törvényes hozzárendelés. Egy teljes hozzárendelés egy olyan hozzárendelés, amelyben minden változó fel van sorolva. A CSP egy megoldása olyan teljes hozzárendelés, amely minden kényszert kielégít. Némely CSP-nél a megoldásnak még egy célfüggvényt is maximizálni kell. Nézzük a következő térképszínezési feladatot: piros, zöld és kék színekkel kell kifesteni Ausztrália tartományait, úgy, hogy két szomszédos tartomány ne legyen azonos színű. Fogalmazzuk meg CSP-ként a feladatot: legyenek a tartományok a változók: WA, NT, Q, NSW, V, SA és T. mindenik változó értéktartománya: {r ed, g r een, bl ue}. kényszerek: a szomszédos területek legyenek különböző színűek. Például a megengedett kombinációk WA és NT számára a következő párok: {(red, g reen),(red,blue),(g reen,red),(g reen,blue),(blue,red),(blue, g reen)} A kényszert tömörebben is megfogalmazhatjuk: W A N T, feltéve, hogy az algoritmusunk képes kezelni ilyen kifejezéseket. A térképszínezési feladatnak sok megoldása van, egy lehetséges a következő: {W A = red, NT = g reen,q = red, NSW = g reen,v = red,s A = blue,t = red}. Hasznos, ha a CSP feladatot kényszer-gráfként (constraint graph) ábrázoljuk.
A gráf csomópontjai a változóknak, az élek a kényszereknek felelnek meg. Ha egy feladatot CSP-ként kezelünk, az számos előnnyel jár. Mivel a CSP-k esetében az állapotok ábrázolása egy standard mintát követ (egy sor változó, hozzárendelt értékekkel), a következő (successor) függvényt és a célbaérkezés tesztjét általánosan meg lehet fogalmazni, amely független a CSP-től. Továbbá, olyan hatékony és általános heurisztikákat dolgozhatunk ki, amelyek nem igényelnek probléma-specifikus tudást. Végül, a kényszer-gráf használata nagyban segítheti a keresést, bizonyos esetekben exponenciálisan csökkentve a komplexitást. Egy CSP-t keresési feladatként is megfogalmazhatjuk: kezdő állapot: az üres hozzárendelés {}, amelyben egyik változóhoz sincs érték rendelve következő függvény: olyan értéket rendelünk egy még érték nélküli változóhoz, amely nem ütközik a többi, már értékkel rendelkező változóval. cét teszt: az aktuális hozzárendelés teljes-e? út költsége: konstans költség (pl 1) minden lépésre Vegyünk észre két fontos dolgot. Először, hogy minden megoldás egy teljes hozzárendelés kell legyen, ennélfogva az n-ik szinten jelenik meg, (n darab változó esetén). Továbbá a keresési fa csak n mélységű. E két okból kifolyólag a mélységi keresések nagyon népszerűek a CSP-k megoldásában. Ugyanakkor az út, amelyen a megoldáshoz jutunk teljesen irreleváns. A legegyszerűbb CSP-k diszkrét és véges értékkészlettel rendelkeznek. Ilyen például a térképszínezési feladat. A 8 királynő probléma szintén ebbe a kategóriába tartozik, ahol a Q 1,Q 2,...,Q 8 változók a királynők által elfoglalt pozíciókat jelentik, és mindenik változó a {1,2,3,4,5,6,7,8} halmazból veszi az értékeit. Ha a legnagyobb doménium d darab értékből áll, akkor a teljes hozzárendelések száma a CSPben O(d n ). (A véges értékkészletű CSP-k közé tartoznak a bool-csp-k (boolean CSPs), amelyek változói csak true vagy false értéket vehetnek fel.) A legrosszabb esetben tehát nem várhatunk exponenciális időnél jobbat a véges értékkészlettel rendelkező CSP-k megoldásakor. A gyakorlati alkalmazásokban azonban az általános CSP algoritmusok nagyságrendekkel nagyobb feladatokat képesek megoldani, mint az általános kereső algoritmusok. A diszkrét változók végtelen nagyságú értékkészlettel is rendelkezhetnek. Ebben az esetben a kényszereket már nem lehet megengedett értékkombinációkként megadni, hanem egy ún. kényszer nyelvet (constraint language) kell használni, amely képes leírni a feladatban megadott kényszereket (lineáris, nem lineáris kényszerek). Backtracking Az előző rész keresési feladatként fogalmazta meg a CSP-t. Így egy általános keresési algoritmus képes megtalálni a CSP megoldását. Tételezzük fel, hogy mélységi keresést használunk az előző részben leírt, általános CSP feladatra. Nagyon furcsa dolgot figyelhetünk meg: a gyökérben az elágazási tényező nd, mivel n változó mindegyikéhez d értéket rendelhetünk. A következő szinteken az elágazási tényezők: (n 1)d, (n 2)d,... Végül egy n!d n levelű fát generáltunk ki, noha összesen csak d n teljes hozzárendelés van! A CSP-k egy fontos tulajdonságát hagytuk figyelmen kívül, azért jutottunk erre a furcsa eredményre: a kommutativitást. Egy feladat kommutatív, ha az eredményre nincs hatással a különböző műveletek alkalmazásának sorrendje. Ez a tulajdonság fennáll a CSP-k esetében, mert mikor a változókhoz értéket rendelünk, akkor ugyanahhoz a parciális hozzárendeléshez jutunk, függetlenül a sorrendtől. Így az összes CSP algoritmus úgy generálja a következőket, hogy a keresési fa egy csúcsában egyszerre csak egy változónak választ értéket. Például a térképszínezési feladat esetében a gyökérben választhatunk SA=red, SA=green, és SA=blue között, de SA=red és WA=blue között sohasem. Ezzel a megszorítással a levelek száma d n -re csökkenthető.
A backtracking olyan mélységi keresés, amely egyszerre egy változónak választ értéket, és visszalép abban az esetben, ha a változónak nincs már olyan értéke, amelyet a kényszerek miatt hozzá lehetne rendelni. A nyers backtracking nem informált keresési módszer, ennek következtében nem is különösebben hatékony. Nézzük a lehetséges optimizálásokat. Változók és értékek rendezése Nézzük a backtracking következő sorát: var SELECT-UNASSIGNED-VARIABLE(VARIABLES[csp],assignment,csp). Ez egyszerűen kiválasztja a következő, még nem használt változót a VARIABLES[csp] listából. Ez a technika aligha eredményezi a legoptimálisabb keresést. Például a WA=red, NT=green hozzárendelések után SA-nak csak egy lehetséges értéke lehet, tehát ésszerűnek tűnik, hogy előbb az SA=blue hozzárendelést végezzük el, semhogy a Q-nak adjunk értéket. Valójában miután SA értéket kapott, Q, NSW és V lehetséges értékei eldőltek. Az ötlet tehát az, hogy mindig azt a változót válasszuk, amelynek a legkevesebb lehetséges legális értéke van (MVR - minimum remaining values heuristics). Ez a legerősebben kényszerített változó (most constrained variable), vagy a fail first heurisztika néven is ismert, lévén, hogy mindig azt a változót választja, amely hamar elbukik, így lenyesve a keresési fát. Ha van egy olyan X változónk, amelynek nincs további legális lépése, akkor az MVR X-et fogja kiválasztani - így megelőzve a fölösleges keresést a többi változó között, (amelyek végül úgy is elbuknának, mikor X kiválasztódik). Az MVR nem segít a legelső szín kiválasztásában, mivel kezdetben minden tartománynak három legális színe van. Ebben az esetben a mérték heurisztika (degree heuristics) segíthet. Ez a keresési fa elágazási tényezőjét próbálja csökkenteni úgy, hogy azt a változót választja ki, amely a legtöbb kényszerben van a többi, még nem hozzárendelt változóval. A példánkhoz visszatérve, az első lépésben ez SA lesz. Miután kiválasztottunk egy változót, következik, hogy eldöntsük azt, hogy milyen sorrendben vizsgáljuk meg a lehetséges értékeit. A legkevésbé kényszerítő érték (least constraining value) heurisztika egy gyakran használt módszer. Ez azt az értéket kezeli preferenciálisan, amely a szomszédos változók értékei közül a legkevesebbet szorítja ki. Például, ha WA=red, NT=green, és a következő változónk Q, akkor blue rossz választás lenne, mert megszünteti Q szomszédjának, SA-nak utolsó legális értékét. A legkevésbé kényszerítő heurisztika a red-et választaná. Általánosan: a legkevésbé kényszerítő érték heurisztika a további változó-hozzárendeléseknek a lehető legnagyobb szabadságot próbálja biztosítani. Természetesen, ha nincs megoldás, vagy az összes megoldásra kíváncsiak vagyunk, akkor az értékek sorbarendezésének nincs értelme.
Előretekintő ellenőrzés (forward checking) A kényszerek egyik lehetséges jobb kihasználása az előretekintő ellenőrzés. Ez a következő képpen működik: valahányszor egy X változó értéket kap, az előretekintő ellenőrzés megnézi az összes olyan Y változót, amellyel X egy kényszer által össze van kötve, és kitörli Y lehetséges értékei közül azokat, amelyek nem konzisztensek az X-hez rendelt értékkel. A következő ábra az előretekintő ellenőrzés menetét mutatja be. Figyeljük meg, hogy miután WA=red, és Q=green, az NT és SA doméniumai egy-egy értékre redukálódtak, ezzel ezen vátlozók elágazási tényezőit 1-re nyestük vissza. Az MVR - amelyet együtt használunk az előretekintő ellenőrzéssel - automatikusan az SA-t, majd az NT-t választaná következőknek. Egy másik dolog, amit fontos észrevenni az ábrán, hogy miután V=blue, az SA doméniuma üres. Így az előretekintő ellenőrzés megállapította, hogy az {W A = red,q = g reen,v = blue} részleges hozzárendelés ütközik a feladatban megfogalmazott kényszerekkel, így az algoritmus azonnal vissza fog lépni. (backtrack) A kényszer kiterjesztése (constraing propagation) Bár az előretekintő ellenőrzés sok ütközést felfedez, nem találja meg az összeset. Például a táblázat utolsó előtti sorában WA=red, Q=green, NT-nek és SA-nak pedig kötelező módon blue-nak kellene lenni. De mivel szomszédosak, ezért nem lehet azonos a színük. A kényszerkiterjesztés általános terminus a kényszer következményeinek kiterjesztésére egy változóról a többi változóra. (Ebben az esetben WA-ról és Q-ról NT-re és SA-ra.) Élkonzisztencia Az élkonzisztencián alapuló módszer egy gyors kényszerkiterjesztési technika, amely lényegesen erősebb mint az előretekintő ellenőrzés. Itt egy él egy irányított élet jelent a kényszer-gráfban. Nézzük pl. az SA NSW élet. Az SA NSW él konzisztens, ha SA bármely x lehetséges értékére létezik egy olyan y az NSW doméniumából, amely konzisztens x-el. A táblázat harmadik sorában az SA aktuális doméniuma {blue}, az NSW-é pedig {red,blue}. Ha SA=blue, akkor NSW-nek van konzisztens értéke: red, így az SA NSW él konzisztens. Az SA NSW élre ez nem áll, mert az NSW=blue-ra SA-nak nincs konzisztens értéke. Az él konzisztenssé tehető, ha blue-t törüljük az NSW doméniumából. A keresésnek ebben a fázisában ugyanúgy használhatjuk az élkonzisztencia elvet az SA NT él esetében is. A harmadik sor a táblázatban azt mutatja, hogy mindkét változó a doméniuma a {blue}. SA doméniumából le kell törülni a blue-t, ezáltal SA értékkészlete üresen marad. Így az élkonzisztencia elvet használva már a keresés korai fázisában olyan inkonzisztenciára bukkantunk, amelyet az előretekintő ellenőrzés nem vett volna észre.
Az él-konzisztencia ellenőrzést használhatjuk előfeldolgozóként, vagy a keresés alatt, minden hozzárendelés után. Mindkét esetben az ellenőrzést addig kell folytatni, míg nincs több inkonzisztencia. Ezt azért, mert valahányszor egy X i változó értékkészletéből letörlünk egy értéket, hogy megszüntessünk egy él-inkonzisztenciát, egy újabb él-inkonzisztenciák jöhetnek létre, amelyek élek mind az X i -re mutatnak. Az AC-3 algoritmus egy sort használ azon élek nyomonkövetésére, amelyeknek meg kell vizsgálni a konzisztenciáját. Minden (X i, X j ) élet az algoritmus sorban eltávolít, majd ellenőriz. Ha létezik olyan érték, amelyet X i doméniumából le kell törülni, akkor minden (X k, X i ) élet, amely X i -re mutat vissza kell tenni a sorba további ellenőrzés végett. Az AC-3 algoritmus komplexitását a következő képpen számítjuk ki: egy CSP-nek legfennebb O(n 2 ) éle van. Minden (X k, X i ) élet legfennebb d-szer szúrhatunk bele a sorba, lévén hogy X i -nek legfennebb d értéke van. Egy él konzisztenciáját O(d 2 ) idő alatt lehet leellenőrizni - tehát az AC-3 legrosszabb ideje O(n 2 d 3 ). Bár ez lényegesen költségesebb mint az előretekintő ellenőrzés, áltlában megéri. Feladatok EC. Hasonlítsa össze az n (n {8,100,1000}) királynő feladatok futási idejét, ha a keresési algoritmus: 1. nyers backtracking 2. backtracking + forward checking 3. backtracking + MVR + forward checking 4. backtracking + AC-3 Szakirodalom Russel&Norvig: Artificial Intelligence: A Modern Approach 2nd Edition, Prentice Hall, 2002, p137-160