Constraints • • Constraint Processing, 2003, Rina Dechter Guter Überblick auch: Russel, Norwig, Kap.5 Definition: A constraint is a restriction on a space of possibilities, it is a piece of knowledge that narrows the scope of this space. Annotations: Because constraints arise naturally in most areas of human endeavor, they are most general means for formulation regularities that govern our computational, physical, biological and social worlds: • the angles of a triangle must sum to 180 degrees • 4 nucleotides that make up a DNA strand can only combine particular sequences • Susan cannot married to John ..... (fehlt noch was) They identify the impossible, narrow down the realm of possibilities, and thus permit us to focus more effectively on the possible. Formulating problems in terms of constraints enables a natural, declarative formulation of WHAT must be satisfied, without having to say how it should be satisfied. „As the complexity of the problem grows, we turn to computers to help us find an acceptable solution. Computer scientists have devised languages to model constraint satisfaction problems (CSP) and have developed methods for solving them. In general, the tasks posed in the language of constraints are computationally intractable (NP-hard) which means that you cannot expect to design an algorithm that scales effectively with the problem size, in all cases: P=NP P≡Polynomiale Zeit NP≡In polynomialer Zeit nur mit Nicht-Deterministischem Automat der direkt die Lösung rät However it is possible and desirable to identify special properties of a problem class that can accommodate efficient solutions and to develop general algorithms that are efficient for as many problems as possible. • Tractable classes (of problems) • approximation algorithms Problem-Klasse, zum Beispiel Stundenplan-Planung: • Das Problem hat Instanzen, zum Beispiel WS 04/05 an FB5, FH GE • Das Problem hat Unterklassen: • Die Stundenplan-Planung an der FH GE, FB5 Manchmal/ meistens werden die Instanzen auch Probleme genannt. Besser wäre vermutlich die folgende Sprechweise: • Problemklasse: Stundenplan-Planung (Problem) • Unterklasse: Studenplan-Planung im FB5 an der FH GE (Subclass) • Problem: WS 04/ 05 am FB5/ FH GE (Instance Problem) NP-hard bezieht sich auf Problem-Klassen. Eine Klasse ist bereits dann NP-hard, wenn sich ein einzelnes hartes Problem finden, d.h. Aber auch, dass es viele Probleme geben kann, die leicht zu lösen oder schnell als unlösbar zu erkennen sind. Wir wollen: • „leicht“ lösbare Probleme (Instanzen) effizient lösen • unlösbare Probleme möglichst schnell erkennen • „hart“ lösbare Probleme in der zur Verfügung stehenden Zeit möglichst gut annähernd lösen. Einige Begriffe im Überblick • • • • • • • Every Constraint Problem contains Variables: Objects or items that can take on a variety of values. The set of possible values for a given variable is called a domain. Constraints are rules that impose a limitation on the values that a variable or a combination of variables may be assigned to. A model that includes variables, their domains and constraints is called a constraint problem or constraint network. A solution is an assignment of a single value from its domain to each variable such that no constraint is violated. A problem may have one, many or no solution. A problem that has one or more solutions is satisfiable (erfüllbar) or consistent (konsistent) Mathematische Hintergründe Mengen, Domains und Tuple A set is a collection of distinguishable objects and an object in the collection is called member or an element of the set. Schreibweise: x ist Element der Menge A : x∈ A x ist nicht Element der Menge A: x not ∈ A Eine Menge kann durch Aufzählung/ Aufschreiben der Elemente explizit definiert werden: A={1, 2, 3}(extensionale Definition) oder man definiert eine Menge implizit durch Angeben von Bedingungen: A={x∣x∈ℕ und 1 x3}(intensionale Definition) (Die beiden As sind identisch) Falls jedes Element einer Menge A auch Element einer Menge B ist, Schreiben wir A⊆B (Subset⊆) und sagen A ist Teilmenge von B. A ist eine echte Teilmenge von B, falls A⊆B und A≠B , in Zeichen A⊂B . (Proper Subset⊂) Given two sets A and B, we can define new sets by applying set operations: A∩B={x∣x∈ A und x∈B} (Schnitt / Intersection) A∪B={x∣x∈ A oder x∈B} (Vereinigung / Union) A∖ B={x∣x∈ A und x∉B} (Differenz / Difference) Einige Anmerkungen zu Mengen: • Die Menge ohne Elemente heißt leere Menge, ∅ . • Die Anzahl der Elemente in einer endlichen Menge S heißt Größe oder Mächtigkeit (cardinality) der Menge, ∣S∣. • Zwei Mengen A, B heißen disjunkt (disjoint), wenn sie keine gemeinsamen Elemente haben, d.h. A∩B=∅. • Eine Variable ist eine „collection of values“, die domain genannt wird #, d.h. Der Domain einer Variable ist eine Menge, die alle Objekte, für die eine Variable möglicherweise stehen kann bzw. Werte, die die Variable annehmen kann, enthält. • Ein K-Tupel (k-tuple) oder einfach: ein Tupel ist eine Folge (sequence) von k nicht notwendigerweise verschiedene Objekte a 1 ,... , a k . Ein Objekt in der Folge wird Kompente (component) genannt. • Das kartesische Produkt (oder einfach Produkt) einer Liste von Domains D 1 , ... , D k ist die Menge aller k-Tupel a 1 , ... , a k , so dass a 1 ∈D 1 ; a 2 ∈D 2 ,... , a k ∈D k , geschrieben: D 1×D 2×...×D k . Beispiel: D1={black, green} D 2={apple juice, coffee, tee} D1×D 2={(black, apple juice), (black, coffee), (black, tee), (green, apple juice), (green, coffee), (green, tea)} Relationen Gegeben sie eine Menge X ={x 1 ; ... ; x k } von Variablen mit der zugehörigen Domains D1 ,... , D k . Relation Dann ist eine Relation R auf der Menge X der Variablen irgendeine Teilmenge von D 1×...×D k . Scope Die Menge der Variablen, auf denen eine Relation R definiert ist, heißt Scope der Relation, scope(R). Stelligkeit (arity) Jede Relation , die Teilmenge eines Produktes D 1×...×D k von k Domains ist, wird k-stellig (bzw. „von der Stelligkeit“) genannt. Falls k = 1, 2 oder 3 ist, wird die Relation unär (unary), binär (binary) oder ternär (ternary) genannt. Universelle Relation (universelle Relation) Falls R=D 1×...×D k ist, dann wird R die universelle Relation (über die Domain D 1 , ... , D k ) genannt. Wir werden häufig eine Relation R, die auf dem Scope S definiert ist, mit R s bezeichnen. Beispiel: Sei D, von oben der Domain der Variablen x 1 und D 2 von x 2 . Die Tupel-Menge {(black, coffee), (black, tee), (green, tee)} ist eine Relation auf {x 1 , x 2 }. Der Scope ist also {x 1 , x 2 } (Anmerkung: Die leere Menge ist auch eine Relation). Repräsentation von Relationen: Relationen sind Menge, also können wir sie explizit oder implizit definieren: Explizit: Die Relation im obigen Beispiel. R 2={ x 1 , x 2 ∣x 1 ∈ D 1 ; x 2 ∈ D 2 ; x 1 ist lexikografisch kleiner als x 2 } Implizit: heißt: x 1 kommt vor x 2 im Lexikon Es existieren zwei weitere Darstellungsformen für explizite Definitionen: • Tabellen • (0,1)-Matrizen R1={(black, coffee), (black, tee), (green, tee)} Tabellen-Darstellung x1 x2 black coffee black tea green tea Matrix-Darstellung x2 apple juice coffee tea black 0 1 1 x1 green 0 0 1 1: Diese Wertekonstruktion gibt es in der Relation. 0: Diese Kombination gehört nicht in die Relation. In der Tabellen-Darstellung steht jede Zeile für ein Tupel und jede Spalte entspricht einer bestimmten Komponente des Tupels. Operationen auf Relationen Schnitt, Vereinigung, Differenz Gegeben R und R' mit gleichem Scope. R∩R ' enthält alle Tupel, die in R und in R' sind. R∪R ' enthält alle Tupel, die in R oder in R' sind (Natürlich ist hier kein „exklusives“ oder gemeint). R∖ R' R' ∖ R enthält alle Tupel, die in R aber nicht in R' sind. ist analog. R−R ' R ' −R Merke: R∩R ' ; R∪R ' und R∖ R' sind wiederum Relationen. R−R ' Beispiel: R R' x1 x2 x3 x1 R' ' x2 x3 x1 x2 x3 a b c b b c a a 1 b b c c b c b c 2 c b c c n n b c 3 c b s Alle drei Relationen haben den gleichen Scope nämlich {x 1 , x 2 , x 3 }, wir können die Operation von oben anwenden. R∩R ' x1 R∪R ' x2 x3 x1 R−R ' x2 x3 x1 x2 x3 b b c a b c a b c c b c b b c c b s c b c c b s c n n 0 R = R∩R ' ∪ R ∖ R ' generelles Gesetz? ⇒ Ja! Selektion (Selection) Eine Selektion wählt aus einer Relation R eine Menge von Tupeln so aus, dass bestimmte Wertvorgaben für eine oder mehrere Variablen des Scopes durch die Tupel erfüllt werden. Es entsteht natürlich wieder eine Relation: Sei R eine Relation: x 1 , ... , x k sind die Variable im Scope von R. a i ist ein Element des Domains D i von x i . Dann ist R ' = x =a ,... , x =a R die Menge der Tupel aus R, die den Wert a 1 für die Variable x i für alle i aus i, ..., k haben. R' ist selbst eine Relation. Eine knappere Notation ergibt sich, wenn man y={x 1 ,... , x k } und t={a 1 ,... , a k } setzt und schreibt: y=t R {x , x }={a , c} Der Scope von R' ist gleich dem Scope von R. 1 1 k k 1 2 Beispiel: x =c R ' ( R ' aus den letztem Beispiel) 3 x1 x2 x3 b b c c b c Projektion Eine Projektion liefert eine Relation, die aus einer Relation R entsteht, indem man Spalten streicht (also eine oder mehrere Variablen aus dem Scope vernachlässigt). Sei R eine Relation. Sei y={x 1 ,... , x k } eine Teilmenge der Variablen im Scope von R. Damit ist y R die Projektion von R auf y, dass heißt es ist die Menge von Tupeln, die entsteht, wenn wir jedes Tupel aus R nehmen und aus diesen Tupeln alle Spalten entfernen, die nicht zu y gehören. Der Scope von y R ist natürlich y und damit eine Teilmenge des Scopes von R: {x , x } R ' ( R ' von oben) 2 x2 3 x3 b c n n (Achtung: Doppelte Überbleibsel sollte es nicht geben, obwohl das formal nicht falsch wäre, denn {a }={a , a}={a , a , a} . Also, Duplikate bitte entfernen! Die machen sonst nur unnötige Arbeit.) Join Der Join erzeugt aus zwei Relationen R S und RT eine neue Relation, die alle Kombinationen von Tupeln aus R S und RT enthält, die auf gemeinsamen Variablen wertmäßig übereinstimmen. Sei R S eine Relation mit Scope S. Sei RT eine Relation mit Scope T. Ein Tupel t ist im Join von R S und RT in Zeichen: R S join RT , falls es mit Hilfe der folgenden Schritte rekonstruiert werden kann: 1. Nehme Tupel s aus R S . 2. Wähl ein Tupel t aus RT so aus, dass t und s auf der Variablen aus S ∩T übereinstimmen und 3. Baue r dann aus s und t zusammen, indem für alle Variablen aus S −T die Werte von s benutzt werden, für alle aus T −S die aus t und für S ∩T , die aus s oder t. Der Scope der resultierenden Relation ist S ∪T . Anmerkung: • Wenn S =T , dann ist R S join RT =R S ∩RT . • Wenn wir das kartesische Produkt vorher als Operation auf Relationen eingeführt hätten, (wir haben es bis jetzt nur für Mengen, aber die Übertragung auf Relationen (also Mengen von geordneten Paaren mit Scope) ist klar), dann würde folgendes gelten: R S join RT = S∩T S ∩T R S ×RT (nicht so genau nehmen, da fehlt uns hier noch was – ist in Wirklichkeit etwas komplizierter, braucht uns aber jetzt nicht zu kümmern) Beispiel: R' R' ' x1 x2 x3 R ' join R ' ' x2 x3 x4 x1 x2 x3 x4 b b c a a 1 b b c 2 c b c b c 2 b b c 3 c n n b c 3 c b c 2 c b c 3 Zur Erläuterung der Anmerkung: 1. R'×R' ' x1 ' x2 ' x3 ' x2 ' ' x3' ' x4 ' ' b b c a a 1 b b c b c 2 b b c b c 3 c b c a a 1 c b c b c 2 c b c b c 3 ... ... ... ... ... ... 2. x ' =x ' ' , x ' =x ' ' R ' ×R ' ' 3. x ' , x ' , x ' , x ' ' ... 2 2 3 3 1 2 3 4 Graphen: Ein Graph G=V , E ist eine Struktur, die aus einer endlichen Menge von Knoten, V ={v 1 , ... , v n } und einer Menge von Kanten, E={e 1 , ... , e n } besteht. Anmerkung: • Knoten: vertices, nodes • Kanten: edges, arcs Jede Kante e ist inzident zu einem ungeordneten Paar von Knoten {u , v } , die nicht notwendigerweise verschieden sein müssen (inzident heißt: e „geht ein in“). Wenn die Knoten, zu denen e inzident ist, als geordnetes Paar u , v angegeben werden, dann ist e eine gerichtete Kante, sonst nennt man sie auch ungerichtete Kante. u v u=v Zeichnung 1: Mögliche Formen von Kanten Wenn zwei Konten durch eine Kante verbunden werden, d. h. Wenn es eine Kante gibt, die zu beiden inzident ist, dann nennt man die beiden Knoten auch benachbart oder direkt miteinander verbunden. (Im Buch (Constraint Processing, 2003, Rina Dechter) spricht sie nur bei gerichteten Kanten von Nachbarn. Das ist aber nicht gut.) Ein Graph mit gerichteten Kanten heißt auch gerichteter Graph oder Di-Graph („directed“). u v u=v Zeichnung 2: Gerichtete Graphen Sei G=V , E ein gerichteter Graph. Damit ist ein Pfad eine Folge von Kanten e 1 , e 2 ... , e n , so dass für alle e i−1 , e i , 2ik , gilt e i−1=u 1 , v 1 , e i =u 2 , v 2 , u 2=v 1 (Das könnte man sehr ähnlich auch für den ungerichteten Fall definieren). e1 e2 ...... Zeichnung 3: Kanten eines gerichteten Graphen ek Man kann einen Pfad auch als Folge von Knoten angeben: v 0 , v 1 , v 2 , ... , v k mit e i =u i−1 , v i ,1ik Hier ist v 0 der Startknoten, v k der Endknoten und die Länge des Pfads ist k (es werden also die Kanten gezählt). Ein Zyklus (cycle) bzw. Kreis, ist ein Pfad mit v 0=v k . Ein Pfad ist einfach (simple), wenn kein Knoten aus v mehr als einmal auftaucht (d.h. v 0 ≠v k für alle i , j ∈1,... , k mit i≠ j ). Ein Kreis ist einfach, wenn nur v 0 bis v k −1 nur einmal auftauchen. Falls es zu jedem Paar u , v ∈V mit u≠v einem Pfad gibt, dann ist der Graph zusammengehängt (verbunden, connected). Zeichnung 4: Nicht verbunden Der Grad (degree) eines Knotens ist die Anzahl der zu ihm inzidenten Kanten. Bei gerichteten Graphen kann man noch zwischen Eingangsgrad (Anzahl eingehender Kante) und Ausgangsgrad (Anzahl ausgehender Kanten) unterscheiden: Grad(v) = 3 v Eingangsgrad(v) = 2 Ausgangsgrad(v) = 1 Zeichnung 5: Grad eines Graphen Gerichtete Graphen Gegeben: Knoten u Die Menge der Knoten, von denen eine Kante zu u führt, bezeichnen wir mit pa(u) (parents). Die Menge der Knoten zu denen eine Kante von u aus führt, bezeichnen wir mit ck(u) (children). k1 pa u ={k 1 , k 2 } ck u ={k 3} k3 u k2 Zeichnung 6: Eltern und Kinder von Knoten Ein gerichteter Pfad ist eine Folge von Kanten e 1 , e 2 ... , e i , so dass der Endknoten einer jeden Kante e i−1 gleich den Startknoten der Kante e i ist 2ik . Wenn der Startknoten des Pfades gleich des Endknotens ist, dann haben wir einen gerichteten Zyklus. Ein gerichteter Graph ist streng zusammenhängend (strongly connected), falls es zu jedem Paar u , v∈V mit u≠v einen gerichteten Graph von u nach v gibt. Zeichnung 7: Streng zusammenhängend Nicht streng zusammenhängend Ein gerichteter Graph ist azyklisch, wenn es keinen gerichteten Zyklus enthält. Ein gerichteter Graph ohne Zyklen heißt auch BAUM. v1 e1 (G) v3 v2 e2 Zeichnung 8: Kein Baum (links) Baum (ungerichtet) (rechts) Sei S eine Menge von Knoten zu einem Graph G=U , E . S ⊆V. Dann ist G S ein Teilgraph von G, wenn er alle Knoten aus S (und keine anderen) und alle Kanten aus E, die nur zu Knoten in S inzident sind (auf beiden Seiten der Kante) enthält. Graph G (siehe oben) Alle Teilgraphen: S 1={v 1 , v 2 , v 3 } G s =G S 1={v 1 , v 2 }, s 2={v 2 , v 3 }, s3={v 1 , v 3 } S 4 ={v 1 }, S 5={v 2 }, S 6={v 3 } G S jeweils ein Knoten, keine Kante. Ein ungerichteter Graph ist komplett/ vollständig (complete), wenn jeder Knoten mit jedem benachbart ist. Beispiel: Zeichnung 9: Vollständiger Graph n-Knoten. Von jedem Knoten gehen n-1 Kanten ab, jede Kante geht in 2 Knoten ein, nn−1 also Kanten. (Wenn man wissen will, ob ein Graph vollständig ist, kann man 2 die Knoten und die Kanten zählen und mit der Formel prüfen.) Eine Clique ist ein vollständiger Teilgraph. v1 Clique (alle kennen sich untereinander) (G) e1 {v 2, v 3, v 4 }, {e 2, e 3, e 4 } v2 v2 ; v3 Maximale v ; v e2 3 4 Clique v2 ; v1 e3 v3 v 4 ; v 2 und e4 v 1 ; v 2 ; v 3 ; v 4 einzeln v4 (Man sucht oft nach der maximalen Clique) Zeichnung 10: Clique Komplexität Die Komplexität eines Algorithmus ist seine „worst-case“ Laufzeit T(n) über alle Eingaben der Größe n (Eigentlich: Zeitkomplexität). Asymptotische Analyse der Komplexität Intuitiv: Wenn wir schreiben: O f n ist die Komplexität eines Algorithmus, dann meinen wir, dass die Anzahl der vom Algorithmus benötigten Schritte als Funktion der Eingabegröße n ab einer hinreichend großen Eingabe durch c * f(n) nach oben beschränkt ist (für eine gewisse Konstante c). Zu einer gegebenen Funktion g(n) ist O g n die folgende Menge von Funktionen: O g n = { f n∣ ∃c , n0 so dass 0 f nc∗g n für alle nn0 } Für eine Funktion (ein Algorithmus) , die ein Element der Menge O(g(n)) ist, schreibt man auch als f n = O g n. Die Begrenzung nach oben soll „knapp“ (tight, „eng“) sein, d. h. 2 n2 = O n 2 Ist „knapp“, 2 n = O n 2 aber nicht (da ist noch viel Luft für eine „bessere“ = knappere Grenze). Zeitkosten Kosten für wachsendes n g(n) = 1,2*n n0 n (Eingabegröße) Zeichnung 11: Algorithmus A, der eine Funktion f(n) realisiert. Statt mit dieser nur sehr schwer genau bestimmbaren Funktion f zu arbeiten, versucht man f „abzuschätzen“ durch eine „knappere“ obere Grenze. Unser g(n) ist nun g(n) = n. Es gibt eine Konstante c = 1,2 und einen Wert n0 , so dass die Definition erfüllt ist. f n = O g n = O n. D.h. A hat lineare Zeitkomplexität. (Anmerkung: In der Zeichnung ist g(n) aber wohl keine „enge“ Grenze, denn der Verlauf sieht eher logarithmisch aus). Man kann auch Grenzen angeben, die nicht asymptotisch eng sind: o g n = { f n: für jede positive Konstante c und ein n0 gilt: 0 f nc⋅g n ∀ nn0 } Das Beispiel oben ist vermutlich nicht in o(n), aber sicher in o(n²). (Wenn das oben logarithmisch abschätzbar ist, dann wäre es auch in o(n)!) Man will die Funktionen/ Algorithmen in „Aufwandsklassen“ einteilen. Hier sind typische Klassen: O log log n O n log n O log n O n O n 2 O 2n O 22n ⋮ Es gilt: O log log n⊂O n log n⊂O log n⊂O n⊂O n 2 ⊂O 2n ⊂O 22n Konstanten spielen keine Rollen. Eine „engere“ Unterschätzung gibt man mit an, die „laxere“ Version der Unterschätzung ist (schwächere). Gibt an, wann die Abschätzung von oben und unten eng ist, d.h. f n = g n gdw. f n = f n=O g n= g n. Ein Polynom des Grades D ist eine Funktion p(n), der Form d p n = ∑ a i ni ; a i sind Konstanten i=1 Ein Polynom ist asymptotisch positiv, wenn und nur dann wenn a i 0 ∀ i . Wir sagen, dass eine Funktion f(n) polynomial beschränkt ist, falls f n=O n k für eine Konstante k gilt. Für eine Konstante a ist f n=a n eine Exponentialfunktion. Die Wachstumsrate von Exponentialfunktionen und Polynomen kann man durch folgende Beobachtung in einen Zusammenhang bringen: Für alle a , b mit a1 gilt: lim n ∞ nb =0 . an Bottom-Line hier: Algorithmen mit engen exponentiellen Abschätzungen will man nicht! Aber, einen Algorithmus nennt man tractable (lenkbar/ handhabbar), falls er polynomiale Komplexität hat. Eine Problemklasse ist tractable, falls ein polynomialer Algorithmus existiert, der jedes Problem aus der Klasse löst und er ist „intractable“, falls es bekannt ist, dass es einen solchen Algorithmus nicht geben kann. NP-vollständige Probleme sind eine Klasse von Problemen von denen man glaubt, dass sie im worst-case nur mit exponentiellen Aufwand zu lösen sind. Fast alle spannenden Probleme liegen im Raum zwischen „tractable problems“ and „intractable problems“. Abgesehen von polynomial begrenzten Unterschieden sind alle NP-vollständigen Probleme gleich schwer (innerhalb der gleichen Komplexitätsklasse), d. h. Falls wir/ sie/ jemand einen polynomialen Algorithmus für eine Problemklasse finden würden, hätte er/sie damit eine polynomiale Lösung für alle NP-vollständigen Probleme gefunden. NP-vollständige Probleme haben noch folgende wichtige Eigenschaft: Lösungskandidaten kann man in polynomialer Zeit verifizieren bzw. falsifizieren. NP-harte Probleme sind mindestens so schwer, wie NP-vollständige Probleme. Für diese Probleme ist nicht bekannt, ob Kandidaten in polynomialer Zeit untersucht werden können. Alle (für uns) interessanten Probleme sind NP-vollständig! Constraint Networks Definition: Ein Constraint Network ℜ besteht aus einer endlichen Menge von Variablen X ={x 1, ... , x n }, mit den dazugehörigen Domains D={v 1, ... , v R }, und einer Menge von Constraints C ={c 1, ... , c t }. ℜ kann man also als Tupel X , D ,C beschreiben. Ein Constraint c i ist eine Relation Ri , die auf einer Teilmenge si der Variablen definiert ist, si ⊆ x . Die Relation enthält die gültigen (erlaubten, legalen) simultanen Wertzuweisungen an die beteiligten Variablen. si nennen wir auch den Scope von Ri . {x 1, x 2 ,... , x n } s1 x 1, x 2 Scope von R1 1 0 2 1 ⋮ R1 Für S i ={x i , ... , x i } ist Ri eine Teilmenge des kartesischen Produkts D i ×...× D i . Wir können einen Constraint c i also auch als Paar c i = 〈 si , Ri 〉 ansehen. (Zur Erläuterung von c i = 〈 si , Ri 〉 : si : Auf welche Variable bezieht sich c i ? Ri : Welche Wertekombinationen sind erlaubt?) Sprechweise: Wenn der Scope klar ist, identifizieren wir ci auch direkt mit Ri . Die Constraint-Relation kann man auch direkt als R s angeben. Einen Scope kann man nun explizit als {x , y , z } schreiben. Wenn es nicht zu Unklarheiten kommen kann, dann kann man ihn auch kurz als xyz schreiben. So kann der Constraint über die Variablen x , y , z mit der zugehörigen Relation R auch wie folgt bezeichnet werden: R{x , y , z} oder R{xyz} oder 〈 {x , y , z }, R 〉 oder 〈 xyz , R 〉 Die Menge des Scopes S ={S 1 ,... , S i ,... , S t } nennen wir das Network Scheme (Schema). Ohne Beschränkung der Allgemeinheit nehmen wir an, dass es zu jedem Scope nur einen Constraint in ℜ gibt (das werden wir wieder aufweichen). D. h. Für c i , c j mit i≠ j gilt S i ≠S j . Die Stelligkeit (Arity) eines Constraints gibt die Mächtigkeit eines Scopes wieder. c i =〈 {x , y}, R 〉 Hat also die Stelligkeit 2 (für i≠ j ! ). Ein unärer Constraint ist über eine einzelne Variable. Ein binärer Constraint ist ein Constraint über über 2 Variablen. Ein binäres Constraint Network enthält nur unäre und binäre Constraints. Anmerkung: Constraints mit mehr als 2 Variablen im Scope kann man mit Hilfe von neuen Hilfsvariablen auch durch eine Menge von binären Constraints ersetzen (Wir werden trotzdem auch direkt mehrstellige Constraints betrachten). 1 1 r i r Beispiel: n-Damen-Problem x1 x2 x3 x={x 1 , x 2 , x 3 , x 4 } D i ={1, 2, 3, 4} ∀ i ={1, 2, 3, 4} x4 1 2 3 4 Zeichnung 12: 4-Damen-Problem x 1 , ... , x n bezeichnen die Positionen der jeweiligen Damen in der zugehörigen Spalte i. D i ={1,... , n} sind die Domains (die jeweiligen Zielnummern). • x i= j Bedeutet dann, dass die Dame in Spalte i in der Zeile j steht. • • Constraints ( C ij Dame in Spalte i vs. Dame in Spalte j): Je zwei Damen dürfen sich nicht attackieren, dass muss für alle Damenpaare gelten. Im Prinzip brauchen wir dann also n⋅n−1 Constraints. Attackieren ist aber symmetrisch, deshalb reichen 6 Constraints aus. R12={1,3 ,1,4 ,2,4 ,3,1 ,4,1 ,4,2} R13={1,2 ,1,4 ,2,1 ,2,3 ,3,2 ,3,4 ,4,1 ,4,3} R14 ={10 Paare} R 23={6 Paare} R 24 ={8 Paare} R34={6 Paare} z. B.: R 34 gibt die erlaubten Positionspaare für die Damen in Spalte 3 und Spalte 4 wieder. • Lösung eines Constraint Networks Wenn eine Variable einen Wert aus ihrem Domain zugewiesen bekommen hat, dann sagen wir, dass die Variable instantiiert wurde. Definition: Instantiierung Eine Instantiierung (Instantiation) einer Teilmenge von Variablen ist eine Zuweisung (assignment) jeweils eines Wertes aus dem zur Variablen gehörenden Domain. Zu dieser Variablen {x i ,... , x i } sei die Teilmenge der Variablen. Dann ist 〈 x i , a i 〉 , ... , 〈 x i , a i 〉 mit a ij ∈ D ij eine Instantiierung von {x i , ... , x i }. Wir schreiben auch: x 1=a 1 ,... , x i =a i oder a =a 1 ,... , a i , wenn der Bezug zum Scope klar ist. 1 1 1 k k k 1 k x={x 1 , ... , x i , ... , x n } s1={x 1 , x i , x n } = = = xi xi xi i 1=1 i 2=1 i 3=n 1 2 3 Jetzt haben sie eine Reihenfolge der aus X ausgewählten Constraints in s1 festgelegt und können nun von x 1 , x 2 , x 3 mit Bezug auf s1 sprechen. Das wird oben in der Definition stillschweigend angenommen. D. h. x 1 ,... , x i Oben müssen nicht die Variable x 1 ,... , x i aus X sein, sondern es es sind die Variablen aus X, die in S an Position 1 bis i stehen. Erfüllen eines Constraints Eine Instantiierung a erfüllt (satisfies) einen Constraint 〈 S , R 〉 genau dann, wenn a für alle Variablen in S definiert ist, und diejenigen Komponenten des Tupel, die mit Variablen aus S verbunden sind, in der Relation R enthalten sind. Sei zum Beispiel R xyz ={1, 1, 1 ,1, 0, 1 ,0, 0, 0}, dann erfüllt die Instantiierung a ={〈 x ,1 〉 〈 y ,1 〉 〈 z ,1 〉 〈 t , 0 〉 } mit dem Scope xyzt den Constraint R xyz , denn die Projektion von a auf xyz ist (1, 1, 1) und also Element von R. Die Instantiierung a ={〈 x ,1 〉 〈 y , 0 〉 〈 z , 0 〉 〈 t , 0 〉 } verletzt (violates) hingegen R xyz , denn (1, 0, 0) ist nicht Element von R xyz . Formal genauer: Konsitente partielle Instantiierung: Eine partielle Instantiierung ist konsistent, falls sie alle Constraints erfüllt, die über die instantiierte Variable definiert sind. Eine Projektion eines Tupels a auf ein e Teilmenge des Scopes S von a wird mit a [ si ] (oder auch S a ) bezeichnet. Dann ist a über S konsistent relativ zum Netzwerk R genau dann, wenn für alle S i im Schema von R mit si ⊆s gilt: a [ si ] ∈R S . i i Zur Erinnerung: a bezieht sich immer auf eine Menge von Variablen, die wir auch Scope von a nennen. a selbst ist eine Relation mit genau einem Tupel als Element. Eine Instantiierung ist vollständig relativ zu einem Netzwerk R, wenn es der Scope X hat, ansonsten nennen wir die Instantiierung partiell. Definition: Lösung Eine Lösung eines Constraints Networks R= X , D , C mit x={x i , ... , x i } ist eine (vollständige) Instantiierung aller Variablen in X, die sämtliche Constraints in C erfüllt. 1 n Lösung = konsistente, vollständige Instantiierung Die Lösungsrelation sol(R) (auch x ) ist definiert als sol R={ a =a 1 ,... , a n ∣ a i ∈D i , ∀ si ∈ Scheme von R gilt a [ si ] ∈Ri } (ok auch: sol X , vielleicht sogar besser ...) Ein Constraint Network repräsentiert (oder drückt aus) seine Lösungsrelation. Sei R ein Constraint Network über X und sei A eine Teilmenge von X, also A⊆ X , dann ist sol(A) oder A die Menge aller konsistenten Instantiierungen über A. Beispiele: Q Q Q Q Q Q Q Q Q Q (a) Q (b) (c) Nicht alle konsistenten partiellen Instatiierungen sind Teil einer Lösung (siehe (a))! (b) ist die Lösung (2, 4, 1, 3), (c) ist die Lösung (3, 1, 4, 2). 4-Queens-Problem: Schema des Netzwerks: {{x 1 , x 2 }, {x 1 , x 3 }, ... ,{x 3 , x 4 }} Sei y={x 1 , x 2 , x 3 }. a ={〈 x 1 ,1〉 , 〈 x 2 , 4〉 , 〈 x 3 , 2〉} ist eine Instantiierung über y (s. (a) oben). a ist konsitent, denn: a =[{x 1 , x 2 }]=1,4∈R12 a =[{x 1 , x 3 }]=1,2∈R13 a =[{x 2 , x 3 }]=4,2∈R 23 1 2 (1)Alle Projektionen auf vollständig instantiierte Scopes aus dem Schema (2)Kontrollieren, ob sie in den zugehörigen Realtionen enthalten sind, also den jeweiligen Constraint erfüllen. Dennoch kann man a nicht zu einer Lösung erweitern!