Mitschrieb von Kai Salmen zum ersten Teil "Constraints"

Werbung
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 x3}(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 , 2ik , 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  ,1ik
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 2ik .
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,
nn−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 nc∗g n für alle nn0 }
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 nc⋅g n ∀ nn0 }
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 a1 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!
Herunterladen