Vestavěné predikáty pro labeling CLPCFD) - prohledávání Uspořádání hodnot a proměnných Při prohledávání je rozhodující uspořádání hodnot a proměnných Určují je heuristiky výběru hodnot a výběru proměnných TabelingC [] ). TabelingC Variables ) :- select_variable(Variables,Var,Rest), select_va"lue(Var,Va"lue), C Var #= Value, TabelingC Rest ) Var #\= Value , % nemusí dojít k instanciaci Var TabelingC Variables ) % proto pokračujeme se všemi proměnnými včetně Var ). Statické uspořádání: určeno už před prohledáváním Dynamické uspořádání: počítá se během prohledávání Hana Rudová, Logické programování I, 26. dubna 2011 3 CLP(FD) Instanciace proměnné Variable hodnotami v její doméně indomain( Variable ) hodnotyjsou instanciovány při backtrackingu ve vzrůstajícím pořadí ?- X in 4. .5, indomain(X). X = 4 ? ; X = 5 ? TabelingC [] ). TabelingC [Var|Rest] ) indomain( Var ) , TabelingC Rest ) . % výběr nejlevější proměnné k instanciaci % výběr hodnot ve vzrůstajícím pořadí ■ TabelingC Options, Variables ) ?- A in 0..2, B in 0..2, B#< A, labeling([], [A,B]). Hana Rudová, Logické programování I, 26. dubna 201 1 2 Výběr hodnoty Obecný princip výběru hodnoty: první úspěch (succeed first) ■ volíme pořadí tak, abychom výběr nemuseli opakovat ■ ?- domai n( [A, B, C] , 1,2) , A#=B+C. optimální výběr A=2,B=1 ,C=1 je bez backtrackingu Parametry 1 abeling/2 ovlivňující výběr hodnoty př. labe"ling([down], Vars) ■ up: doména procházena ve vzrůstajícím pořadí ■ down: doména procházena v klesajícím pořadí Parametry 1 abel i ng/2 řídící, jak je výběr hodnoty realizován ■ step: volba mezi X #= M, X #\= M ■ viz dřívější příklad u "Uspořádání hodnot a proměnných" ■ enum: vícenásobná volba mezi všemi hodnotami v doméně ■ podobně jako při indomain/1 (default) (default) Hana Rudová, Logické programování I, 26. dubna 201 1 CLP(FD> Výběr proměnné Obecný princip výběru proměnné: first-fail ■ výběr proměnné, pro kterou je nejobtížnější nalézt správnou hodnotu pozdější výběr hodnoty pro tuto proměnnou by snadněji vedl k failu ■ vybereme proměnnou s nejmenší doménou ■ ?- domai n ([A, B, C] , 1,3) , A#<3 , A#=B+C. nejlépe je začít s výběrem A Parametry labeling/2 ovlivňující výběr proměnné ■ leftmost: nejlevější (default) ■ ff: s (1) nejmenší velikostí domény fd_size(Var,Size) (2) (pokud s nejmenší velikostí domény více, tak) nejlevější z nich ■ f f c: s (1) nejmenší velikostí domény (2) největším množstvím omezením „čekajících" na proměnné fd_degree(Var,Size) (3) nejlevější z nich ■ mi n/max: s (1) nejmenší/největší hodnotou v doméně proměnné (2) nejlevnějšíz nich fd_min(Var,Min)/fd_max(Var,Max) Hana Rudová, Logické programování I, 26. dubna 2011 5 CLP(FD) Příklad: kumulativní rozvrhování Vytvořte rozvrh pro následující úlohy, tak aby nebyla překročena kapacita 1 3 zdroje, a minimalizujte celkovou dobu trvání úloha doba trvání kapacita tl 16 2 t2 6 9 t3 13 3 t4 7 7 t5 5 10 t6 18 1 t7 4 11 Hana Rudová, Logické programování I, 26. dubna 2011 scheduleCSs, End) :-TengthCSs, 7), Ds = [16, 6, 13, 7, 5, 18, 4] , Rs = [2, 9, 3, 7, 10, 1, 11] , domain(Ss, 0, 51), domain([End], 0, 69), afterCSs, Ds, End), % koncový čas cumulativeCSs , Ds, Rs , 13), appendCSs, [End], Vars), labe]ing([minimize(End)], Vars). after([], [] , _) . after([S|Ss], [D|Ds], E) :- E #>= S+D, afterCSs, Ds, E). | ?- scheduleCSs, End). Ss = Ss = [0,16,9,9,4,4,0], End = 22 ? 7 CLP(FD) Hledání optimálního řešení (předpokládejme minimalizaci) Parametry labeling/2 pro optimalizaci: minimize(F)/maximize(F) ■ Cena #= A+B+C, ]abe]ing([minimize(Cena)], [A,B,C]) Metoda větví a mezí (branch&bound) ■ algoritmus, který implementuje proceduru pro minimalizaci (duálně pro maximalizaci) ■ uvažujeme nejhorší možnou cenu řešení UB (např. cena už nalezeného řešení) ■ počítáme dolní odhad LB ceny částečného řešení Li? je tedy nejlepší možná cena pro rozšíření tohoto řešení ■ procházíme strom a vyžadujeme, aby prozkoumávaná větev měla cenu LB < UB pokud je LB > UB, tak víme, že v této větvi není lepší řešení a odřízneme ji ■ přidává se tedy inkrementálně omezení LB# v 1 proceduře AC-3CC) Q := {(íij) I (í.j) e hranyCC), í £ j} % seznam hran pro revizi while Q non empty do vyber a smaž (fc,m) z Q if revise((fc,m)) then % přidáni pouze hran, které Q := Q u {(í, k) e hrany(G), í 4= k, íj=m} % dosud nejsou ve fronte end while end AC-3 A řešení neexistuje ■ všechny domény jsou jednoprvkové => máme řešení ■ v obecném případě se alespoň zmenší prohledávaný prostor Hana Rudová, Logické programování I, 26. dubna 2011 15 Algoritmy pro CSP k-konzistence ■ Mají NC a AC něco společného? ■ NC: konzistence jedné proměnné ■ AC: konzistence dvou proměnných "... můžeme pokračovat ■ CSPje k-konzistentní právě tehdy, když můžeme libovolné konzistentní ohodnocení (k-1) různých proměnných rozšířit do libovolné k-té proměnné 4-konzistentní graf ■ Pro obecné CSP, tedy i pro nebinární podmínky Hana Rudová, Logické programování I, 26. dubna 201 1 16 Algoritmy pro CSP Silná k-konzistence Konzistence pro nalezení řešení 3-konzistentní graf (1.1) lze rozšířit na (1,1,1) (2.2) lze rozšířit na (2,2,2) 1,2 _ 1,2 _ 1 ?3 není 2-konzistentní (3) nelze rozšířit (1,3) ani (2,3) nejsou konzistentní dvojice (nerozšiřujeme je) ■ CSPje silně k-konzistentní právě tehdy, když je j-konzistentní pro každéj k-konzistence ■ Silná k-konzistence => j-konzistence V j < k ■ k-konzistence =fr silná k-konzistence ■ NC = silná 1 -konzistence = 1 -konzistence ■ AC = (silná) 2-konzistence Máme-li graf s n vrcholy, jak silnou konzistenci potřebujeme, abychom přímo našli řešení? ■ silná n-konzistence je nutná pro graf s n vrcholy ■ n-konzistence nestačí (viz předchozí příklad) ■ silná k-konzistence pro k k stačí hledat Hallův interval J: velikost intervalu / je rovna počtu proměnných, jejichž doména je v I Inferenční pravidlo ■ U = {Xi,...,Xk}, dom(U) = {Di u ■ ■ ■ uDk] ■ card(U) = card(dom(U)) Vv e dom(U), VX e (V - U),X ± v ■ hodnoty v Hallově intervalu jsou pro ostatní proměnné nedostupné Složitost: 0(2") - hledání všech podmnožin množiny n proměnných (naivní) O(nlogn) - kontrola hraničních bodů Hallových intervalů (1998) učitel min max Jan 3 6 Petr 3 4 Anna 2 5 Ota 2 4 Eva 3 4 Marie 1 6 Hana Rudová, Logické programování I, 26. dubna 201 1 Algoritmy pro CSP