KI-Praktikum M. Helmert, M. Westphal, S. Wölfl, J.-G. Smaus Sommersemester 2009 Universität Freiburg Institut für Informatik Projekt 1: Constraint-Satisfaction-Probleme Abgabe: 7. Juni 2009 Präsenzaufgaben Aufgabe 1 Checken Sie aus dem Subversion-Repository des Praktikums das Python-Modul constraint aus und starten Sie das Programm sudoku.py, um das vorgegebene Sudoku-Problem zu lösen. Erweitern Sie dann sudoku.py, um zusätzlich folgende Sudoku-Probleme zu lösen: 7 4 3 1 2 8 4 6 2 8 7 5 9 3 2 8 4 9 7 1 5 1 3 8 6 4 5 2 7 8 4 2 8 9 2 1 3 5 4 7 8 4 9 2 2 7 6 7 6 5 7 2 5 1 7 3 4 6 4 1 9 8 Aufgabe 2 (a) Erweitern Sie den Python-Code dergestalt, dass die Anzahl der beim Programmablauf besuchten Knoten des Suchbaums gezählt wird. (b) Versehen Sie den Code mit einer Ausgabe der Anzahl der besuchten Knoten sowie der Laufzeit (siehe dazu die Dokumentation zum Modul time). (c) Implementieren Sie eine Schranke für die Anzahl der besuchten Suchknoten (sinnvolle Ausgabe!). Testen Sie Ihren Code auf den Sudoku-Problemen mit den beiden eingebauten Solvern (BacktrackingSolver und BacktrackingForwardCheckingSolver). Aufgabe 3 Implementieren Sie eine erweiterte Version des Backtracking-Solvers, die zu Beginn der Suche und nach jeder Variablenzuweisung mit dem AC3-Algorithmus Kantenkonsistenz herstellt. Verwenden Sie dazu das bereits bestehende Grundgerüst für die Klasse BacktrackingAC3Solver und testen Sie Ihren Algorithmus zum Beispiel auf den Sudoku-Problemen auf der ersten Ausgabe. Aufgabe 4 (a) Der gegebene Backtracking-Solver belegt die Variablen meistens in keiner besonders sinnvollen Reihenfolge. Implementieren Sie in einer abgeleiteten Klasse die Heuristik minimum remaining values zur Auswahl der Reihenfolge der Variablenbelegung. Wo diese Heuristik nicht zu einer eindeutigen Entscheidung führt, verwenden Sie zusätzlich die degree-Heuristik. (b) Evaluieren Sie die drei Lösungsalgorithmen Backtracking, Backtracking mit Forward-Checking sowie Backtracking mit Kantenkonsistenz jeweils in den Varianten mit und ohne Variablenordnung. Bestimmen Sie dazu Knotenzahl und Laufzeit auf den drei Sudoku-Problemen und n-DamenProblemen verschiedener Größe. (Das Repository enthält eine Formalisierung der n-Damen-Probleme.) Aufgabe 5 Greater-Than-Sudokus sind eine Variante gewöhnlicher Sudokus. Als Ausgangssituation ist ein leeres Sudoku-Feld gegeben, in dem je zwei (horizontal oder vertikal) benachbarte Zellen mit einem Constraint größer als“ oder kleiner ” ” als“ versehen sind. Ansonsten gelten die üblichen Sudoku-Regeln. Formalisieren Sie dieses Greater-Than-Sudoku als CSP (kein Abtippen nötig: siehe greater than sudoku.py) und lösen Sie es mit einem der vorgegebenen Algorithmen oder einem der Algorithmen aus den vorigen Aufgaben. Aufgabe 6 Implementieren Sie den Min-Conflicts-Algorithmus zur lokalen Suche als neue von Solver abgeleitete Klasse. Testen Sie das Verfahren anhand des n-DamenProblems für Werte von n im Bereich {1, . . . , 30}. Ist nach einer vorgegeben Anzahl von besuchten Knoten restart limit keine Lösung gefunden worden, soll das Verfahren neu gestartet werden. Ermitteln Sie eine vernünftige Größe für restart limit für die n-Damen-Probleme. Hausaufgaben Aufgabe 7 (TetraVex/Eternity-II-Puzzle) (a) TetraVex Formalisieren Sie TetraVex (http://en.wikipedia.org/wiki/Tetravex) als ein Constraint-Satisfaction-Problem. Implementieren Sie dazu eine Modellierungsfunktion in dem Modul tetravex, die aus einer gegebenen Liste von Puzzleteilen ein CSP mit binären Constraints generiert. Evaluieren Sie die Performanz des CSP-Solvers (Backtracking-Suche mit/ohne ForwardChecking bzw. Kantenkonsistenz) auf den bereits im Modul enthaltenen Instanzen. Das Limit für die maximale Anzahl an besuchten Knoten kann auf 1000 gesetzt werden. Um die volle Punktzahl zu erlangen, muss der CSP-Solver mit der implementierte Modellierung in der Lage sein, die gegebenen Instanzen bis einschließlich zur Größe 6 × 6 zu lösen, ohne dabei mehr als 1000 Knoten zu besuchen. (b) Eternity-II-Puzzle Eine Variation von TetraVex stellt das Eternity-II-Puzzle (http://en. wikipedia.org/wiki/Eternity II Puzzle) dar. Gegenüber TetraVex ist es hier erlaubt, Puzzleteile zu rotieren. Außerdem müssen alle Teile, die am Rand liegen, zu der Randfarbe passen. Implementieren Sie eine passende Modellierungsfunktion in dem Modul eternity 2 puzzle, die aus einer gegebenen Liste von Puzzleteilen ein CSP mit binären Constraints generiert. Evaluieren Sie die Performanz des CSP-Solvers (Backtracking-Suche mit/ohne Forward Checking bzw. Kantenkonsistenz) auf den bereits im Modul enthaltenen Instanzen. Das Knotenlimit kann wieder mit 1000 angesetzt werden. Für die volle Punktzahl muss der CSP Solver mit der Modellierung in der Lage sein, die 4 × 4-Instanzen innerhalb des Knotenlimits zu lösen. Bonuspunkt: Gruppen, mit deren Formalisierung auch die Instanzen aus unserer Evaluationsmenge jenseits der geforderten Problemgröße innerhalb von 1000 Suchknoten gelöst werden können, erhalten einen Bonuspunkt. Aufgabe 8 (Soft Constraints) An der Universität von F-Stadt wird ein Seminar mit dem Titel Selbstgefällig” keit“ (CHAUVI) veranstaltet. 20 Studentinnen (A–T) nehmen daran teil. 24 Themen (1–24) stehen zur Auswahl. Jede Studentin hat eine geordnete Liste mit fünf Lieblingsthemen aufgestellt. Diese Präferenzen sind in folgender Tabelle wiedergegeben: A B C D E F G H I J K L M N O P Q R S T 1. 8 1 13 9 11 2 9 5 7 12 17 17 17 17 7 2 1 14 15 19 2. 17 24 8 4 12 9 11 7 1 13 7 15 22 18 20 7 2 18 24 12 3. 18 12 10 12 2 17 10 12 2 1 8 19 4 15 8 1 7 15 14 11 4. 6 6 15 5 13 6 17 17 9 18 9 10 6 11 3 22 9 2 18 10 5. 7 18 17 18 14 19 5 9 17 19 15 18 14 14 18 17 22 4 17 14 Wir wollen mittels CSP-Techniken eine gute Verteilung der Themen auf die Studentinnen berechnen. Jede Studentin muss genau ein Thema bearbeiten, und jedes Thema darf von höchstens einer Studentin bearbeitet werden. Für jede Studentin X legen wir die individuelle Nutzenfunktion uX wie folgt fest: ihr Nutzen bei einer Verteilung s der Seminararbeitsthemen sei gleich 5, wenn sie in s ihr liebstes Thema erhält, 4 beim zweitliebsten, usw. Die Wohlfahrtsfunktion U berechne sich für eine gegebene Themenverteilung s als die P Summe der individuellen Nutzenfunktionen, d.h., U (s) := X∈{A,...,T } uX (s). Implementieren Sie ein generelles Verfahren, das eine möglichst gute Verteilung der Seminararbeitsthemen findet Hinweis: Zwei mögliche Ansätze sind lokale Suche oder Branch-and-BoundVerfahren. Bonuspunkt: Die Gruppe, deren Verfahren bei den für die Auswertung benutzten Probleminstanzen die besten Lösungen findet, erhält einen Bonuspunkt. Aufgabe 9 (Killer-Sudoku) Killer-Sudokus sind eine Variante gewöhnlicher Sudokus, bei denen zusätzlich zu den üblichen Sudoku-Constraints bestimmte Gebiete abgegrenzt sind, deren Summe einen vorgegebenen Wert erreichen muss (siehe http://en.wikipedia. org/wiki/Killer Sudoku). Außerdem müssen in jedem abgegrenzten Gebiet alle Einträge verschieden sein. Beispiel: Erweitern Sie einen der Backtracking-basierten CSP-Algorithmen so, dass er sich zur Verwendung von Killer-Sudokus verwenden lässt. Sie müssen ihn dazu auf mehrstellige Constraints erweitern, aber es reicht aus, wenn ihre Implementierung nicht allgemein ist, sondern für die bei Killer-Sudokus auftretenden Constraints spezifisch. In dieser Aufgabe dürfen Sie beliebige Modifikationen am CSP-Algorithmus vornehmen, inklusive Killer-Sudoku-spezifischer ConstraintPropagierungs-Regeln. Um die volle Punktzahl zu erlangen, muss der CSP-Solver in der Lage sein, das gezeigte Beispiel sowie drei weitere unbekannte Probleminstanzen in vertretbarer Zeit zu lösen. (Die weiteren Probleminstanzen sind teilweise deutlich schwieriger als das gezeigte Beispiel.)