Einführung Constraints
TL;DR
Ein Constraintproblem (CSP) besteht aus Variablen, die über Einschränkungen ("Constraints")
verbunden sind. Jeder Variable wird eine Domäne (Wertebereich) zugeordnet.
Die Constraints können sich auf eine einzelne Variable beziehen ("unäre Constraints"),
auf zwei Variablen ("binäre Constraints") oder auf mehr Variablen. Ein CSP kann als Graph
dargestellt werden.
Eine "Belegung" ist eine Zuweisung von Werten an Variablen aus deren Domäne. Eine
"konsistente" Belegung erfüllt die Constraints, eine "vollständige" Belegung belegt
alle Variablen.
Eine Lösung für ein CSP ist eine vollständige und konsistente Belegung.
Videos (HSBI-Medienportal)
Lernziele
- (K1) Definitionen: Variable, Domäne, Constraint, Arität, CSP, Zuweisung
- (K3) Formulierung von CSP
Motivation: Einfärben von Landkarten
Die Skizze soll eine Landkarte mit verschiedenen Ländern darstellen. Die Aufgabe
lautet: Färbe jedes Land mit einer Farbe ein, um die Übersichtlichkeit zu
erhöhen. Verwende dabei so wenig wie möglich unterschiedliche Farben. Aneinander
grenzende Länder müssen unterschiedliche Farben bekommen (=> Constraint).
-
Variablen: A, B, C, D, E, F
-
Werte: $\lbrace red, green, blue \rbrace$
-
Constraints: Benachbarte Regionen müssen unterschiedliche Farben haben
-
Mögliche Lösung: Zuweisung an Variablen ("Belegung")
$\lbrace \operatorname{A} = red, \operatorname{B} = blue, \operatorname{C} = green,
\operatorname{D} = red, \operatorname{E} = blue, \operatorname{F} = blue \rbrace$
Definition: Constraint Satisfaction Problem (CSP)
-
Ein CSP $\langle V, D, C \rangle$ besteht aus:
- Menge von Variablen $V = \lbrace V_1, V_2, \ldots, V_n \rbrace$
- Je $V_i$ nicht leere Domäne $D_i = \lbrace d_{i,1}, d_{i,2}, \ldots, d_{i,m_i} \rbrace$
- Menge von Constraints $C = \lbrace C_1, C_2, \ldots, C_p \rbrace$
(Randbedingungen, Abhängigkeiten zwischen Variablen)
-
Zuweisung/Belegung (Assignment) $\alpha$:
- Zuweisung von Werten an (einige/alle) Variablen:
$\alpha = \lbrace X=a, Y=b, \ldots \rbrace$
(aus den jeweiligen Wertebereichen)
- Konsistente Belegung: Randbedingungen sind nicht verletzt
- Vollständige Belegung: Alle Variablen sind belegt
-
Lösung eines CSP: Vollständige und konsistente Belegung
Constraint-Graph
Ein CSP kann man auch als Constraint-Graph darstellen. Die Variablen werden zu Knoten im
Graph, die Constraints zu Kanten zwischen den Knoten. Dadurch kann man die aus dem Problemlösen
bekannten Algorithmen anwenden ...
Constraints -- Arität
Die Arität betrifft hier die "Stelligkeit": Wie viele Variablen stehen in
einem Constraint miteinander in Beziehung? (Also wie viele Parameter hat
ein Constraint?)
-
unär: betrifft einzelne Variablen
Beispiel: $\operatorname{A} \neq red$
-
binär: betrifft Paare von Variablen
Beispiel: $\operatorname{A} \neq \operatorname{B}$
-
höhere Ordnung: betrifft 3 oder mehr Variablen
-
Präferenzen: "soft constraints"
Beispiel: "rot ist besser als grün"
Abbildung über Gewichtung => Constraint-Optimierungsproblem (COP)
Constraints -- Wertebereiche
-
Endliche Domänen: $d$ Werte => $O(d^n)$ mögliche Zuweisungen
(exponentiell in der Zahl der Variablen)
-
Unendliche Domänen: reelle Zahlen, natürliche Zahlen
=> Keine Auflistung der erlaubten Wertekombinationen mehr möglich
=> Übergang zu Gleichungen/Ungleichungen: $job_1+5
- lineare Constraints
- nichtlineare Constraints
Historische Unterscheidung:
- Constraint Satisfaction: endliche Domänen, kombinatorische Methoden
- Constraint Solving: unendliche Domänen
CSP sind überall ...
- Stundenpläne (Klassen, Räume, Zeiten)
- Konfiguration (Computer, Autos, ...)
- Fahrpläne (Zug, Flug, ...)
- Planung von komplexen Projekten
- Sudoku :-)
- ...
Wrap-Up
- Definitionen und Begriffe:
- Variable, (un-) endliche Domänen, Wertemenge
- Constraint, Arität, CSP
- Zuweisung, Lösung, ...
Quellen
- [Bartak2001] Theory and Practice of Constraint Propagation
Barták, R., 2001. - [Kumar1992] Algorithms for Constraint Satisfaction Problems: A Survey
Kumar, V., 1992. - [Russell2020] Artificial Intelligence: A Modern Approach
Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
CSP: Abschnitt 5.1
Lösen von diskreten CSP
TL;DR
CSP's mit endlichen Domänen lassen sich mit einer Backtracking-Suche lösen. Dabei wird
schrittweise eine Variablen ausgewählt und dann ein Wert aus deren Wertebereich für
die Belegung ausgewählt. Danach ruft sich die Backtracking-Suche rekursiv auf. Falls
dabei keine Lösung gefunden werden kann, erfolgt Backtracking und die Belegung wird
schließlich rückgängig gemacht und durch die nächste Möglichkeit ersetzt.
Videos (HSBI-Medienportal)
Lernziele
- (K3) Lösung von CSP mit endlichen Domänen mit Hilfe der BT-Suche
Einfärben von Landkarten als CSP
def BT_Search(assignment, csp):
if complete(assignment): return assignment
var = VARIABLES(csp, assignment)
for value in VALUES(csp, var):
if consistent(value, var, assignment, csp):
assignment += {var = value}
if INFERENCE(csp, assignment, var) != failure:
result = BT_Search(assignment, csp)
if result != failure: return result
assignment -= {var = value}
return failure
Quelle: Eigener Code basierend auf einer Idee nach [Russell2020, p. 176, fig. 5.5]
Hierbei handelt es sich um eine etwas angepasste Tiefensuche: Starte mit leerem
Assignment und weise schrittweise Variablen passende Werte zu und mache notfalls
Backtracking.
BT-Suche für CSP am Beispiel Landkartenfärbeproblem
Wrap-Up
- Lösung von CSP mit endlichen Domänen mit Hilfe der Backtracking-Suche
Quellen
- [Bartak2001] Theory and Practice of Constraint Propagation
Barták, R., 2001. - [Kumar1992] Algorithms for Constraint Satisfaction Problems: A Survey
Kumar, V., 1992. - [Russell2020] Artificial Intelligence: A Modern Approach
Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
CSP, Backtracking: Abschnitt 5.3
Heuristiken
TL;DR
CSP's mit endlichen Domänen lassen sich mit einer Backtracking-Suche lösen. Dabei
gibt es einige Freiheitsgrade: Auswahl der nächsten Variable und Wahl des nächsten
Werts. Hier können Heuristiken die Suche beschleunigen.
Zur Wahl der als nächstes zu betrachtenden Variable kann die Minimum Remaining
Values (MRV)-Heuristik eingesetzt werden: Wähle die Variable mit wenigsten freien
Werten. Bei Gleichstand bei der MRV kann man mit der Gradheuristik die Variable
mit den meisten Constraints zu offenen (noch nicht belegten) Variablen wählen.
Bei der Wahl des Wertes kann die Least Constraining Value (LCV)-Heuristik genutzt
werden: Wähle den Wert, der für die verbleibenden Variablen die wenigsten Werte ungültig
macht.
Während die MRV relativ leicht umzusetzen ist, muss man für die LCV alle Constraints zu
den Nachbarn auswerten.
Videos (HSBI-Medienportal)
Lernziele
- (K3) Verbesserung der BT-Suche mit Heuristiken: MRV, Gradheuristik, LCV
VARIABLES: Variablen-Sortierung, Welche Variable soll betrachtet werden?
VARIABLES: Welche Variable zuerst ausprobieren?
Minimum Remaining Values (MRV): (vgl. [Russell2020, S. 177])
Beispiel:
- Freie Auswahl, alle haben gleich viele freie Werte (jeweils 3) => wähle A
- B und C haben nur noch zwei freie Werte => wähle B (oder C)
- C hat nur noch einen Wert, D noch zwei, der Rest drei => wähle C
VARIABLES: Gleichstand bei MRV
VARIABLES: Welche Variable zuerst ausprobieren?
Gradheuristik: Erweiterung von MRV bei Gleichstand (vgl. [Russell2020, S. 177])
Beispiel:
- MRV: Alle haben gleich viele freie Werte (jeweils 3) => Gradheuristik: B, C und D haben
die meisten Verbindungen (Constraints) auf offene Variablen => wähle B (oder C oder D)
- MRV: A, C und D haben nur noch zwei freie Werte => Gradheuristik: C und D haben
je zwei Constraints auf noch offene Variablen => wähle C (oder D)
- MRV: A und D haben beide nur noch einen Wert => Gradheuristik: D hat
die meisten Verbindungen (Constraints) auf offene Variablen => wähle D
VALUES: Werte-Sortierung, Welchen Wert soll ich ausprobieren?
VALUES: Welchen Wert zuerst ausprobieren?
Least Constraining Value (LCV): (vgl. [Russell2020, S. 177])
-
Wähle Wert, der für verbleibende Variablen die wenigsten Werte
ungültig macht
=> verringert die Wahrscheinlichkeit für Backtracking
Beispiel:
- Sei A gewählt: Alle Werte machen in den anderen Variablen einen Wert ungültig
=> freie Wahl des Wertes => wähle beispielsweise rot
- Sei B gewählt: Alle Werte machen in den anderen Variablen einen Wert ungültig
=> freie Wahl des Wertes => wähle beispielsweise grün
- Sei D gewählt: Verbleibende Werte rot und blau
- Wahl von rot würde für C einen Wert übrig lassen (blau)
- Wahl von blau würde für C keinen Wert übrig lassen
=> LCV: Wahl von rot!
Hinweis: Diese Heuristik ist in der Praxis sehr aufwändig zu berechnen! Man müsste für
jeden Wert die noch offenen Constraints anschauen und berechnen, wie viele Werte damit jeweils
ungültig gemacht werden. Die Idee ist aber dennoch interessant, und möglicherweise kann man
sie für ein reales Problem so adaptieren, dass bei der Umsetzung nur wenig zusätzlicher
Aufwand entsteht.
Wrap-Up
- Verbesserung der BT-Suche mit Heuristiken: MRV, Gradheuristik, LCV
Challenges
Sei $D=\lbrace 0, \ldots, 5 \rbrace$, und ein Constraintproblem definiert durch
$$\langle
\lbrace v_1, v_2, v_3, v_4 \rbrace,
\lbrace D_{v_1} = D_{v_2} = D_{v_3} = D_{v_4} = D \rbrace,
\lbrace c_1, c_2, c_3, c_4 \rbrace
\rangle$$
mit
- $c_1=\left((v_1,v_2), \lbrace (x,y) \in D^2 | x+y = 3 \rbrace\right)$,
- $c_2=\left((v_2,v_3), \lbrace (x,y) \in D^2 | x+y \le 3 \rbrace\right)$,
- $c_3=\left((v_1,v_3), \lbrace (x,y) \in D^2 | x \le y \rbrace\right)$ und
- $c_4=\left((v_3,v_4), \lbrace (x,y) \in D^2 | x \ne y \rbrace\right)$.
- Zeichen Sie den Constraint-Graph.
- Welche Variable würde bei der Anwendung von MRV und Gradheuristik im ersten Schritt bei der Suche mit der BT-Search ausgewählt?
- Geben Sie eine Lösung für das Problem an.
Quellen
- [Bartak2001] Theory and Practice of Constraint Propagation
Barták, R., 2001. - [Kumar1992] Algorithms for Constraint Satisfaction Problems: A Survey
Kumar, V., 1992. - [Russell2020] Artificial Intelligence: A Modern Approach
Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
CSP, Backtracking/Heuristiken: Abschnitt 5.3
Kantenkonsistenz und AC-3
TL;DR
Bei der Backtracking-Suche werden schrittweise Variablen belegt. Dabei kann eine Belegung eine Lösung
im weiteren Verlauf der Suche unmöglich machen, so dass (viel) Backtracking notwendig wird.
Beim Forward Checking entfernt man nach der Belegung einer Variablen in allen Nachbarvariablen
die durch die aktuelle Belegung inkonsistent gewordenen Werte. Wenn dabei ein Wertebereich leer wird,
führt die aktuelle Belegung nicht zu einer Lösung und kann sofort zurückgenommen werden. Allerdings
findet man mit Forward Checking nicht alle Inkonsistenzen.
Bei der Kantenkonsistenz prüft man, ob zu jedem Wert aus dem Wertebereich einer Variablen in den
Nachbarvariablen mindestens ein passender (konsistenter) Wert existiert. Dabei werden die Constraints
nacheinander betrachtet (nicht gleichzeitig). Wenn dies nicht der Fall ist, wird der Wert aus dem
Wertebereich der betrachteten Variablen entfernt. Der AC-3-Algorithmus erzeugt schrittweise Kantenkonsistenz
für ein CSP.
Man kann den AC-3 als Vorverarbeitung nutzen und die Wertemengen vor der BT-Suche reduzieren. Eventuell
findet man dabei bereits eine Lösung oder kann eine Lösung ausschließen. Man kann den AC-3 auch als
Inferenzschritt in die BT-Suche einbetten ("MAC").
Videos (HSBI-Medienportal)
Lernziele
- (K2) Forward Checking (FC)
- (K2) Erweiterung von FC auf alle Kanten: Kantenkonsistenz
- (K2) Kantenkonsistenz bedeutet nicht globale Konsistenz
- (K3) AC-3 Algorithmus
Problem bei BT-Suche
Zuweisung eines Wertes an Variable $X$:
- Passt zu aktueller Belegung
- Berücksichtigt aber nicht restliche Constraints
=> macht weitere Suche u.U. unmöglich/schwerer
Lösung: Nach Zuweisung alle nicht zugewiesenen Nachbarvariablen prüfen
INFERENCE: Vorab-Prüfung (Forward Checking)
Inference: Frühzeitiges Erkennen von Fehlschlägen! (vgl. [Russell2020, S. 178])
Nach Zuweisung eines Wertes an Variable $X$:
- Betrachte alle nicht zugewiesenen Variablen $Y$:
- Falls Constraints zw. $X$ und $Y$, dann ...
- ... entferne alle inkonsistenten Werte aus dem Wertebereich von $Y$.
Beispiel:
- Sei A auf rot gesetzt => entferne rot in B und C
- Sei D auf grün gesetzt => entferne grün in B und C und E
Problem: Für B und C bleibt nur noch blau; sind aber benachbart!
Forward Checking findet nicht alle Inkonsistenzen!
- Nach $\lbrace A=red, D=green \rbrace$ bleibt für B und C nur noch blue
- B und C sind aber benachbart
Übergang von Forward Checking zu Kantenkonsistenz
Definition Kantenkonsistenz (Arc Consistency)
Eine Kante von $X$ nach $Y$ ist "konsistent", wenn für jeden Wert
$x \in D_X$ und für alle Constraints zwischen $X$ und $Y$ jeweils ein Wert
$y \in D_Y$ existiert, so dass der betrachtete Constraint durch $(x,y)$
erfüllt ist.
Ein CSP ist kanten-konsistent, wenn für alle Kanten des CSP Konsistenz herrscht.
Beispiel Kantenkonsistenz
$V = \lbrace a,b,c,d,e \rbrace$
$\mathrm{C} = \lbrace ((a,b), \ne), ((b,c), \ne), ((a,c), \ne), ((c,d), =), ((b,e), <) \rbrace$
$D_a=D_b=D_c=\lbrace 1,2,3 \rbrace$, $D_d=\lbrace 1,2 \rbrace$, $D_e=\lbrace 1,2,3 \rbrace$
Einschränkung der Ausgangswertemengen (kanten-konsistent)
$D_a=\lbrace 1,2,3 \rbrace$, $D_b=\lbrace 1,2 \rbrace$, $D_c=\lbrace 1,2 \rbrace$, $D_d=\lbrace 1,2 \rbrace$, $D_e=\lbrace 2,3 \rbrace$
=> Kantenkonsistenz ist nur lokale Konsistenz!
Anmerkung: $((a,b), \ne)$ ist Kurzform für
$\left((a,b), \lbrace (x,y) \in D_a \times D_b | x \ne y \rbrace\right)$
AC-3 Algorithmus: Herstellen von Kantenkonsistenz
def AC3(csp):
queue = Queue(csp.arcs)
while not queue.isEmpty():
(x,y) = queue.dequeue()
if ARC_Reduce(csp,x,y):
if D_x.isEmpty(): return false
for z in x.neighbors(): queue.enqueue(z,x)
return true
def ARC_Reduce(csp, x, y):
change = false
for v in D_x:
if not (any w in D_y and csp.C_xy(v,w)):
D_x.remove(v); change = true
return change
Quelle: Eigener Code basierend auf einer Idee nach [Russell2020, p. 171, fig. 5.3]
Anmerkung: Die Queue in AC-3 ist wie eine (mathematische) Menge zu betrachten: Jedes Element
kann nur genau einmal in einer Menge enthalten sein. D.h. wenn man bei queue.enqueue(z,x)
die
Rückkanten von den Nachbarn in die Queue aufnimmt, sorgt die Queue eigenständig dafür, dass es
keine doppelten Vorkommen einer Kante in der Queue gibt. (Falls die verwendete Queue in einer
Programmiersprache das nicht unterstützt, müsste man bei queue.enqueue(z,x)
stets abfragen, ob
die Kante (z,x)
bereits in der Queue ist und diese dann nicht erneut hinzufügen.)
AC-3 hat eine Laufzeit von $O(d^3n^2)$ ($n$ Knoten, maximal $d$ Elemente pro Domäne). Leider findet
auch AC-3 nicht alle Inkonsistenzen ... (NP-hartes Problem).
Hinweis: In gewisser Weise kann man Forward Checking als ersten Schritt bei der
Herstellung von Kantenkonsistenz interpretieren.
Einsatz des AC-3 Algorithmus
-
Vorverarbeitung: Reduktion der Wertemengen vor BT-Suche
- Nach AC-3 evtl. bereits Lösung gefunden (oder ausgeschlossen)
-
Propagation: Einbetten von AC-3 als Inferenzschritt in BT-Suche
(MAC -- Maintaining Arc Consistency)
- Nach jeder Zuweisung an $X_i$ Aufruf von AC-3-Variante:
- Initial nur Kanten von $X_i$ zu allen noch nicht zugewiesenen Nachbarvariablen
- Anschließend rekursiver Aufruf von BT-Suche
Wrap-Up
- Anwendung von Forward Checking und ...
- ... die Erweiterung auf alle Kanten: AC-3, Kantenkonsistenz
Challenges
Fingerübungen
Ist die Kante zwischen a und b konsistent?
Wann ist der Graph lokal konsistent?
- a {1,2}; b {2,3}; c {1,2,3}; d {1,2,3}
- a {1,2}; b {2,3}; c {3}; d {1,2}
- a {1,3}; b {2,3}; c {1,3}; d {1,2,3}
- a {1,2}; b {2,3}; c {1,3}; d {1,2,3}
Wie sieht die Queue im nächsten Schritt mit AC3 aus?
Aktuelle Queue: [ab, ac, ba, bc, ca, cb]
- [bc, ba, ca, cb, ab, ac]
- [ab, ac, ba, bc, ca, cb]
- [ac, ba, bc, ca, cb]
- [ac, ba, bc, ca, cb, ba]
Quellen
- [Bartak2001] Theory and Practice of Constraint Propagation
Barták, R., 2001. - [Kumar1992] Algorithms for Constraint Satisfaction Problems: A Survey
Kumar, V., 1992. - [Russell2020] Artificial Intelligence: A Modern Approach
Russell, S. und Norvig, P., Pearson, 2020. ISBN 978-0134610993.
CSP, AC-3: Abschnitt 5.2