Kényszerkielégítési problémák Constraint Satisfaction Problems (CSP)
Kényszerkielégítési problémák Keresés: - 1 ágens (nincs ellenfél) - determinisztikus cselekvések (nincs bizonytalanság) - a világ teljesen megfigyelhető - a keresési tér diszkrét
Keresés Tervezés: cselekvések sorozata (pl. hogyan kijutni a labirintusból). Nem csak a megoldást keressük, hanem inkább az odavezető utat (tervezés). Az utaknak költségük, mélységük, ... van. A keresés gyorsitásához heurisztikát használunk (pl. A*).
Keresés A keresés másik osztálya az identifikációs feladatok (a változókhoz értékeket rendelünk). Fontos a cél, nem pedig az odavezető út. A CSP-k az identifikációs feladatok megoldására szolgálnak.
Keresés Tervez A célt keresi
Kényszerkielégítési problémák Alkalmazások: Hozzárendelési feladatok (pl. ki melyik tantárgyat fogja oktatni) Órarendkészítés (mikor és melyik labiban lesz melyik tantárgy) Szállítás – ütemezés Gyárban: termelés ütemezése ...
Kényszerkielégítési problémák A CSP nem más mint keresés, a megoldáshoz keresőalgoritmusokat használunk. Elemek: Állapot – részleges hozzárendelés Inicializáció – üres hozzárendelés: { } Állapotátmenet függvény: nem hozzárendelt változóhoz értéket rendel Célteszt – A pillanatnyi hozzárendelés teljes? Ki van-e elégítve az összes kényszer?
Kényszerkielégítési problémák A keresés speciális esete. Egy állapotot az Xi változók definiálnak. A változók értékei egy D dómenból vehetik fel értékeiket. A célteszt: kényszerek halmaza melyek a változók kombinációinak lehetséges értékeit jelölik. CSP algoritmusokkal a keresési feladatokat hatékonyabban lehet megoldani.
N-királynő Kényszerek: 1. módszer: A tábla minden mezőjének egy változó felel meg (Xij). Xij jelöli hogy mi történik az adott mezőn. Dómen:{0,1} Kényszerek:
N-királynő Kényszerek: Implicit: Explicit: nem támadják egymást 2. módszer: Változók: Qk (minden sornak egy változója van) Dómen:{1, 2, 3, ..., N} Minden sor tartalmaz királynőt (Q1 az első sor változója, azt jelöli hogy hol a királynő az 1. sorban) Kényszerek: Implicit: Explicit: nem támadják egymást
Példa: Térképszínezés Változók: WA, NT, Q, NSW, V, SA, T Dómenok: D={piros, zöld, kék} Kényszerek: a szomszédos területek nem lehetnek egyforma színűek Implicit: WA ≠ NT Ekszplicit: (WA, NT) € {(piros,zöld), (piros,kék),...} A megoldás a változók olyan hozzárendelése amely az összes kényszert kielégíti, pl.: {WA=piros, NT=zöld, Q=piros, NSW=zöld, V=piros, SA=kék, T=zöld} A megoldás nem egyértelmű, van más helyes hozzárendelés is.
Példa: Térképszínezés Kényszertipusok: Unáris kényszerek: csak egy változót érintenek (pl. SA ≠ zöld) Bináris kényszerek: két változót érintenek (pl. SA ≠ WA) Magasabb rendű kényszerek
Kényszergráf Bináris CSP: minden kényszer (legfeljebb) két változót hoz összefüggésbe. Bináris kényszergráf: a csomópontok a változók, az élek mutatják a kényszereket. Az általános célú CSP algoritmusok a keresés gyorsításához gráfot használnak (Taszmánia különálló részfeladat).
Példa: kriptoaritmetika Változók: F, T, U, W, R, O, X1, X2, X3 Dómenok: {0,1,2,3,4,5,6,7,8,9} Kényszerek: alldiff (F,T,U,W,R,O) O + O = R + 10 * X1 . . . A négyzetek magasabbrendű kényszereket jelölnek.
Példa: kriptoaritmetika Változók: F, T, U, W, R, O, X1, X2, X3 Dómenok: {0,1,2,3,4,5,6,7,8,9} Kényszerek: alldiff (F,T,U,W,R,O) O + O = R + 10 * X1 . . . A négyzetek magasabbrendű kényszereket jelölnek. 867 + 867 -------- 1734
Példa: kriptoaritmetika
CSP Szélességi keresés A megoldások az legalsó mélységen vannak!
CSP Mélységi keresés Gyorsan lejut a legalsó szintre és megtalál egy teljes hozzárendelést (nem biztos, hogy kielégíti a kényszereket).
CSP - DFS
CSP - DFS
CSP - DFS
CSP - DFS
CSP - DFS Most kezdjük ellenőrizni a kényszereket.
CSP - DFS . . .
CSP - DFS A klasszikus DFS csak nagyon hosszú idő után vezet megoldásra. Miután leraktuk a második királynőt, észrevettük, hogy van támadás, de a rossz stratégia ellenére haladtunk tovább. . . .
Backtrack (visszalépéses keresés) Alapvető nem-informált keresés a CSP megoldására. Első ötlet: egyszerre csak egy változóhoz rendelünk értéket. Második ötlet: a kényszereket menet közben ellenőrizzük. DFS + Első ötlet + Második ötlet = Backtrack
Backtrack (visszalépéses keresés)
Backtrack Hatékonyság javítása Ordering (sorbaállítás): - melyik változóhoz rendeljünk értéket? - milyen sorrendben próbáljuk hozzárendelni az értékeket? Filtering (szűrés): - menet közben detektálni hogy nem lesz megoldás. - A nem hozzárendelt változók dómenjében megkeresni azokat az elemeket amelyeket biztonságosan el lehet távolítani.
Forward checking Szűrés: nyilvántartjuk a nem hozzárendelt változók dómenjét, és eliminálunk (szűrünk). Forward Checking-nél azokat az értékeket húzzuk ki amelyek megszegik a kényszert. Kezdetben egy változó sincs hozzárendelve.
Forward checking Az SA dómenje üres. Ha SA-hoz akármit rendelünk, backtrack következik.
Szűrés: kényszer propagáció (továbbítás) A forward checking a hozzárendelt változóktól továbbítja az információt a nem hozzárendeltek felé, de nem garantálja az összes hiba korai detektálását. NT és SA nem lehetnek mind a ketten kékek!!!
Szűrés: kényszer propagáció (továbbítás) Minden változónak van még engedélyezett értéke (egy mező sem üres). NT és SA is csak kék lehet (kényszer megszegés). Jó volna már most detektálni, hogy hiba lesz és azonnal backtrack-elni, nem pedig később. Megoldás: ARC CONSISTENCY (ág-konzisztencia).
Ág-konzisztencia (arc consistency - AC) Szűrési algoritmusoknál használjuk X Y konzisztens vagy nem? Egy ág akkor konzisztens ha nincs kényszer-megszegés Definició. Az X Y ág akkor és csak akkor konzisztens ha minden x értékre a kezdőpontból létezik olyan y a csúcsban amelyhez értéket lehet rendelni anélkül, hogy megszegnénk egy kényszert csúcs kezdőpont
Ág-konzisztencia (arc consistency - AC) A megjelölt ág nem konzisztens (piros), de konzisztenssé tehetjük (töröljük a pirosat). Mindig a kezdőpont-ból törlünk!!!
Ág-konzisztencia (arc consistency - AC) Ez az ág konzisztens (nem kell konzisztenssé tenni) mert egy értékre se a kezdőpontból nem lesz kényszer megszegés.
Ág-konzisztencia (arc consistency - AC) Ellenőrizzük, hogy a csomagtérben van-e valami ami megszegi valamelyik kényszert. Ha van, akkor kivesszük. Mindig a kezdőpontból törlünk!
A teljes CSP konzisztenciája A CSP akkor konzisztens ha az összes ág konzisztens. A forward checking nem detektálta a hibát (NT és SA nem lehetnek egyszerre kékek).
A teljes CSP konzisztenciája Leellenőrizzük az összes ág konzisztenciáját, és ha az ág nem konzisztens, törlünk a kezdőpontból hogy konzisztenssé tegyük. Ez az ág konzisztens.
A teljes CSP konzisztenciája Ez az ág is konzisztens. Ez az ág nem konzisztens (kék - kitöröljük).
A teljes CSP konzisztenciája Amíg nem töröltük ki a kéket, ez az ág konzisztens volt, de többé nem konzisztens mert értéket vesztett a csúcsból. Ahhoz hogy az ág újra konzisztens legyen, a V dómenjéből törölni kell a pirosat.
A teljes CSP konzisztenciája A forward checking ezt nem detektálta, az AC viszont korábban észrevette hogy ellentmondás lesz (töröljük SA dómenjéből a kéket). Amikor egy változó dómenje üres marad, backtrack következik.
A teljes CSP konzisztenciája Ha az X változó értéket veszít a dómenjéből, a szomszédait újra kell ellenőrizni. Az AC korábban detektálja a hibát mint a Forward Checking. Többet kell ellenőrizni mint a Forward Checking-nél (minden lépés le van lassítva), de kevesebbet kell backtrack-elni. Összesítve gyorsabban jutunk el a megoldásig.
A teljes CSP konzisztenciája A megismert algoritmus csak bináris CSP-re vonatkozik ahol egy kényszer csak két változót foglal magába.
Az AC korlátai
Az AC korlátai Mi történhet az AC kényszeritése után: Egy megoldás marad. Több megoldás marad. Nem marad megoldás (és ezt nem tudjuk).
Az AC korlátai Minden ág konzisztens (a teljes CSP konzisztens), 2 megoldás van. Minden ág konzisztens (a teljes CSP konzisztens), nincs megoldás. Az AC a hibák csak egy részét detektálja. Megoldás: k-konzisztencia.