630 likes | 787 Views
Wykład 3: Skończone dziedziny więzowe. Skończone dziedziny więzowe. Problem spełnialności więzów Solwer nawracający zgodność łukowa i węzłowa zgodność graniczna zgodność uogólniona Optymalizacja dla arytm. csp. Skończone dziedziny więzowe. Ważna klasa dziedzin więzowych
E N D
Skończone dziedziny więzowe • Problem spełnialności więzów • Solwer nawracający • zgodność łukowa i węzłowa • zgodność graniczna • zgodność uogólniona • Optymalizacja dla arytm. csp
Skończone dziedziny więzowe • Ważna klasa dziedzin więzowych • Używana do modelowania problemów związanych z przydziałem prac, wyborem tras, planowaniem • Najbardziej użyteczna dla przemysłu dziedzina więzowa
Problem spełnialności więzów • Problem spełnialności więzów składa się (CSP) : • Z więzu C nad zmiennymi x1,..., Xn • Dziedziny D która przypisuje zmiennej xi zbiór możliwych wartości d(xi) • Rozumiemy go jako więz jako więz
Kolorowanie map Klasycznym CSP jest problem takiego kolorowania mapy, że sąsiadujące obszary mają różne kolory Czy można pokolorować mapę Australii 3-ma kolorami?
Q1 Q2 Q3 Q4 1 2 3 4 4 hetmany Umieść 4 hetmany na szachownicy 4 x 4 tak, by się wzajemnie nie szachowały Cztery zmienne Q1, Q2, Q3, Q4 rząd hetmana w każdej kolumnie. Dziedziną każdej zmiennej jest {1,2,3,4} Jedyne rozwiązanie! -->
4 hetmany Więzy: Nie w jednym rzędzie Inne przekątne (góra) Inne przekątne (dół)
Plecak przemytnika Przemytnik z plecakiem o pojemności 9, musi wybrać rzeczy zapewniające zysk co najmniej 30 Jaka powinna być dziedzina zmiennych?
Prosty solwer nawracający • Najprostszy sposób rozwiązania csp to przejrzeć wszystkie możliwe rozwiązania • solver nawracający: • wylicza po kolei wartości dla każdej zmiennej • Sprawdza, czy jakiś więz bazowy staje się fałszywy • Zakładamy, że satisfiable(c) zwraca false gdy więz bazowy c bez zmiennych jest niespełnialny
Częściowo spełnialny • Sprawdź, czy więz jest niespełnialny z powodu więzu bazowego bez zmiennych • Partial_satisfiable(c) • For each primitive constraint c in C • If vars(c) is empty • Ifsatisfiable(c) = falsereturnfalse • Returntrue
Solwer nawracający • Back_solve(c,D) • Ifvars(c) is empty returnpartial_satisfiable(c) • Choose x in vars(c) • For each value d in D(x) • Let c1 be c with x replaced by d • Ifpartial_satisfiable(c1) then • Ifback_solve(c1,D) then returntrue • Returnfalse
Solwer nawracający Wybierz zm. Z dziedzina {1,2} Zmienna X dziedzina {1,2} Wybierz zm. Y dziedzina {1,2} Choose var X domain {1,2} Wybierz zm. Y dziedzina {1,2} Brak zmiennych, i false Częściowo spełn.false Brak zmiennych, zatem false
Zgodność węzłowa i łukowa • Postawowa idea: znajdź CSP równoważny oryginalnemu, ale z mniejszymi dziedzinami • W danym momence analizuj 1 więz bazowy c • zgodność węzłowa: (vars(c)={x}) usuń każdą wartość z dziedziny x, która falsyfikuje c. • zgodność łukowa: (vars(c)={x,y}) usuń każdą wartość z d(x) dla której nie ma wartości w d(y) spełniającej c i vice versa
Zgodność węzłowa • Więz bazowy c jest zgodny węzłowo z dziedziną D jeśli |vars(c)| !=1 lub • Jeżeli vars(c) = {x} wtedy dla każdego d w d(x) • przypisanie d do X jest rozwiązaniem c • CSP jest zgodny węzłowo, jeżeli każdy więz bazowy jest zgodny węzłowo
Przykłady na zgodność węzłową CSP nie jest zgodny węzłowo (zob. Z) Poniższy CSP jest zgodny węzłowo Kolorowanie mapy i 4-hetmany to CSP zgodne węzłowo.
Osiąganie zgodności węzłowej • Node_consistent(c,d) • For each prim. constraint c in C • D := node_consistent_primitive(c, D) • ReturnD • Node_consistent_primitive(c, D) • If|vars(c)| =1then • Let {x} = vars(c) • ReturnD
Zgodność łukowa • Więz bazowy c jest zgodny łukowo z dziedziną D jeśli |vars{c}| != 2 lub • Vars(c) = {x,y}, dla każdego d w d(x) istnieje e w d(y) • Podobnie dla y • Więz jest zgodny łukowo, jeżeli wszystkie jego więzy bazowe są zgodne łukowo
Przykłady na zgodność łukową Ten CSP jest zgodny węzłowo, ale nie łukowo Np.wartość 4 dla X oraz X < Y. Następujące CSP jest spójne łukowo Kolorowanie map i 4-hetmaty to CSP spójne łukowo
Osiąganie spójności łukowej • Arc_consistent_primitive(c, D) • If|vars(c)| = 2then • ReturnD • Usuń wartości, które nie stanowią zgodnych łuków z c
Osiąganie spójności łukowej • Arc_consistent(c,d) • Repeat • W := d • For each prim. Constraint c in C • D := arc_consistent_primitive(c,d) • UntilW = D • ReturnD
Używanie zgodności w. i ł. • Możemy zbudować solwer więzowy korzystając ze spójności • Dwa istotne rodzaje dziedzin • Dziedzina ,,fałszywa’’: pewna zmienna ma pustą dziedzinę • Dziedzina ,,wartościująca’’: każda zmienna ma jednopunktową dziedzinę • Rozszerzamy satisfiable do CSP z dziedziną wartosciującą
Solwer zgodnościowy • D := node_consistent(C,D) • D := arc_consistent(C,D) • ifD is a false domain • returnfalse • ifD is a valuation domain • returnsatisfiable(C,D) • returnunknown
WA NT SA Q NSW V T Solwer zgodnościowy Kolorowanie Australii z więzami zgodność węzłowa
WA NT SA Q NSW V T Przykład Kolorowanie Austalii: z więzami zgodność łukowa
WA NT SA Q NSW V T Przykład Kolorowanie Australii: z więzami zgodność łukowa
WA NT SA Q NSW V T Przykład Kolorowanie Australii: z więzami zgodność łukowa Odpowiedź: unknown
zgodnościowy solwer nawracający • Możemy połączyć zgodność z solwerem nawracającym • Ze spójności korzysta się przed uruchomieniem solwera i za każdym razem gdy wybrana zostanie wartość dla zmiennej.
Przykład: solwer n-z Q1 Q2 Q3 Q4 1 Żadnej możliwej wartości dla Q3! Nie można przypisać żadnej wartości dla Q3 Musimy zatem wybrać inną wartość dla Q2. 2 3 4
Przykład: solwer n-z Q1 Q2 Q3 Q4 1 Backtracking… Find another value for Q3? No! backtracking, Find another value of Q2? No! nawracanie, Znajdź inną wart. dla Q2 Q2=2 We cannot find any possible value for Q4 in this case! 2 3 4
Przykład: solwer n-z Q1 Q2 Q3 Q4 1 2 3 4
Przykład: solwer n-z Q1 Q2 Q3 Q4 1 2 3 4
WA NT SA Q NSW V T zgodność: przykład Kolorowanie Australii: z więzami Wyliczanie z nawracaniem Wybierz zmienną z dziedziną większą niż 1, T Dodaj więz Zastosuj zgodność Answer: true
Zgodność graniczna • A co z więzami bazowymi z więcej niż jedną zmienną? • zgodność hiperłukowa: zozszerzenie spójności łukowej do dowolnej liczby zmiennech • Niestety problem ten jest NP-trudny • Jak to rozwiązać?
zgodność graniczna • Arytmetyczne CSP: więzy są całkowite • zasięg: [l..u] przedstawia zbiór liczb całkowitych {l, l+1, ..., u} • pomysł: użyj zgodności dla liczb rzeczywistych i zajmuj się jedynie końcami dziedzin każdej zmiennej • min(D,x) definiujemy jako najmniejszy element dziedziny, podobnie max(D,x)
zgodność graniczna • Więz bazowy c jest zgodny granicznie z dziedziną D jeśli dla każdej zmiennej x w vars(c) • istnieją rzeczywiste d1, ..., dk dla pozostałych zmiennych x1, ..., xk takie, że • jest rozwiązaniem c • i podobnie dla • Arytmetyczne CSP jest zgodne granicznie, jeżeli wszystkie jego więzy są z.g.
zgodność graniczna. Przykład Nie jest zgodny granicznie, gdy Z=2, to X-3Y=10 Dziedzina poniżej jest spójna granicznie Porównaj z dziedziną spójną hiperłukowo
Osiąganie zgodności granicznej • Dla danej bieżącej dziedziny D chcemy tak zmodyfikować jej punkty graniczne, by osiągnąć zgodność • zrobią to reguły propagacji
Osiąganie zgodności granicznej Rozważmy więz bazowy X = Y + Z równoważny trzem następującym postaciom Wnioskowanie o wartościach minimalnej i maksymalnej: Reguły propagacji dla więzu X = Y + Z
Osiąganie zgodności granicznej Powyższe reguły wymuszają: Zatem można zredukować dziedzinę do
Więcej reguł propagacji Dla zadanej dziedziny początkowej: Otrzymujemy, że nowa dziedzina:
Nierówności Takie nierówności dają słabe reguły propagacji, jedynie wówczas, gdy jedna ze stron ma ustaloną wartość równą minimalnej bądź maksymalnej wartości tej drugiej.
Mnożenie Proste, gdy wszyskie zmienne są dodatnie Przykładowo: staje się: Ale co ze zmiennymi, które mogą być 0 jub mniej?
Mnożenie Oblicz ograniczenia na X analizując wartości ekstremalne Podobnie dla górnych ograniczeń X używając maksimum Nie działa dla Y i Z? Jeśli min(D,Z) <0 i max(D,Z)>0 to nie można ograniczyć przedziały Y (używamy wartości rzeczywistych (e.g. 4/d)
Mnożenie Możemy czekać, aż do momentu gdy zasięg Z będzie dodatni lub ujemny i wówczas użyć reguł division by 0:
Algorytm zgodności granicznej • Stosuj reguły propagacji dla więzów bazowych, aż nie będzie możliwa żadna zmiana dziedziny • Nie musimy zajmować się więzem jeżeli nie zmieniły się dziedziny zmiennych w nim zawartych
zgodność graniczna: przykład Problem plecakowy (nie ma whiskey) Dalej nie ma żadnych zmian Musimy jeszcze raz zanalizować więz ,,zyskowy’’
Solwer graniczny zgodnościowy • D := bounds_consistent(C,D) • ifD is a false domain • returnfalse • ifD is a valuation domain • returnsatisfiable(C,D) • returnunknown
Nawracający solwer zgodnościowy g. • Zastosuj solwer zgodnościowy g przed uruchomieniem solwera nawracającego i za każdym razem, gdy zmiennej nadana zostanie wartość
Przykład: solwer nsg Problem plecaka (dostępna whiskey) Bieżąca dziedzina: Początkowa zgodność graniczna W = 0 Znaleziono rozwiązanie: zwracaj true P = 1 (0,1,3)
Przykład: solwer nsg Problem plecakowy (dostępna whiskey) Bieżąca dziedzina: Backtrack Backtrack Początkowa zgodność graniczna W = 0 W = 1 W = 2 P = 1 P = 2 P = 3 (1,1,1) (2,0,0) Brak dalszych rozw. (0,1,3) false (0,3,0)