Constraintsolving

Was haben Typ-Inferenz, Sudoku, das 8-Queens-Problem, das Einfärben von Landkarten und das Erstellen von Stundenplänen gemeinsam?

Es handelt sich um eine bestimmte Art von Suchproblemen, wobei den Parametern (Variablen) Werte so zugewiesen werden müssen, dass Einschränkungen bzw. Relationen zwischen den Variablen gelten.

Subsections of Constraintsolving

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 (YouTube)
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).

Einfärben von Landkarten: Formalisierung

  • 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, ...
Übungsblätter/Aufgaben
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 (YouTube)
Videos (HSBI-Medienportal)
Lernziele
  • (K3) Lösung von CSP mit endlichen Domänen mit Hilfe der BT-Suche

Einfärben von Landkarten als CSP

Endliche Domänen: Formulierung als Suchproblem

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
Übungsblätter/Aufgaben
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 (YouTube)
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])

  • Wähle Variable mit wenigsten freien Werten (die am meisten eingeschränkte Variable)

    => reduziert den Verzweigungsgrad

Beispiel:

  1. Freie Auswahl, alle haben gleich viele freie Werte (jeweils 3) => wähle A
  2. B und C haben nur noch zwei freie Werte => wähle B (oder C)
  3. 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])

  • Wähle Variable mit meisten Constraints auf offene (noch nicht zugewiesene) Variablen

    => reduziert den Verzweigungsgrad in späteren Schritten

Beispiel:

  1. 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)
  2. 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)
  3. 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:

  1. Sei A gewählt: Alle Werte machen in den anderen Variablen einen Wert ungültig => freie Wahl des Wertes => wähle beispielsweise rot
  2. Sei B gewählt: Alle Werte machen in den anderen Variablen einen Wert ungültig => freie Wahl des Wertes => wähle beispielsweise grün
  3. 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)$.
  1. Zeichen Sie den Constraint-Graph.
  2. Welche Variable würde bei der Anwendung von MRV und Gradheuristik im ersten Schritt bei der Suche mit der BT-Search ausgewählt?
  3. Geben Sie eine Lösung für das Problem an.
Übungsblätter/Aufgaben
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 (YouTube)
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:

  1. Sei A auf rot gesetzt => entferne rot in B und C
  2. 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

  • Forward Checking erzeugt Konsistenz für alle Constraints der gerade betrachteten (belegten) Variablen.

  • Idee: Ausdehnen auf alle Kanten ... => Einschränken der Wertemengen

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

  1. Vorverarbeitung: Reduktion der Wertemengen vor BT-Suche

    • Nach AC-3 evtl. bereits Lösung gefunden (oder ausgeschlossen)
  2. 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]
Übungsblätter/Aufgaben
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