A korlátozás programozás alapa Kovács András akovacs@mt.bme.hu Bevezetés Ez a segédlet a Mesterséges Intellgenca Labor c. tárgyat felvett hallgatókhoz szól, és feltételez a logka programozás elmélet alapanak, a fontosabb fa-kereso algortmusoknak és a Prolog nyelvnek az smeretét. Céla a laboron kadott feladatok elvégzéséhez szükséges smeretek bemutatása és az óra munka segítése néhány kódmnta által. A korlátozás programozás elméletének elsaátításához fgyelmetekbe aánluk Szered Péter Nagyhatékonyságú Logka Programozás c. tárgyát. Az tt leírt példaprogramok egy része s a tárgy egyzetébol lett adaptálva. Defnícók A korlátozás programozás (Constrant Programmng / Constrant Logc Programmng, CLP) egy deklaratív programozás paradgma kombnatorkus (optmalzálás) problémák megoldására. Hatékonyságának, rugalmasságának és az egyszeru formalzmusoknak köszönhetoen számos gyakorlat alkalmazással büszkélkedhet, pl. az ütemezés, órarendkészítés, grafka alkalmazások, stb. területén. Rövden, egy korlátozás-kelégítés probléma (Constrant Satsfacton Problem, CSP) a következokbol áll: változók egy halmaza: X = { 1,..., n }; mnden változóhoz egy D véges értékkészlet (doman); korlátozások (constrant) egy C halmaza, amely leíra, hogy a változók által felvett értékek közt mlyen összefüggéseknek kell fennállna; esetleg egy O (X ) célfüggvény. A CSP megoldása az X változók egy lekötése, melynek során mnden értéket, és kelégít a C korlátokat. Kereshetünk egy megoldásra; az összes megoldásra, vagy az O (X ) szernt mnmáls vagy mamáls megoldásra. D -bol vesz fel Nem szükségképpen, de általában a D értékkészletek a poztív egészek halmazának részhalmaza. A továbbakban m s éln fogunk ezzel a feltételezéssel.
Korlátok Egy c 1,...k változókra értelmezett korlát formáls defnícóa szernt egy k változós relácó a D 1... Dk drekt-szorzat felett, amely a változók megengedett kombnácóra áll fenn. Például: SICStus Prolog korlát A #> B Jelentése A > B A #\= B A B (A #= 3 #\/ B#> C-2) A = 3 vagy B > C 2 all_dfferent(l) Az L lsta eleme mnd különbözoek. A fent k tetszoleges értéket felvehet, de kemelünk két esetet: Unárs korlátok ( k = 1). Egy c u unárs korlát arra használható, hogy egy változó értékkészletébol eltávolítsuk a nemkívánatos értékeket. Pl. az 3 korlát esetén a 3 értéket eltávolíthatuk D -bol. Ettol a pllanattól kezdve a c u korlát bztosan k van elégítve, és akár el s távolítható C-bol. Bnárs korlátok ( k = 2). Ha egy CSP mnden korláta bnárs, akkor bnárs CSP-rol beszélhetünk. Egy bnárs CSP ábrázolható egy gráffal, melynek csúcsa a változók, éle a megfelelo változópárok közt fennálló korlátok. Elmélet elentosége van annak, hogy tetszoleges CSP átalakítható bnárs CSP-vé, bár ez ú változók bevezetését tehet szükségessé. Ma ezt a technkát már nem használák, hatékonyabb algortmusok smertek magasabb fokszámú korlátokat s tartalmazó CSP-k megoldására. Példa egy korlátozás programra Az n-krályno feladatban n db králynot kell elhelyezn úgy egy n*n-es sakktáblán, hogy semelyk ketto ne üsse egymást. Az elso megvalósítás SICStus Prologban: :- use_module(lbrary(clpfd)). % A Qs lsta N krályn?o bztonságos elhelyezését mutata % egy N*N-es sakktáblán: ha a lsta. eleme, akkor % az. krályn?ot az. sor. oszlopába kell helyezn. queens(n, Qs) :- length(qs, N), doman(qs, 1, N), safe(qs).
% safe(qs): A Qs krályn?o-lsta bztonságos. safe([]). safe([q Qs]):- no_attack(qs, Q, 1), safe(qs). % no_attack(qs, Q, I): A Qs lsta által leírt krályn?ok % egyke sem támada a Q által leírt krályn?ot, ahol % Qs a (, +1,...) sorbel krályn?oket íra le, % Q a. sorbel krályn?ot, és I = - > 0. no_attack([],_,_). no_attack([x Xs], Y, I):- no_threat(x, Y, I), I1 s I+1, no_attack(xs, Y, I1). % Az X és Y oszlopokban I sortávolságra lev?o % krályn?ok nem támadák egymást, azaz nncsenek % azonos oszlopban, / vagy \ átlóban no_threat(x, Y, I) :- Y #\= X, Y #\= X-I, Y #\= X+I. Propagácó, él-konzsztenca változók közt fennáll egy c bnárs korlát, akkor a fent gráf, ) éle él- Ha és konzsztens (arc consstent), ha mnden = v, = u változó lekötés kelégít a c korlátot. ( v D értékhez létezk egy u D, hogy az Mnden más v D érték, azaz amelyekhez nem létezk lyen u, eltávolítható D - bol, hszen nem képezhet részét konzsztens megoldásnak. Ezen értékek eltávolítása élkonzsztenssé tesz a gráf, ) élét. Ezt a muveletet nevezzük a c korlát ( propagálásának. Megegyezzük, hogy, ) él-konzsztencáából nem következk ( (, ) él-konzsztencáa. Ez a defnícó és elárás általánosítható magasabb fokszámú korlátok esetére s. Ha a CSP mnden éle él-konzsztens, akkor a magát CSP-t s él-konzsztensnek nevezzük. Egy CSP él-konzsztenssé tétele relatíve gyorsan végrehatható, ezért a CLP rendszerek a feladatot a teles megoldás folyamat során gyekszenek él-konzsztensen tartan. Ezt úgy érk el, hogy valahányszor egy változó értékkészlete változk, az összes -t tartalmazó korlátot propagálák. Ez természetesen tovább nkonzsztens értékeket távolíthat el más változók értékkészletébol, egy propagácó-lavnát ndítva ezzel. Ha
ennek során egy változó értékkészlete üressé válk, akkor magától értetodoen nncs megoldása a feladatnak. Sanos egy CSP él-konzsztencáa nem elent azt, hogy a feladatnak van megoldása. A következo példa egy lyen esetet mutat. A korlátok bármelyke telesülhet benne, a korlátok mndegyke egydeuleg azonban nem. (A feladat megoldhatatlan, mert három változónak kellene felvenne az { 1,2} kételemu halmazból páronként különbözo értéket.) D 4 1 2 3 D, (( 4 1 D D 2 3 = {1,2}, = {1,2}, = {1,2}, = {2,3,4}, ) ( )) Láthatuk tehát, hogy a propagácó holtpontra uthat anélkül, hogy megtalálná a feladat létezo megoldását vagy bebzonyítaná annak megoldhatatlanságát. Ilyenkor a CLP rendszer keresés technkákat hív segítségül. Keresés Míg a legegyszerubb feladatokat pusztán propagácóval meg lehet oldan, bonyolultabb feladatok esetén a propagácót egy fa-keresés sémába kell ágyazn, a következok szernt: 1. Incalzáluk keresésünket egy n 0 gyökér csomóponttal, amelyet úgy kaptunk, hogy a feladat leírásán lefuttattunk egy él-konzsztenca algortmust. 2. Vegyük egy él-konzsztens, de lekötetlen változókat s tartalmazó n csomópontot. Legyenek c 1,...,ck olyan korlátok, amelyekre ( c c = ) és = I, c = 1... k azaz közülük mnden változó lekötésben pontosan egy telesül. 3. Generáluk az n csomópont k db gyermekét rendre úgy, hogy lemásoluk az n-ben érvényes értékkészleteket és korlátokat, mad hozzávesszük a megfelelo c -t. Mnden gyermeken futtassunk le egy él-konzsztenca algortmust. o Ha valamely n gyermek csomópontban egy változó értékkészlete kürül, akkor n eldobható, mert belole konzsztens megoldás nem származtatható. o Ha valamely n gyermek csomópontban mnden változó értékkészlete egyetlen v elemet tartalmaz, akkor az = v ) változó lekötés egy ( konzsztens megoldás. Aduk vssza ezt a megoldást. Ha tovább megoldásokra már nncs szükség, záruk le a keresést. o Az összes több csomópont él-konzsztens, és (tovább) megoldások lehetoségét horda magában, ezért llesszük be azokat a keresés fába. 4. Folytassuk a keresést a 2. pontnál.
Könnyu belátn, hogy ez az algortmus teles, és az általa vsszaadott megoldások konzsztens megoldása a feladatnak. Az algortmus hatékonyságát az ada, hogy a propagátorok nagyban leszukítk a változók értéktartományát, így az épülo keresés fa mérete sokszor több nagyságrenddel ksebb lesz, mnt egyszeru vsszalépéses keresés esetén, amt pl. a standard Prolog alkalmaz. A gyakorlatban szokás a 2. pontban szereplo c -ket rendre q = v -nek választan, ahol q = v egy valamlyen heursztka szernt választott lekötetlen változó, a q = v -k pedg = v eleme. A Prologos nevezéktanban az lyen elágazás stratégát használó q keresést szokás címkézésnek, labelngnek nevezn. Míg ha a SICStusban egy korlátozás programot labelng nélkül ndítunk el, akkor csak az él-konzsztenca algortmust futtata le rata, labelnggel az elso konzsztens megoldásg keres. Tovább megoldásokat a ; el bebllentyuzésével kérhetünk. % Labelng nélkül elakad a megoldás megtalálása elott.?- queens(4, Qs). Qs = [_A,_B,_C,_D], _A n 1..4, _B n 1..4, _C n 1..4, _D n 1..4? yes?- % Labelnggel megtaláluk az összes helyes megoldást.?- queens(4, Qs), labelng([], Qs). Qs = [2,4,1,3]? ; Qs = [3,1,4,2]? ; no?- Érdemes megegyezn, hogy míg a korlátozás propagácós algortmusok általában n gyorsak (polnom doben lefutnak), a keresés során akár d méretu fa építésére lehet szükség, ahol d az értékkészletek méretét, n a változók számát elöl. Mvel komoly következménye lehetnek a számítás dore nézve, nagyméretu feladatok megoldása során érdemes mndent elkövetn a keresés fa méretének csökkentéséért, az alább módszerek valamelykével: Erosebb, az értékkészleteket obban szukíto korlátok felírása, ld. redundáns korlátok, globáls korlátok, felhasználó korlátok. A szukebb értékkészlet ksebb elágazás tényezot bztosít. A keresés döntések ügyes megválasztása, ld. változó és érték sorrendezés. Az, hogy a fent algortmus 2. pontában hogyan választuk az n csomópontot, meghatározza a keresés típusát. Noha számos feladat smert, melynek megoldására a CLP-be skerrel ágyaztak be valamlyen nformált, sot, lokáls kereso elárást, a CLP rendszerek legtöbbször egyszeru mélység keresést használnak. Ennek oka a következo. Mnden egyes keresés csomópontban mnden változó aktuáls értékkészletének eltárolása túlzottan memóragényes lenne. Ezért nkrementáls tárolást alkalmaznak, azaz a
keresés fa csomópontaban csak a szülo csomópontokhoz vszonyított értékkészletszukítéseket tarták nylván. Így két, a fában egymástól távol csomópont közt váltás csak a fa éle mentén történo lépegetéssel oldható meg, szerencsétlen esetben egészen a gyökérg tartó vsszagörgetés után. Ennek költségét csak kvételes esetben, nagyon ó heursztka mellett ellensúlyozza az nformált keresés csomópont-hatékonysága. Változó sorrendezés A labelng során az elágazás tárgyát képezo változó kválasztására szolgáló heursztkákat nevezzük változó sorrendezésnek (varable orderng). Gyakran hatékony az a heursztka, hogy a feladat nehéz magát, a legproblematkusabb részfeladatot olduk meg eloször. Ezt gyekszk megvalósítan az ún. frst-fal elárás: feltételezzük, hogy mnden érték lekötés azonos eséllyel vezet konzsztens megoldáshoz, így mnél több eleme van D -nek, annál valószínubb, hogy szükség esetén találunk -hez konzsztens értéket. Fordítva pedg, mnél kevesebb eleme van D -nek annál nehezebb -hez értéket választan, ezért érdemes az aktuálsan legksebb értékkészlettel rendelkezo változón elágazn. A SICStus Prologban a beépített frst-fal labelng elárás a következoképpen hívható:?- queens(4, Qs), labelng([ff], Qs). Érték sorrendezés (Value orderng) Mután meghatároztuk az változót, amelyen elágazunk, el kell döntenünk, hogy mlyen sorrendben próbáluk hozzárendeln annak lehetséges értéket, D elemet, azaz mlyen sorrendben áruk be a keresés fa ágat. Az érték sorrendezésnek akkor lehet elentosége, ha csak az elso megoldásra keresünk vagy egy branch-and-bound algortmussal optmáls megoldást keresünk. Ha mndenképpen be kell árnunk a teles keresés fát, pl. mert az összes megoldást elo akaruk állítan vagy mert nncs megoldás, akkor az érték sorrend választása rreleváns. Ha az érték sorrend számít, érdemes eloször azt D -bol azt az értéket -hez, amelyk legnagyobb eséllyel vezet egy helyes megoldáshoz ll. az hozzárendeln optmáls megoldáshoz. Az ennek az esélynek a mérésére smert heursztkák a CSP gráfában -hez éllel kapcsolt, még lekötetlen változók értékkészleteben számolák össze az = v hozzárendeléssel konzsztens értékeket. Néhány tpkus alkalmazásban, pl. ütemezésben, specfkus, a tapasztalat által gazolt érték sorrend heursztkák állnak rendelkezésre.
Alapértelmezett érték sorrendezés stratégaként az elteredt CLP rendszerek, ha a felhasználó másképp nem rendel, növekvo sorrendben véggpróbálák D összes v elemét. A fa építése általában nem az egyszerubbnek tuno 1.a., hanem az 1.b. ábra szernt történk. Itt ugyans az egyes ágakról történo esetleges skertelen vsszatérést követoen a tárhoz adódk az v + 1 korlát, melynek propagálásával szerencsés esetben tovább értékkészlet-szukítések mehetnek végbe. = v 1 v2 = = vm = v 1 v2 = v 2 v3 1.a. 1.b. = v m 1 = vm A SICStus Prolog úgy, mnt a legtöbb CLP rendszer, lehetoséget nyút saát változó ll. érték sorrendezés heursztkák írására s, errol az rodalomegyzékben szereplo muvek tartalmaznak részleteket. Redundáns korlátok Egy redundáns korlát eplct megfogalmazása egy olyan feltételnek, amt egy CSP mplct módon tartalmaz: a formalzálásakor nem vettük fel korlátként, mégs tudható, hogy CSP összes konzsztens megoldására telesül. A redundáns korlátok hozzávétele a CSP-hez nagyban gyorsíthata a megoldás folyamatot a keresés fa hatékonyabb nyesése által. Természetesen felesleges olyan redundáns korlátot hozzávenn a CSP-hez, amnek kelégítését a már meglévo korlátokon futó él-konzsztenca algortmusok s közvetlenül bztosítanak. Pl. ha a CSP-ben szerepelnek az a = b + c és c = d + e korlátok, akkor az a = b + d + e korlát hozzávétele tovább nyesést nem eredményez, sot, a megoldást ks mértékben lassíta a propagácós lépések deének növekedésével. Globáls korlátok Különbözo feladatokban gyakran elofordulnak bzonyos ellegzetes összefüggések a feladat változó, vagy a változók egy részhalmazának eleme közt. Pl. megkövetelhetük, hogy változók egy,..., ] lstáának eleme páronként különbözo értéket vegyenek [ 1 k
fel. Az lyen, sok, nem határozott számú változó közt, azaz globáls összefüggések leírására a CLP rendszerek gyakran mplementálnak hatékony propagáló algortmust, ún. globáls korlátot (global constrant). A fent mnd különbözo korlátot mplementála a SICStus-ban az all_dfferent/1 predkátum. Ugyanezt a korlátot természetesen deklarálhatnánk úgy s, hogy mnden,, változó-párra felíruk az artmetka korlátot, de az messze nem vezetne olyan hatékony propagácóhoz: 1 2 3 4 5 1 2 3 4 Tekntsük a fent példát. A 4 változó mndegykének értékkészletében azon értékek azon értékek szerepelnek, melyekhez éllel kötve van. Ekkor a korlátok egyke sem tud tüzeln, hszen bármely két változó lekötheto két különbözo értékre. Mégs, látható, hogy a feladat megoldhatatlan, mert az 1 és 2 értékekhez három változó s van, melyek csak a két érték valamelykét vehetk fel. Az all_ dfferent korlát ezt felsmer: a fent feladatot mnt párosítás problémát olda meg: a páros gráfban keresünk alulról teles párosítást. Általában elmondható, hogy a globáls korlátok számításgényesebbek, mnt az egyszeru korlátok, de ez boven kfzetodk a hatékonyabb propagácó által. Alább az n-krályno feladat egy alternatív, hatékonyabb megvalósítását látuk, globáls korlátok használatával. :- use_module(lbrary(clpfd)). % A Qs lsta N krályn?o bztonságos elhelyezését mutata % egy N*N-es sakktáblán: ha a lsta. eleme, akkor % az. krályn?ot az. sor. oszlopába kell helyezn. queens(n, Qs) :- length(qs, N), doman(qs, 1, N), safe(qs). % safe(qs): A Qs krályn?o-lsta bztonságos. safe(qs):- dag_rghtdown(qs, QsRD), dag_rghtup(qs, QsRU), all_dfferent(qs), all_dfferent(qsrd), all_dfferent(qsru). % Az oszlopok szernt számozából eloállítuk a % \ átlók szernt számozást. dag_rghtdown(qs, QsRD):-
dag_rghtdown0(qs, QsRD, 0). dag_rghtdown0([], [], _). dag_rghtdown0([l0 L], [LRD0 LRD], N):- LRD0 #= L0 - N, N1 s N+1, dag_rghtdown0(l, LRD, N1). % Az oszlopok szernt számozából eloállítuk a % / átlók szernt számozást. dag_rghtup(qs, QsRU):- dag_rghtup0(qs, QsRU, 0). dag_rghtup0([], [], _). dag_rghtup0([l0 L], [LRU0 LRU], N):- LRU0 #= L0 + N, N1 s N+1, dag_rghtup0(l, LRU, N1). Felhasználó korlátok Találkozhatunk olyan feladattal, amely nem írható le kézenfekvo módon a CLP rendszer beépített korlátaval, vagy a feladatra vonatkozó specáls smeretek brtokában a beépített korlátokénál hatékonyabb propagácót tudnánk megvalósítan. Ilyenkor lehetoség van saát felhasználó korlátok defnálására. Egy c ( 1,..., k ) korlát defnálásához meg kell adnunk, hogy amkor korlátban szereplo valamely változóról kderül, hogy nem vehet fel értékkészletének valamely v értékét, akkor a több változó értékkészletébol a c ( 1,..., k ) alapán mely értékekrol látható be, hogy nkonzsztensek. Errol az rodalomegyzékben szereplo muvek tartalmaznak részleteket., Szmmetratörések Sok feladatban elofordulnak ekvvalens megoldások. Pl. a 8-krályno problémában lényegleg azonosnak (szmmetrkusnak) teknthetük azokat, amelyek egymásból forgatással eloállíthatók. Egyrészt elofordulhat, hogy nem szeretnénk az összes szmmetrkus megoldást vszontlátn a megoldások közt. Másrészt, ha nagy számban fordulnak elo, lényegesen lassíthaták a megoldás folyamatot. A keresés fában ugyans a szmmetrkus megoldás- vagy részmegoldás-csoportok mnden taga külön ágként szerepel, így a keresés algortmus azok mndegykét külön-külön beára. Ez telesen
felesleges, hszen ha az egyk lyen ágon nncs megoldás, akkor a másk, szmmetrkus ágon sem lehet. Szmmetratörésnek nevezzük mndazon elárásokat, melyek a szmmetrkus megoldásosztályok tagaból egy reprezentánst meghagynak, a többt kzárák. Ez úabb korlátok hozzáadásával történhet. Pl. a 8-krályno probléma forgatás szmmetráát megtörhetük azáltal, hogy eloíruk, hogy az elso sorban a bal térfélen, az elso oszlopban pedg a felso térfélen van a krályno. A szmmetrák egy specáls esete, amkor az adatstruktúrák egyszerusítése (pl. négyzetes mátrok bevezetése) célából vagy egyéb megfontolásból dummy változókat veszünk fel, melyeknek értékkészlete egynél több elemet tartalmaz. Nylvánvalóan rreleváns, hogy ezen értékek közül melyket veszk fel. Ezért a dummy változókat a korlátozás programban egy-egy unárs korláttal le kell kötn. Optmalzálás feladatok A különbözo CLP eszközök azonos megközelítést használnak az optmalzálás feladatok kelégíthetoség problémára való vsszavezetésére. Tételezzük fel, hogy mnmalzálás problémáról van szó. Változóként felveszk a célfüggvény-értéket reprezentáló O -t, és a programhoz hozzáadák az O = O(X ) korlátot, mad eloállítanak egy kezdet megoldást. Ezután cklkusan elmentk az utolsó konzsztens megoldásból O értékét az opt változóba, és a CSP-hez hozzáadák az O opt 1 korlátot. Így eloállítanak egy úabb megoldást, és ezt smételgetk, míg létezk az ú korlátokat kelégíto megoldás. Nylvánvaló, hogy ekkor a megoldások célfüggvény-értéke szgorúan monoton csökken, továbbá, az utolsóként megtalált megoldás az (egyk) optmáls. Az algortmus a kezdet megoldás megtalálása után any-tme algortmusként vselkedk, azaz komple feladatok esetén, ha nncs lehetoség az optmáls megoldás ésszeru doben történo megtalálására, megszakítható, az aktuáls utolsó megoldás konzsztens lesz, mnosége pedg a keresésre szánt do növekedésével avul.
Felhasznált és aánlott rodalom: Smth, B. M.: A tutoral on constrant programmng. http://scom.hud.ac.uk/staff/scombms/papers/researchreports/95_14.ps Szered P.: Nagyhatékonyságú logka programozás. BME egyetem egyzet. http://www.nf.bme.hu/~szered/nlp/nlp03a.html Marrott, K. and Stuckey, P. J.: Programmng wth constrants: an ntroducton. The MIT Press, 1998. ILOG Solver 5.1. User s manual.
Ellenorzo kérdések Mutass egy mnél ksebb korlátozás programot, amelyet szernted nem oldana meg keresés nélkül a Prolog. Mlyen lehetoségeket smersz korlátozás programok hatékonyságának növelésére? Ad megoldást a 8-krályno problémában az átlókra való tengelyes tükrözés szmmetráának törésére.