Entwurf und Implementierung von Algorithmen. als Constraint Satisfaction Problem

Größe: px
Ab Seite anzeigen:

Download "Entwurf und Implementierung von Algorithmen. als Constraint Satisfaction Problem"

Transkript

1 F Entwurf und Implementierung von Algorithmen zur Lösung des Stundenplanungsproblems als Constraint Satisfaction Problem Design and implementation of algorithms for solving the University Timetabling Problem as constraint satisfaction problem Jochen Sonntag Master Abschlussarbeit Betreuer: Prof. Dr. Heinz Schmitz Trier, 14. Mai 2008

2 Kurzfassung Beim Timetabling Problem handelt es sich um ein Planungsproblem, dessen Lösung aus der Zuweisung eines Raums und eines Zeitfensters für eine Menge von Veranstaltungen unter Berücksichtigung von definierten Einschränkungen besteht. Bei diesem Problem handelt es sich um NP-vollständiges Problem. Es existieren viele verschiedene Ansätze zur Lösung des Timetabling Problems. Diese Arbeit beschäftigt sich mit der Lösung dieses speziellen Problem als Constraint Satisfaction Problem (CSP). Der Ansatz dieser Problemlösungsstrategie hat ihren Ursprung im Bereich der Künstlichen Intelligenz. Sie wurde bereits erfolgreich zum Lösen von verschiedenen Planungsproblemen angewendet. Am Fachbereich Informatik der Fachhochschule Trier wurde ein System zur Lösung des Stundenplanungsproblems entwickelt. Über dieses System können eine große Anzahl von Daten, harten Einschränkungen und Optimierungsgrößen angegeben werden. Das Ziel dieser Arbeit besteht darin, Algorithmen zur Lösung dieses Problems als CSP zu entwickeln, mit denen in möglichst kurzer Zeit ein gültiger Stundenplan gefunden wird. Die Güte des Plans wird vernachläßigt, da er als Initiallösung für den Tabu-Suche Algorithmus des bestehenden Systems verwendet werden soll. So sollen durch die Tabu-Suche schnelle Fortschritte in der Verbesserung der Güte eines Stundenplans erzielt werden und durch die Lösung des CSP bereits vor Begin dieser Tabu-Suche eine Aussage über die Konsistenz der Stammdaten getroffen werden. Im Rahmen dieser Arbeit werden zwei Ansätze zum Lösen dieses CSP betrachtet. Es werden der Entwurf eines Backtracking Algorithmus unter Verwendung einer Forward Checking Strategie und ein Lokale Suche Algorithmus vorgestellt. Durch die Verwendung der Minimum Remaining Value und der Degree Heuristik, welche die Auswahl der als nächstes zu betrachtenden Variablen steuern, werden mit der Backtracking Suche in kurzer Zeit (weniger als eine Sekunde) gültige Pläne gefunden.

3 Inhaltsverzeichnis 1 Ziel der Arbeit Constraint Satisfaction Problems (CSP) Darstellung Verschiedene Arten von CSPs Backtracking-Suche für CSPs Lokale Suche für CSPs Formulierung des Stundenplanungsproblems als CSP Definition des Datenmodells Definition der Constraints Problemdefinition Entwurf Einfaches Backracking zur Lösung des CSP Constraint-Graph Erweiterung der Backtracking-Suche Einschränken der Wertebereiche vor Suchbeginn Forward Checking während der Suche Ergänzung der Modelldaten Wiederherstellen eines Zustands nach Rücksprung Kantenkonsistenz Korrektheitsbeweis Optimierung der Backtracking Suche Auswahl des Startknoten Auswahl einer Variablen Auswahl eines Wertes Backjumping Zerlegung des Constraint Graphen Lokale Suche zur Lösung des CSP Technischer Entwurf Darstellung des Constraint Graphen Darstellung der Variablen und Domänen

4 Inhaltsverzeichnis IV 5.3 Operationen auf Domänen Löschen von Werten aus einer Domäne vor Suchbeginn Löschen von Werten aus einer Domäne im Rahmen des Forward Checking Sortieren der Elemente einer Domäne Erstellen der Domänen Kantenkonsistenz Darstellung der Graphen von ST und FT Warshall Algorithmus Constraint Propagation Integration des Algorithmus Implementierung Vorgehensweise Allgemeine Anmerkungen Module Anpassung der grafischen Benutzeroberfläche Test Testszenario Testablauf Sonstige Hilfsmittel zum Testen Zusammenfassung Literatur

5 Algorithmenverzeichnis 1 Allgemeiner Backtracking Algorithmus zum Lösen eines CSPs Lokale Suche unter Verwendung der MinConflicts Heuristik zum Lösen von CSPs Einfaches Backtracking zum Lösen des Stundenplanungsproblems als CSP Backtracking mit Reduktion der Wertebereiche vor Beginn der Suche 27 5 Remove inconsistent values: Operation 1 (REMOVE-OP1) Remove inconsistent values: Operation 2 (REMOVE-OP2) Remove inconsistent values: Operation 3 (REMOVE-OP3) Remove inconsistent values: Operation 4 (REMOVE-OP4) Remove inconsistent values: Operation 5 (REMOVE-OP5) Remove inconsistent values: Operation 6 (REMOVE-OP6) Remove inconsistent values: Operation 7 (REMOVE-OP7) Remove inconsistent values: Operation 8 (REMOVE-OP8) Forward Checking Algorithmus Anwendung von Operation 1 des Forward Checking (FC-OP1) Anwendung von Operation 3 des Forward Checking (FC-OP3) Anwendung von Operation 4 des Forward Checking (FC-OP4) Anwendung von Operation 5 des Forward Checking (FC-OP5) Anwendung von Operation 2 des Forward Checking (FC-OP2) Anwendung von Operation 6 des Forward Checking (FC-OP6) Anwendung von FC-OP1 des Forward Checking mit Markieren des zu löschenden Elements Forward Checking mit Rücksprungmarkierung Algorithmus von Warshall Forward Checking mit Ergänzung der Modelldaten Algorithmus AC-3 für die Kantenkonsistenz Remove inconsistent values before start of search (REMOVE- INCONSISTENT-VALUES) Durchführung des Forward-Checking (FORWARD-CHECKING) Forward Checking mit Auswahl des Startknotens Sortieren der Werte einer Domäne (SORT-DOMAIN)

6 ALGORITHMENVERZEICHNIS VI 29 Forward Checking erweitert um das Sortieren des Wertebereichs der ausgewählten Variablen. Entgültige Fassung des Backtracking Algorithmus Lokale Suche unter Verwendung der Min-Conflicts Heuristik zum Lösen des Stundenplanungsproblems als CSP Löschen eines Listenelements Anwendung von Operation 1 des Forward Checking auf verkettete Liste Ermitteln der Kenngröße v(d) für das Sortieren der Werte einer Domäne Sortieren einer verkettete Liste mit Mergesort Erstellen der Domänen Umsetzung des Algorithmus von Wahrschall [4] Umsetzung des Algorithmus von Wahrschall mit verbesserter Laufzeit Bilden der Nachbarschaften N ST,N F T,N Lec und N Sem

7 Abbildungsverzeichnis 2.1 Ein kryptoarithmetisches Rätsel Beschränkungshypergraph für das Beispiel des kryptoarithmetischen Rätsels Zerlegung des Graphen aus Beispiel 2.2 in Teilprobleme Einordnung der Constraints des vorliegenden Planungsproblems Berechnungsbaum für das Stundenplanungsproblem als CSP Allgemeine Struktur der Matrix A F T Abdeckung der Constraints Beispiel für die Zerlegung des Constraint Graphen in Teilprobleme für das Stundenplanungsproblem Lineare Liste für die Darstellung einer Domäne Darstellung aller Domänen Darstellung der Matrizen A ST und A F T Darstellung der Queue Ablauf der Backtracking Suche in Form eines Flussdiagramms Verwendung der Algorithmen Der Dialog zum Ausführen der Backtracking- und Lokalen Suche zum Lösen des Stundenplanungsproblems als CSP Ergebnisse der Testläufe für Probleminstanz Ergebnisse der Testläufe für Probleminstanz Ergebnisse der Testläufe für Probleminstanz

8 1 Ziel der Arbeit Ziel der Arbeit ist die Erweiterung des bestehenden Stundenplanungssystems Themis um Algorithmen, die das vorliegende Stundenplanungsproblem als Constraint Satisfaction Problem (CSP) lösen. Durch Entwurf und Implementierung dieser Strategien soll möglichst schnell ein gültiger Plan gefunden werden, wobei die Güte dieses gültigen Stundenplans nicht von Bedeutung ist. Vielmehr soll dieser Plan als initiale Lösung für den bisher angewandten Tabu-Suche-Algorithmus dienen. Der Algorithmus liefert also den ersten gültigen Plan. Wird durch Anwendung dieser Strategie nach gewisser Zeit kein gültiger Plan gefunden, so kann mit einer bestimmten Wahrscheinlichkeit davon ausgegangen werden, dass für das spezifizierte Problem keine Lösung existiert. Es dient also gleichzeitig auch als Test auf Widerspruch in den Eingabedaten. Es muss keine, unter Umständen sehr zeitaufwendige, Tabu-Suche für Eingabedaten gestartet werden, für die es aufgrund von Inkonsistenzen keine Lösung gibt. Aufgrund von spezifischen Anforderungen des Fachbereichs und externer Anwender wurde Themis dahingehend erweitert, dass die Anzahl von zuweisbaren Studiengang-Semester-Kombinationen und Dozenten für eine Veranstaltung erhöht wurde. Dies erhöht den Bedarf der Konsistenzprüfung der Eingabedaten, da dadurch die Wahrscheinlichkeit von möglichen Widersprüchen in den Eingabedaten steigt. Außerdem wird der notwendige Aufwand für die Suche erhöht, da sich die Prüfung auf Einhaltung der harten- und der Optimierungskriterien umfangreicher gestaltet. Dies steigert den Bedarf an der Erhöhung der Effizienz der Stundenplansuche. Bisher erzielte Erfolge beim Lösen des Stundenplanungsproblems als CSP (u.a. [2]) motivieren zur Entwicklung von Algorithmen zur Lösung des vorliegenden Problems als CSP. Im Gegensatz zu vielen der bisher veröffentlichten Arbeiten, die sich mit der Lösung von Stundenplanungsproblemen als CSP beschäftigen, handelt es sich bei dem hier formulierten Problem durch die Möglichkeit der Angabe von vielen Präferenzen und Restriktionen um ein umfangreiches Problem. Dies bedeutet, dass viele Constraints zu formulieren und zu prüfen sind.

9 2 Constraint Satisfaction Problems (CSP) In diesem Kapitel werden einführend die Bestandteile eines Constraint Satisfaction Problem (CSP) definiert und erläutert. Es wird gezeigt, wie ein Problem formuliert werden kann, so dass ein Suchalgorithmus dieses Problem unter Berücksichtigung der Einschränkungen lösen kann. Die hier betrachteten Algorithmen zur Lösung eines Constraint Satisfaction Problem sind Backtracking und Lokale Suche. Durch die Verwendung von Heuristiken kann diese Suche beschleunigt werden. Dieses einführende Kapitel, inklusive Abbildungen und Algorithmen, basiert auf Kapitel 5 des Buches [9]. 2.1 Darstellung Um ein Problem als Constraint Satisfaction Problem zu formulieren, müssen folgende Bestandteile definiert werden: 1. Eine Menge von Variablen X = {X 1,..., X n }, 2. einer Menge von Constraints C = {C 1,..., C m } 3. und für jede Variable X i eine nichtleere Menge D i (Domäne) mit den möglichen Werten für diese Variable. Unter einem Zustand des Problems versteht man die aktuelle Zuweisung von Werten für alle oder einen Teil der Variablen. Eine Zuweisung, die keine Bedingung verletzt, wird als konsistente Zuweisung bezeichnet. Eine Lösung eines CSP ist die Zuweisung eines Wertes zu jeder Variablen aus ihrer Domäne, so dass keine Bedingung verletzt wird. Je nach Zielsetzung, ist es möglich, nach lediglich einer Lösung, allen Lösungen oder einer optimalen Lösung zu suchen. Beispiel 2.1 zeigt die Formulierung eines CSPs anhand des k-graph- Coloring Problems. Beispiel 2.1. Es sollen die Staaten Australiens rot, grün oder blau eingefärbt werden, so dass keine benachbarten Staaten die gleiche Farbe erhalten. Gesucht ist also für einen Graphen G = (V, E) eine Abbildung f : V {1,..., k}, so dass für alle (u, v) E gilt f(u) f(v). Folgende Abbildung zeigt diese Staaten.

10 2.2 Verschiedene Arten von CSPs 3 Also lässt sich dieses Problem als folgendes CSP formulieren: 1. Die Menge der Variablen wird definiert durch die einzelnen Staaten, also X = {W A, NT, Q, NSW, V, SA, T }. 2. Für die Domäne jeder Variablen gilt D i = {rot, gruen, blau}. 3. Die Randbedingungen lassen sich schreiben als C = {(f(w A) f(n T )), (f(w A) f(sa)), (f(sa) f(q)),..., (f(v ) f(nsw ))}. Ein CSP kann als Constraint-Graph dargestellt werden. Die Knoten repräsentieren die Variablen des CSPs und die Kanten stellen die Constraints dar, wie in Beispiel 2.2 gezeigt. Beispiel 2.2. Das zuvor vorgestellte Problem kann als folgender Graph dargestellt werden. Die Knoten repräsentieren hierbei die Staaten und die Verbindungen stellen die Constraints dar, die ausdrücken, dass benachbarte Staaten nicht gleich gefärbt sein dürfen. Diese Repräsentation des Problems als Graphen kann genutzt werden, um die Suche zu vereinfachen (s. Abschnitt 2.3) 2.2 Verschiedene Arten von CSPs Probleme mit Randbedingungen lassen sich anhand der Domänen ihrer Variablen und der Beschränkungstypen untergliedern.

11 2.2 Verschiedene Arten von CSPs 4 Die einfachste Art von CSPs weisen diskrete und endliche Domänen auf. Das im vorherigen Abschnitt angebrachte Beispiel der Kartenfärbung ist ein solches Problem, da die Domänen D i = {rot, gruen, blau} sowohl diskrete Werte aufweisen als auch endlich sind. Ist die Größe der Domänen in einem CSP auf d beschränkt, dann ist die Anzahl der Lösungen exponentiell zur Anzahl der Variablen n, d.h. O(d n ). Diskrete Variablen können auch einen unendlichen Wertebereich haben, z.b. die Menge der natürlichen Zahlen. Sollen beispielsweise Jobs zeitlich geplant werden, so stellt jede Variable den Zeitpunkt des Starts eines Jobs dar und der Wert dieser Variablen stellt die Dauer der Bearbeitung dar. Hier ist es nicht mehr möglich die Beschränkungen durch Auflistung der möglichen Wertekombinationen zu beschreiben. Es wird eine Beschränkungssprache benötigt. Muss Job1, der 5 Zeiteinheiten zur Bearbeitung benötigt, vor Job2 abgearbeitet werden, könnte dies durch folgende Ungleichheit beschrieben werden: StartJob1 + 5 StartJob2. Häufig treten Probleme mit Randbedingungen mit stetigen Domänen auf. Dies ist der Fall, wenn sehr präzise Werte verarbeitet werden müssen, wie beispielsweise in der Raumfahrt. Die am meisten untersuchte Kategorie von CSPs mit stetiger Domäne sind Probleme der linearen Programmierung. Hierbei müssen die Beschränkungen lineare Ungleichheiten sein. Für Probleme der linearen Programmierung sind Methoden bekannt, um diese in polynomieller Zeit zur Anzahl der Variablen zu lösen. Neben der Art der Domäne, können CSPs anhand des Aufbaus ihrer Einschränkungen unterschieden werden. Eine unäre Beschränkung betrifft lediglich den Wert einer einzigen Variablen, z.b. wenn der Staat Western Australia röt gefärbt werden muss, also f(w A) = rot. Binäre Beschränkungen hingegen beziehen sich auf die Werte zweier Variablen. So könnte z.b. ausgedrückt werden, dass die Staaten Western Australia und South Australia nicht gleich gefärbt werden dürfen, also W A SA. Bezieht sich eine Beschränkung auf drei oder mehr Variablen, so wird diese als Beschränkung höherer Ordnung bezeichnet. Ein klassisches Beispiel hierfür ist ein kryptoarithmetisches Rätsel (s. Abbildung 2.1). Hierbei muss jeder Abbildung 2.1. Ein kryptoarithmetisches Rätsel Buchstabe durch eine Zahl ersetzt werden. Außerdem müssen die Werte aller Variablen unterschiedlich sein. Dies kann durch die Beschränkung Alldiff(F,T,U,W,R,O)

12 2.3 Backtracking-Suche für CSPs 5 zusammengefasst werden. Nun müssen die Additionsbeschränkungen formuliert werden. O + O = R + 10 X 1 X 1 + W + W = U + 10 X 2 X 2 + T + T = O + 10 X 3 X 3 = F Dabei stellen die Hilfsvariablen X 1,X 2 und X 3 die Überträge dar. Diese Beschränkungen können in Form eines Beschränkungshypergraphen dargestellt werden (s. Abbildung 2.2). Hierbei stellt jedes Quadrat eine Beschränkung dar, die sich auf die Variable bezieht, mit der sie durch eine Kante verbunden ist. Bisher wurden Abbildung 2.2. Beschränkungshypergraph für das Beispiel des kryptoarithmetischen Rätsels nur absolute Beschränkungen betrachtet. Verletzt eine Variablenbelegung gegen eine dieser Beschränkungen, so handelt es sich um eine ungültige Belegung. Häufig werden aber Prioritätsbeschränkungen benötigt, welche die Güte einer Lösung angeben und nicht zwangsweise die Ungültigkeit einer Belegung erzeugen. Diese Art der Beschränkung wird u.a. bei einem Stundenplanungsproblem benötigt, bei dem es darum geht, die Güte des Stundenplans zu optimieren. 2.3 Backtracking-Suche für CSPs Bei einer Lösung für ein CSP handelt es sich um eine vollständige Zuweisung. Bei n Variablen hat der Suchbaum damit die Tiefe n. Es bieten sich vorrangig Tiefensuch-Algorithmen zur Problemlösung an. Angenommen, man verwendet eine Breitensuche-Strategie zur Lösung eines CSPs. Da jeder der n Variablen jeder der d Werte zugewiesen wird, ergibt sich auf der obersten Ebene ein Verzweigungsgrad von nd. Wir erzeugen also einen Baum mit n! d n Blättern. Es existieren jedoch maximal d n viele Lösungen! Daher werden für die Lösung von CSPs Tiefensuch- Algorithmen bevorzugt. Bei einem CSP hat die Reihenfolge, in der man den Variablen Werte zuweist keine Bedeutung für das Ergebnis: Sie sind also kommutativ. Daher weisen Suchalgorithmen zur Lösung eines CSPs in jedem Knoten genau einer Variablen mögliche

13 2.3 Backtracking-Suche für CSPs 6 Werte zu. Dadurch läßt sich die Anzahl der Blätter auf d n beschränken. Bei der Backtracking-Suche handelt es sich um eine Tiefensuche-Strategie, die in einem Schritt lediglich die möglichen Wertezuweisungen für eine Variable betrachtet und im Suchbaum zurückspringt, wenn für eine Teillösung keine gültige Zuweisung möglich ist. Algorithmus 1 zeigt eine allgemeine, rekursive Darstellung dieser Suchstrategie, wie sie zur Lösung eines CSPs angewendet werden kann. Da Algorithm 1 Allgemeiner Backtracking Algorithmus zum Lösen eines CSPs 1: function BACKTRACKING-SEARCH(csp) returns a solution or failure 2: return RECURSIVE-BACKTRACKING({}, csp) 3: end function 4: 5: function RECURSIVE-BACKTRACKING(assignment, csp) returns a solution or failure 6: if assignment is complete then 7: return assignment 8: end if 9: var SELECT-UNASSIGNED-VARIABLE(VARIABLES[csp], assignment, csp) 10: for all value in ORDER-DOMAIN-VALUES(var, assignment, csp) do 11: if value is consistent with assignment according to CONS- TRAINTS[csp] then 12: add {var = value} to assignment 13: result RECURSIVE-BACKTRACKING(assignment, csp) 14: if result failure then 15: return result 16: end if 17: remove {var = value} from assignment 18: end if 19: end for 20: return f ailure 21: end function es sich bei einfachem Backtracking um einen uniformierten Algorithmus handelt, kann nicht erwartet werden, dass er für große Probleme effizient ist. Für die Verbesserung der Effizienz betrachte man folgende Fragen: 1. Welche Variable sollte als nächste zugewiesen werden und in welcher Reihenfolge sollten die Werte ausprobiert werden? 2. Welche Auswirkungen haben die aktuellen Variablenzuweisungen für die anderen, noch nicht betrachteten Variablen? 3. Kann in einem Zustand, in dem es keine erlaubten Werte mehr für ein Variable gibt, vermieden werden, diesen Fehler in nachfolgenden Pfaden zu wiederholen?

14 2.3 Backtracking-Suche für CSPs 7 Es werden nun Konzepte vorgestellt, mit denen sich eine Effizienzsteigerung der Backtracking-Suche erzielen läßt. Diese beziehen sich auf die zuvor angebrachten Fragen. Reihenfolge von Variablen und Werten Algorithmus 1 enthält die Methode SELECT-UNASSIGNED-VALUES, welche die nächste, noch nicht zugewiesene Variable liefert. Hierbei handelt es sich jedoch selten um die effizienteste Auswahl. Betrachte man beispielsweise die Zuweisung f(w A) = rot und f(n T ) = gruen, so gibt es für SA nur noch einen gültigen Wert, nämlich f(sa) = blau. Auf diese Weise kann unter Umständen die Anzahl der zu betrachtenden Knoten verkleinert werden, da eine Variable ausgewählt wird, die am wahrscheinlichsten einen Fehler verursacht und so der Suchbaum gekürzt wird. Diese Strategie wird als Minimum-Remaining-Values Heuristik (MRV) bezeichnet. Die MRV-Heuristik hilft aber nicht bei der Auswahl der ersten Variablen. Für diesen Fall ist die Degree Heuristik hilfreich. Sie versucht den Verzweigungsgrad zukünftiger Auswahlen zu reduzieren, indem sie die Variable auswählt, die in den meisten Beschränkungen für noch nicht zugewiesene Variablen vorkommt. Damit wird die Wahrscheinlichkeit erhöht, dass auf Pfaden ein nichtkonsistenter Zustand auftritt und diese deshalb verlassen werden können. Um die Reihenfolge festzulegen, in der die möglichen Werte einer Variablen betrachtet werden, wird der Wert bevorzugt, der die wenigsten Auswahlen für die benachbarten Variablen im Constraint-Graphen auschließt. Dadurch wird versucht, die höchste Flexibilität für nachfolgende Variablenzuweisungen beizubehalten. Diese Strategie wird als Least Constraining Value Heuristik bezeichnet. Deren Anwendung ist natürlich nur dann sinnvoll, wenn lediglich eine Lösung des Problems gesucht wird. Ist die Ausgabe aller Lösungen oder der besten Lösung erwünscht, so muss ohnehin jeder Wert betrachtet werden. Vorabprüfung Bisher wurden die Beschränkungen einer Variablen erst dann betrachtet, wenn sie durch die Auswahlfunktion selektiert wurde. Es existieren auch Strategien, um den Suchraum zu reduzieren, indem Beschränkungen früher in der Suche oder vor der Suche betrachtet werden. Mit der sogenannten Vorabprüfung (Forward Checking), werden Beschränkungen während der Suche betrachtet. Wurde eine Variable X zugewiesen, so werden Variablen Y, die noch nicht zugewiesen wurden und mit X durch eine Beschränkung in Verbindung stehen betrachtet. Es wird der X zugewiesene Wert betrachtet und es werden die Werte aus der Domäne von Y gelöscht, die mit dem Wert für X inkonsistent sind. Diese Strategie wird anhand von Beispiel 2.3 erläutert. Beispiel 2.3. Färbungsproblem für Australien mit Vorabüberprüfung: Begonnen wird mit Zuweisung f(w A) = rot. Nun wird durch Anwendung der Vorabprüfung die Farbe rot aus den Domänen der benachbarten Staaten entfernt, da

15 2.3 Backtracking-Suche für CSPs 8 diese nicht die gleiche Farbe erhalten dürfen. Durch f(q) = gruen wird anschließend die Farbe grün aus den Domänen der Staaten NT, NSW und SA gelöscht. Nachdem f(v ) = blau zugewiesen wird, wird blau aus den Domänen von NSW und SA entfernt. Nun ist die Domäne von SA leer. Es wurde also eine Inkonsistenz der aktuellen Belegung festgestellt und der Algorithmus springt deshalb zurück. Überprüfung der Kantenkonsistenz Im vorherigen Beispiel fällt auf, dass bereits nach der Zuweisung f(q) = gruen ein nicht konsistenter Zustand festgestellt werden kann, da N T und SA benachbart sind und die Domänen beider Variablen nur noch den Wert blau enthalten. Diese Inkonsistenz wird durch das zuvor vorgestellte Verfahren der Vorabprüfung nicht festgestellt, da diese nicht weit genug in die Zukunft schaut. Es wird nun das Konzept der Kantenkonsistenz eingeführt. Hierbei wird eine Kante im Beschränkungsgraphen als gerichtete Kante dargestellt, wie beispielsweise die Kante von SA nach NSW. Für die aktuellen Domänen von SA und NSW ist der Pfeil konsistent, wenn es für jeden Wert x D SA ein y D NSW gibt, der mit x konsistent ist (s. Beispiel 2.4). Beispiel 2.4. Überprüfung der Kantenkonsistenz: Man betrachte die dritte Zeile aus Beispiel 2.3. Hier hat die Variable SA die Domäne {blau} und NSW die Domäne {rot, blau}. Die Kante von SA nach NSW ist konsistent, da es für SA = blau eine gültige Zuweisung der Variablen NSW gibt, nämlich NSW = rot. In die andere Richtung ist diese Kante jedoch nicht konsistent, da es für NSW = blau keine konsistente Zuweisung der Variablen SA gibt. Diese Überprüfung kann entweder vor Beginn der Suche oder in jedem Verarbeitungsschritt (Algorithmus: MAC (Maintaining Arc Consistency)) durchgeführt werden. Wird eine Kante (X i, X j ) betrachtet und wird die Domäne von X i aufgrund einer Inkonsistenz verändert, so müssen alle Kanten (X k, X i ) ebenfalls überprüft werden und somit wieder in die Queue eingefügt werde, da es zu neuen Inkonsistenzen gekommen sein kann. Ein binäres CSP hat höchstens O(n 2 ) Kanten und jede Kante (X k, X i ) wird höchstens d-mal in die Queue eingefügt, da X i höchstens d zu löschende Werte aufweist. Die Konsistenzprüfung einer Kante erfolgt in O(d 2 ). Im schlechstesten Fall erfolgt die Überprüfung in O(n 2 d 3 ).

16 2.3 Backtracking-Suche für CSPs 9 Backjumping Wird bei der Zuweisung eines Wertes für eine Veranstaltung kein gültiger Wert gefunden, so wird zu der im Suchbaum vorangehenden Variablen zurückgesprungen und es mit der Zuweisung eines anderen Werts für diese Variable versucht. Diese Strategie wird als Chronologisaches Backtracking bezeichnet. Dieser Rücksprung ist jedoch nicht immer effektiv. Dazu betrtachte man folgendes Beispiel Beispiel 2.5. Chronologisaches Backtracking: Die folgende Abbildung zeigt Teile des Suchbaums für das k-graph- Coloring Problem. Die Variablen seien in der Reihenfolge Q, NSW, V, T, SA, W A, NT sortiert. Es seien bereits die Zuweisungen Q = red, NSW = green, V = blue und T = red getroffen worden. Nun wird die nächste Variable SA betrachtet. Angenommen, jeder Wert für SA verstößt gegen ein Constraint. Dann wird zur letzten im Suchbaum betrachteten Variablen zurückgesprungen, also zu T. Nun wird eine neue Farbe für Tasmania probiert. Dies kann allerdings nicht das Problem für SA, also für South Australia lösen. Ein weiterer Ansatz ist, im Suchbaum zu einer Menge von Variablen zurück zu gehen, die diesen Fehler verursacht hat. Diese Menge wird als Konfliktmenge bezeichnet. Die Konfliktmenge für eine Variable X enthält alle Variablen, die bereits zugewiesen sind und über mindestens ein Constraint mit X verbunden sind. Im Beispiel wäre die Konfliktmenge für SA die Menge {Q, NSW, V }. Diese Methode des Rücksprungs wird als Konfliktgesteuertes Backtracking oder Backjumping bezeichnet. Beim Backjumping würde damit Tasmania übersprungen und es mit einem neuen Wert für V versucht.

17 2.4 Lokale Suche für CSPs 10 Zerlegung eines CSPs in Teilprobleme Ein CSP kann in Teilprobleme zerlegt werden. Dazu wird der Constraint Graph verbundene Teilgraphen zerlegt. Jedes dieser Teilprobleme wird unabhängig von den anderen gelöst und die resultierenden Lösungen werden zusammengefügt. Hat eines der Teilprobleme keine Lösung, so hat des Gesamtproblem ebenfalls keine Lösung. Eine beispielhafte Zerlegung ist in Abbildung 2.3 gezeigt. Wird ein CSP Abbildung 2.3. Zerlegung des Graphen aus Beispiel 2.2 in Teilprobleme mit n Variablen in Teilprobleme mit jeweils c Variablen zerlegt, hat so können diese Probleme O(d c n ) gelöst werden. c 2.4 Lokale Suche für CSPs Lokale Suche hat sich für die Lösung von vielen CSPs als effizient erwiesen. Für die Initiallösung wird jeder Variablen ein Werte zugewiesen. Die Nachfolgefunktion wählt nun in jedem Schritt eine Variable aus, deren Wert geändert wird. Für die Auswahl eines Wertes für die Variable ist es naheliegend, den Wert zu wählen, der am wenigsten Konflikte mit den übrigen Variablen verursacht. Diese Strategie wird als Min-Conflicts Heuristik bezeichnet. Der hier vorgestellte Lokale Suche Algorithmus 2 verwendet diese Heuristik. Ein Vorteil der Lokalen Suche besteht darin, dass diese mit einer Initiallösung gestartet werden kann. Dies ist u.a. wichtig für die Lösung von Scheduling-Problemen. Der Wochenflugplan einer Fluggesellschaft beinhaltet eine große Anzahl an Flügen, Personal- und Resourcenzuweisungen. Durch eine unvorhersehbares Ereignis (z.b. eine Wetteränderung) kann eine Anpassung dieses Plans notwendig werden. Dieser Plan kann leicht angepasst werden, indem eine Lokale Suche angewendet wird, die mit dem zu ändernden Plan startet.

18 2.4 Lokale Suche für CSPs 11 Algorithm 2 Lokale Suche unter Verwendung der MinConflicts Heuristik zum Lösen von CSPs 1: function MIN-CONFLICTS(csp, max steps) returns a solution 2: or failure 3: current an initial complete assignment for csp 4: for i = 1 to max steps do 5: if current is a solution for csp then 6: return current 7: end if 8: var a randomly chosen, conflicted variable from VARIABLES[csp] 9: value the value v for var that minimizes CONFLICTS(var, v, current, csp) 10: set var = value in current 11: end for 12: return f ailure 13: end function

19 3 Formulierung des Stundenplanungsproblems als CSP In diesem Kapitel wird das vorliegende Stundenplanungsproblem als CSP definiert. Dazu wird zunächst das Datenmodell definiert, auf dessen Basis die Constraints formuliert werden können. Mit diesen Vorbereitungen können anschießend die Bestandteile des Stundenplanungsproblem als CSP definiert werden. Die Definitionen des Datenmodells und der Constraints stammen aus [12], [7] und [8]. 3.1 Definition des Datenmodells Die relevanten Eingabemengen sind wie folgt definiert: (E1) Eine Menge T imeslot von t Zeitfenstern mit T imeslot = {T 1,..., T k }. Für jedes T i T imeslots gilt: mit T i = (day i, hour i, penalty i ) day i, hour i, penalty i N. Für je zwei Elemente T i, T j T imeslots mit i, j t und i < j gilt: Zeitpunkt von Timeslot i < Zeitpunkt von Timeslot j. (E2) Eine Menge Resource von m Ressourcen mit Resource = {Y 1,..., Y m }.

20 3.1 Definition des Datenmodells 13 (E3) Eine Menge Lecturer von l Dozenten mit Lecturer = {L 1,..., L l }. Für jedes L i Lecturer gilt: L i = (UnwantedT i,f orbiddent i,events i,maxevents i, maxdays i,sequenced i, exact i ) mit und UnwantedT i, F orbiddent i T imeslot und events i, maxevents i, maxdays i N sequenced i, exact i {0, 1}. (E4) Eine Menge Semester von s Semester-Studiengang Kombinationen mit Semester = {S 1,..., S s }. Für jedes S i Semester gilt: mit S i = (permittedcollisions i ) permittedcollisions i N. (E5) Eine Menge Room von r Räumen mit Room = {R 1,..., R r }. Für jedes R i Room gilt: mit R i = (seats i, RoomRes i, penalty i, RoomAvail i ) und seats i, penalty i N

21 3.1 Definition des Datenmodells 14 und RoomRes i Resource und RoomAvail i T imeslot. Available i T imeslot. (E6) Eine Menge Event von e Veranstaltungen mit Event = {E 1,..., E e }. Für jedes E i Event gilt: E i = (EventLec i, EventSem i, EventRes i, EventNotRes i, eventneedcap i, eventgrp i, eventsametimeas i, eventf ollowst o i, F orbiddent i, timeslotp reset i, roomp reset i ) mit EventLec i Lecturer und 1 EventLec i 5 Die Elemente der Menge EventLec i repräsentieren die Dozenten der Veranstaltung E i. EventSem i Semester und 1 EventSem i 7 Die Elemente der Menge EventSem i repräsentieren die Studiengang-Semester Kombination für welche die Veranstaltung E i stattfindet. EventRes i Resourcen, EventNotRes i Resourcen, EventRes i EventNotRes i = Die Mengen EventRes i und EventNotRes i repräsentieren die Ressourcen, über die ein Raum für die Veranstaltung E i verfügen muss bzw. über die ein Raum für die Veranstaltung E i nicht verfügen darf. eventneedcap i N eventneedcap i gibt an, über welche Anzahl von Sitzplätzen ein Raum für die Veranstaltung E i verfügen muss. eventgrp i N

22 3.2 Definition der Constraints 15 Zu einer Veranstaltung E i ist der Wert von eventgrp i > 0, wenn es sich um eine Übung handelt und gibt dann gleichzeitig die Übungsgruppennummer an. Handelt es sich bei der Veranstaltung E i um eine Vorlesung, gilt eventgrp i = 0. eventsametimeas i N Für zwei Veranstaltungen E i, E j gilt eventsametimeas i = j, wenn die Veranstaltung E i in der gleichen Stunde stattfinden muss, wie die Veranstaltung E j. Ist die Veranstaltung E i an keine andere Veranstaltung gebunden, gilt eventsametimeas i = 0. eventf ollowst o i N Für zwei Veranstaltungen E i, E j gilt eventf ollowst o i = j, wenn die Veranstaltung E i in der Stunde stattfinden muss, die auf die Stunde der Veranstaltung E j folgt. Muss die Veranstaltung E i nicht direkt nach einer anderen Veranstaltung stattfinden, dann gilt eventf ollowst o i = 0. F orbiddent i T imeslot Diese Menge beinhaltet die für diese Veranstaltung ausgeschlossenen Zeitfenster. Das vorgeplante Zeitfenster. timeslotp reset i T imeslot Der vorgeplante Raum. roomp reset i Room Für jede Veranstaltung E i Event wird ein Tupel plan i = (T i, R i ) ausgegeben. Dabei gilt T i T imelsot und R i Room. Dieser Tupel repräsentiert also die Stunde und den Raum der Veranstaltung im Stundenplan. Durch diese Belegung darf keine der harten Einschränkungen verletzt werden. 3.2 Definition der Constraints Folgende Bedingungen müssen erfüllt sein, damit ein Stundenplan als gültig angesehen wird: (C1) Es dürfen nicht mehrere Veranstaltungen mit dem selben Dozenten in der selben Stunde stattfinden. Für alle 1 i e und 1 j e mit i j gilt:

23 3.2 Definition der Constraints 16 (plan i = (T i, R i ) plan j = (T j, R j ) T i = T j eventsametimeas i j eventsametimeas j i) EventLec i EventLec j = Bsp.: Werden zwei Veranstaltungen E i und E j vom selben Dozenten L 1 gehalten und sie finden in der selben Stunde statt, dann ist die Bedingung nicht erfüllt, denn es gilt: EventLec i EventLec j = {L 1 } (C2) Es dürfen nicht mehrere Veranstaltungen einer Studiengang-Semester-Kombination in der selben Stunde stattfinden. Ist eine Anzahl von erlaubten Kollisionen von Veranstaltungen erlaubt, so darf ein Plan nicht mehr als diese erlaubte Anzahl an Kollisionen aufweisen. Für alle 1 i e und 1 j e mit i j gilt: (plan i = (T i, R i ) plan j = (T j, R j ) T i = T j EventSem i EventSem j eventsametimeas i j eventsametimeas j i) permittedcollissions EventSemi detectedcollissions EventSemi detectedcollissions i gibt für die Studiengang-Semester-Kombination i die Anzahl der bisher festgestellten Kollisionen an. Bsp.: Seien die Veranstaltungen E i und E j der selben Studiengang-Semester- Kombination S 1 zugeordnet, tragen die selbe Übungsgruppennummer (event- Grp i = eventgrp j ), finden in der selben Stunde statt (T i = T j ) und für diese Kombination seinen keine Kollisionen erlaubt, dann ist die Bedingung nicht erfüllt, denn es gilt: permittedcollissions S1 > detectedcollissions S1 (C3) Ein Raum darf nicht mehrfach in der selben Stunde verwendet werden. Für alle 1 i e und 1 j e mit i j gilt: plan i = (T i, R i ) plan j = (T j, R j ) T i = T j R i R j Bsp.: Finden zwei Veranstaltungen E i und E j in der selben Stunde statt (T i = T j ) und belegen den selben Raum, dann ist die Bedingung nicht erfüllt, denn es gilt: R i = R j (C4) Es darf kein Raum mit einer zu geringen Sitzplatzanzahl für die voraussichtliche Teilnehmerzahl einer Veranstaltung belegt werden.

24 3.2 Definition der Constraints 17 Für alle 1 i e gilt: plan i = (T i, R i ) roomcap i eventneedcap i Bsp.: Findet eine Veranstaltung E i mit einer Stitzplatzanforderung von 50 Sitzplätzen (eventneedcap i = 50) in einem Raum R j mit 25 Sitzplätzen statt (roomcap j = 25), dann ist die Bedingung nicht erfüllt, denn es gilt: seats j < eventneedcap i (C5) Es darf kein Raum ohne die nötigen Ressourcen für die entsprechende Veranstaltung belegt werden. Ebenso darf ein Raum nicht über unerwünschte Ressourcen verfügen. Für alle 1 i e gilt: plan i = (T i, R i ) EventRes i RoomRes i und plan i = (T i, R i ) EventNotRes i RoomRes i = Bsp.: Findet eine Veranstaltung E i mit der gewünschten Ressource Y j (Event- Res i = {Y j }) und der ausgeschlossenen Ressource Y k (EventNotRes i = {Y k }) in einem Raum R l statt, der nur die Ressource Y k zur Verfügung stellt (RoomRes l = {Y k }), so sind beide oben genannten Bedingungen nicht erfüllt, denn es gilt: EventRes i not RoomRes l und EventNotRes i RoomRes l = {Y k } (C6) Es dürfen ausschließlich die verfügbaren Stunden eines Dozenten belegt werden. Für alle 1 i e gilt: plan i = (T i, R i ) L j EventLec i : T i / unwantedt j Bsp.: Findet eine Veranstaltung E i in der Stunde T i statt, der Dozent L j EventLec i der Veranstaltung diese jedoch als nicht verfügbar gekennzeichnet hat, dann ist die Bedingung nicht erfüllt, denn es gilt: T i unwantedt j (C7) Ein Raum darf nur in einer Stunde belegt werden, in der dieser auch verfügbar ist. Für alle 1 i e gilt: plan i = (T i, R i ) T i RoomAvail i

25 3.2 Definition der Constraints 18 Bsp.: Findet eine Veranstaltung E i in der Stunde T i und im Raum R i statt, wobei der Raum R i zur Stunde T i nicht verfügbar ist (RoomAvail i = {T j }), dann ist die Bedingung nicht erfüllt, denn es gilt: T i / RoomAvail i (C8) Ist die Veranstaltung an eine andere Veranstaltung gebunden, dann müssen beide Veranstaltungen in der selben Stunde stattfinden. Für alle 1 i e und 1 j e mit i j gilt: plan i = (T i, R i ) plan j = (T j, R j ) eventsametimeas i = j T i = T j Bsp.: Ist eine Veranstaltung E i an eine Veranstaltung E j gebunden (event- SametimeAs i = j), aber die Veranstaltungen finden in verschiedenen Stunden statt, dann ist die Bedingung nicht erfüllt, denn es gilt: T i T j (C9) Ist die Veranstaltung als Nachfolge zu einer anderen Veranstaltung festgelegt, so muss die Veranstaltung direkt, also auch am selben Tag, auf diese folgen. Für alle 1 i e gilt: plan i = (T i, R i ) plan j = (T j, R j ) eventf ollowst o i = j T i = T j+1 Bsp.: Soll eine Veranstaltung E i unmittelbar auf eine Veranstaltung E j folgen (eventf ollowst o i = j), aber die Veranstaltung findet nicht in der Stunde statt, die auf die Stunde von E j folgt, dann ist die Bedingung nicht erfüllt, denn es gilt: T i T j+1 (C10) Ist für einen Dozenten eine maximale Anzahl von Veranstaltungen pro Tag angegeben, so darf diese an keinem Tag überschritten werden. Für alle 1 j l und Days = {Mo, T u, W e, T h, F r} gilt: maxevents j 0 D Days : {E i Event, plan i = (T i, R i ) day Ti = D L j EventLec i } maxevents j Bsp.: Dozent L 1 wüscht lediglich eine Veranstaltung pro Tag (maxevents 1 = 1). Er hält die Veranstaltungen E 1 und E 2, die beide montags stattfinden. Dann ist die Bedingung nicht erfüllt, denn für D = M o Days gilt: maxevents 1 0 {E 1, E 2 } > maxevents 1

26 3.3 Problemdefinition 19 (C11) Harte Vorplanungen für die Zuweisung einer Stunde für eine Veranstaltung müssen eingehalten werden. Für alle 1 i e gilt: plan i = (T i, R i ) T i = timeslotp reset i Bsp.: Für die Veranstaltung E i sei die Stunde T i durch eine harte Vorplanung gefordert (timeslotp reset i = T i ). Wird nun die Stunde T j mit i j zugewiesen, so ist die Bedingung nicht erfüllt denn es gilt: T j timeslotp reset i (C12) Harte Vorplanungen für den Ausschluss einer oder mehrerer Stunden für eine Veranstaltung müssen eingehalten werden. Für alle 1 i e gilt: plan i = (T i, R i ) T i / F orbiddent i Bsp.: Für die Veranstaltung E i sei die Stunde T i durch eine harte Vorplanung ausgeschlossen (F orbiddent i = {T i }) und es wird die Stunde T i. Dann ist die Bedingung nicht erfüllt, denn es gilt: T i F orbiddent i (C13) Harte Vorplanungen für die Zuweisung eines Raums zu einer Veranstaltung müssen eingehalten werden. Für alle 1 i e gilt: plan i = (T i, R i ) T i = room i Bsp.: Für die Veranstaltung E i sei der Raum R i durch eine harte Vorplanung gefordert (roomp reset i = R i ). Nun wird der Raum R j mit j i zugewiesen. Dann ist die Bedingung nicht erfüllt wenn es gilt: R j roomp reset i 3.3 Problemdefinition Beim vorliegenden Problem der Stundenplanung muss jeder Veranstaltung ein Raum und ein Zeitfenster zugewiesen werden. Die Veranstaltungen stellen also die Variablen dar, denen ein Wert zugewiesen werden muss. Diese Menge sei mit

27 3.3 Problemdefinition 20 Event = {E 1,..., E e } bezeichnet. Die Domänen der Variablen werden definiert als D i = T imeslot Room := {(T, R) T T imeslot, R Room}. Sie enthält also alle Kombination aus den zur Verfügung stehenden Zeitfenstern und Räumen. Gesucht ist eine Abbildung f : Event T imeslot Room, so dass gegen kein der in Abschnitt 3.2 beschriebenen Constraints verstoßen wird. Dieses Problem weist diskrete und endliche Domänen auf, da sie voneinander getrennte Werte enthalten und die Anzahl ihrer Elemente durch (t r) begrenzt ist. Bei den vorliegenden Constraints, die einen gültigen Plan definieren, handelt es sich um unäre und binäre Constraints. Die Constraints C1, C2 drücken aus, dass unär binär höherer Ordnung C1 x C2 x C3 x C4 x C5 x C6 x C7 x C8 x C9 x C10 x C11 x C12 x C13 x Abbildung 3.1. Einordnung der Constraints des vorliegenden Planungsproblems zwei Veranstaltungen einer Studiengang-Semester-Kombination oder eines Dozenten nicht zur gleichen Stunde stattfinden dürfen. C3 besagt, dass zwei Veranstaltungen nicht zur gleichen Stunde im gleichen Raum stattfinden dürfen. C8 und C9 legen fest, dass zwei Veranstaltungen, die gleichzeitig bzw. aufeinander folgend stattfinden sollen, auch zur gleichen Stunden bzw. zu zwei aufeinander folgenden Stunden stattfinden müssen. Diese Constraints beziehen sich jeweils auf zwei Veranstaltungen und werden daher als binäre Constraints bezeichnet. Die Constraints C4 und C5 beziehen sich auf die für eine Veranstaltung erforderlichen Sitzplätze und Resourcen der Räume. Durch C6 und C7 werden die Verfügbarkeiten von Dozenten und Räumen bettrachtet. C11, C12 und C13 stellen Einschränkungen dar, die sich auf harte Vorplanungen beziehen. Diese Constraints beziehen sich lediglich auf eine Veranstaltung werden damit der Gruppe der unären Constraints zugeordnet.

28 3.3 Problemdefinition 21 Constraints C10 stellt sicher, dass einem Dozenten nicht mehr Veranstaltungen an einem Tag zugewiesen werden als von ihm erwünscht. Dieses Constraint bezieht sich damit auf alle Veranstaltungen eines Dozenten. Dies können mehr als zwei Veranstaltungen sein. Hierbei handelt es sich also um ein Constraint höherer Ordnung.

29 4 Entwurf In diesem Abschnitt werden Algorithmen zu Lösung des Stundenplanungsproblems als CSP erarbeitet. Es wird dabei mit einem Standard-Backtracking Algorithmus begonnen. Dieser wird schrittweise durch die Anwendung von Heuristiken und speziellen Erweiterung verbessert. Außerdem wird ein Lokale Suche Algorithmus zur Lösung des Problems entwickelt. 4.1 Einfaches Backracking zur Lösung des CSP Es wird schrittweise jeweils eine Veranstaltung E i Event betrachtet und dieser ein Wert aus ihrer Domäne D i zugewiesen. Der aus diesem Vorgehen resultierende Berechnungsbaum ist in Abbildung 4.1 dargestellt. Die Domänen D i enthalten Abbildung 4.1. Berechnungsbaum für das Stundenplanungsproblem als CSP jeweils höchstens r t Elemente. Der Lösungsbaum weißt also einen maximalen Verzweigungsrad von rt auf. Die Tiefe des Baums ist gleich e. Außerdem ist der Aufwand für die Prüfung der Teillösungen g(x) zu berücksichtigen. Daraus kann eine worst-case Laufzeit von O((rt) e g(x)) und damit eine exponentielle Laufzeit für die Lösung dieses Problems gefolgert werden. Eine Lösung für dieses Problem ist die vollständige Zuweisung eines Raums und eines Zeitfensters für jede Veranstaltung E i Event.

30 4.2 Constraint-Graph 23 Beim ersten Ansatz eines Backtracking-Algorithmus zum Lösen des vorliegenden CSP (siehe Algorithmus 3) handelt es sich um eine angepasste Fassung von Algorithmus 1. Es wird der zuvor angebrachte Suchbaum durchlaufen. Wird durch eine Zuweisung eine Inkonsistenz festgestellt, so wird die Suche auf diesem Pfad abgebrochen und der Algorithmus betrachtet eine andere Zuweisung. Bei ein- Algorithm 3 Einfaches Backtracking zum Lösen des Stundenplanungsproblems als CSP 1: function BACKTRACKING-SEARCH(csp) 2: return RECURSIVE-BACKTRACKING({}, csp) 3: end function 4: function RECURSIVE-BACKTRACKING(timetable, csp) 5: if timetable is complete then 6: return timetable 7: end if 8: event an unassigned event 9: for all (T, R) D event do 10: if event = (T, R) is consistent according to constraints (C1)-(C13) then 11: timetable timetable plan event = (T, R) 12: result RECURSIVE-BACKTRACKING(timetable, csp) 13: if result error then 14: return result 15: end if 16: timetable timetable\plan event 17: end if 18: end for 19: return error 20: end function fachem Backtracking handelt es sich um einen uniformierten Algorithmus. Dies bedeutet, dass dieses Verfahren keine zusätzlichen Informationen über Zustände besitzt, außer den in der Problemspezifikation vorgegebenen. Daher kann nicht erwartet werden, dass er für große Probleme effizient ist. Dieser einfache Ansatz einer Backtracking-Suche wir nun durch Heuristiken erweitert, wodurch sich eine Steigerung der Effizienz erhofft wird. 4.2 Constraint-Graph Mit Hilfe eines Constraint-Graphen können die Beziehungen der Variablen über die Constraint dargestellt werden. Einige der folgenden Algorithmen arbeiten mit Daten, die in Form eines Constraint Graphen zur Verfügung gestellt werden.

31 4.2 Constraint-Graph 24 Die Knoten des Graphen stellen dabei die Variablen, also die Veranstaltungen, dar. Die Kanten zwischen den Veranstaltungen repräsentieren die Verbindung der beiden Knoten durch ein Constraint. Zwischen zwei Knoten v i und v j exisitiert eine Verbindung, wenn mindestens eine der folgenden Fälle vorliegt: 1. v i und v j wurde mindestens ein gemeinsamer Dozent zugewiesen. Da ein Dozent zu einem Zeitfenster nur eine Veranstaltung halten kann, stellt diese Verbindung das Constraint C1 dar. 2. v i und v j wurde mindestens eine gemeinsame Studiengang-Semester Kombination zugewiesen. Da für eine Studiengang-Semester Kombination zu einem Zeitfenster nur eine Veranstaltung stattfinden darf, stellt diese Verbindung das Constraint C2 dar. 3. Müssen v i und v j gleichzeitig stattfinden, so existiert zwischen den beiden Knoten eine Verbindung, die Constraint C8 repräsentiert. 4. Müssen v i und v j unmittelbar nacheinander stattfinden, so existiert zwischen den beiden Knoten eine Verbindung, die Constraint C9 repräsentiert. 5. Constraint C3 verursacht eine Verbindung zwischen jedem v i und v j für 1 i, j e und i j, da zwei Veranstaltungen zur gleichen Zeit nicht im selben Raum stattfinden dürfen. 6. Ist die Anzahl von Veranstaltungen pro Tag für einen Dozenten L durch Constraint C10 beschränkt, so existieren zwischen allen Knoten v i und v j Verbindungen, für die gilt, dass L EventLec i L EventLec j. Die übrigen Constraints beziehen sich lediglich auf eine einzige Veranstaltung und verursachen daher auch keine Verbindung zwischen zwei Knoten. Der Aufbau des Graphen wird durch Beispiel 4.1 erläutert. Beispiel 4.1. Beispiel für einen Constraint-Graphen für das Stundenplanungsproblem Gegeben seien fünf Veranstaltungen E 1 bis E 5. Diesen Veranstaltungen seien folgenden Dozenten und Studiengang-Semester-Kombinationen zugewiesen: Dozenten S-S-K E 1 L 1 S 1 E 2 L 2 S 2 E 3 L 1, L 2 S 1 E 4 L 2 S 3 E 5 L 3 S 1 Des Weiteren sei festgelegt, dass E 2 und E 4 gleichzeitig stattfinden müssen und E 4 auf E 5 folgen muss. Daraus ergibt sich nun folgender Constraint-Graph:

32 4.2 Constraint-Graph 25 Es handelt sich um einen ungerichteten Graphen, bestehend aus einer Menge V von Knoten, einer Menge E V V von Kanten. Die Nachbarschaft einer Variablen E i wird im folgenden mit N T ype (E i ) bezeichnet. Sie enthält alle Variablen E j, für die ein k E existiert, so dass p(k) = {E i, E j } für i j. Wobei es sich bei t um Abbildung t : E T ype mit T ype = {lec, sem, room, ST, F T, events} handelt. Diese Abbildung weißt jeder Kante k E einen Typen zu. Diese Nachbarschaftsfunktionen werden wie folgt definiert: 1. L Lecturer : L EventLec i L EventLec j E j N lec (E i ) Die Nachbarschaft N lec (E i ) enthält für E i alle Veranstaltungen, denen mindestens ein gemeinsamer Dozent mit E i zugeordnet wurde. Diese Nachbarschaft ist für die Prüfung von C1 erforderlich. 2. S Semester : S EventSem i S EventSem j E j N sem (E i ) Die Nachbarschaft N sem (E i ) enthält für E i alle Veranstaltungen, denen mindestens ein gemeinsames Semester mit E i zugeordnet wurde. Diese Nachbarschaft ist für die Prüfung von C2 erforderlich i, j e i j : E j N room (E i ) Die Nachbarschaft N room drückt aus, dass ein Raum in einer Stunde nur einmal zugewiesen werden kann. Sie ist damit für die Prüfung von C3 erforderlich. 4. sametimeas i = j E j N ST (E i ) mit 1 i, j e und i j Die Nachbarschaft N ST (E i ) enthält für E i alle Veranstaltungen, die mit E i

33 4.3 Erweiterung der Backtracking-Suche 26 gleichzeitig stattfinden müssen. Diese Nachbarschaft ist für die Prüfung von C8 erforderlich. 5. followst o i = j E j N F T (E i ) 1 i, j e und i j Die Nachbarschaft N ST (E i ) enthält für E i die Veranstaltungen, auf E i folgen muss. Diese Nachbarschaft ist für die Prüfung von C9 erforderlich. 6. L Lecturer : L EventLec i maxevents L 0 E j N events (E i ) Die Nachbarschaft N lec (E i ) enthält für E i alle Veranstaltungen, denen mindestens ein gemeinsamer Dozent mit E i zugeordnet wurde, der die Anzahl der Veranstaltungen an einem Tag beschränkt hat. Diese Nachbarschaft ist für die Prüfung von C10 erforderlich. 4.3 Erweiterung der Backtracking-Suche Die Laufzeit eines Backtracking Algorithmus kann verbessert werden, indem die Wertebereiche der Variablen möglichst früh reduziert werden. Dies kann sowohl vor als auch während der Suche geschehen. Außerdem ist es wünschenswert, dass Inkonsistenzen möglichst früh im Berechnungspfad aufgedeckt werden und somit viele Zustände frühzeitig ausgeschlossen werden können. Die folgenden Abschnitte stellen Ansätz zur Reduktion der Komplexität der Suche vor. Es wird versucht, durch die Anwendung von Heuristiken den Algorithmus des Einfachen Backtrackings effizienter zu gestallten Einschränken der Wertebereiche vor Suchbeginn Die Effizienz der Backtracking Suche kann erheblich verbessert werden, wenn der Suchraum durch den Auschluss von ungültigen Lösungen verkleinert werden kann. Hier kann die Reduktion des Problems helfen. Die Reduktion der Größe der Domänen ist gewissermaßen das Gleiche wie das Abschneiden von Pfaden im Suchbaum (s. [10], Kap.2). Bisher enthält jede Domäne D i (t r) viele Elemente. Unter Berücksichtigung der Constraints (C1) bis (C13) werden nun vor Beginn der Suche Elemente aus den Domänen entfernt, von denen bekannt ist, dass eine Zuweisung dieses Wertes aufgrund der festgelegten Constraints ungültig wäre. Dies wird durch die Erweiterung des Algorithmus des Einfachen Backtracking um die Funktion REMOVE- INCONSISTENT-VALUES ausgedrückt (siehe Algorithmus 4 Zeile 4). Diese Funktion betrachtet die Veranstaltungen und entfernt ungültige Elemente aus den Wertebereichen. Es ist jedoch nicht möglich, bereits vor der Suche auf Basis aller Constraints (C1) bis (C13) die Domänen zu reduzieren. Um die Domäne D i einer Veranstaltung E i einzuschränken, können vorab die Tupel (T, R) entfernt werden, die

34 4.3 Erweiterung der Backtracking-Suche 27 Algorithm 4 Backtracking mit Reduktion der Wertebereiche vor Beginn der Suche 1: function BACKTRACKING-SEARCH(csp) 2: REMOVE-INCONSISTENT-VALUES(Event) 3: return RECURSIVE-BACKTRACKING({}, csp) 4: end function 5: function RECURSIVE-BACKTRACKING(timetable, csp) 6: if timetable is complete then 7: return timetable 8: end if 9: event an unassigned event 10: for all (T, R) D event do 11: if event = (T, R) is consistent according to constraints (C1)-(C13) then 12: timetable timetable plan event = (T, R) 13: result RECURSIVE-BACKTRACKING(timetable, csp) 14: if result error then 15: return result 16: end if 17: timetable timetable\plan event 18: end if 19: end for 20: return error 21: end function 1. gegen eine harte Vorplanung eines Zeitfensters verstoßen (C11): D i = D i \ {(T, R) T timeslotp reset i } 2. gegen eine harte Vorplanung für den Ausschluss von Zeitfenstern verstoßen (C12): D i = D i \ {(T, R) T F orbidden i } 3. gegen eine harte Vorplanung eines Raums verstoßen (C13): D i = D i \ {(T, R) R roomp reset i } 4. deren Raum nicht über ausreichend Sitzplatzkapazitäten verfügt (C4): D i = D i \ {(T, R) seats R < eventneedcap i } 5. deren Raum nicht über die geforderten Ressourcen verfügt (C5): D i = D i \ {(T, R) res EventRes i : res / RoomRes R } 6. deren Raum über unerwünschte Ressourcen verfügt (C5): D i = D i \ {(T, R) res EventNotRes i : res RoomRes R } 7. zu deren Zeitfenster der Raum nicht verfügbar ist (C7):

35 4.3 Erweiterung der Backtracking-Suche 28 D i = D i \ {(T, R) T / RoomAvail R } 8. zu deren Zeitfenster mindestens einer der zugewiesenen Dozenten nicht verfügbar ist (C6): D i = D i \ {(T, R) L EventLec i : T F orbiddent L } Nachdem die Domänen in dieser Reihenfolge betrachtet wurden, werden nun folgende Situationen berücksichtigt: 9. Müssen die Veranstaltungen E i und E j gleichzeitig stattfinden (C8), so wird die Schnittmenge der Domänen D i und D j bezüglich T gebildet. Die Domänen werden damit wie folgt eingeschränkt: D i = D i \ {(T, R) (T, R ) D j : T T } und D j = D j \ {(T, R) (T, R ) D i : T T } Es werden also alle Tupel aus den beiden Domänen entfernt, die in nur einer der beiden Domänen enthalten sind, da es sonst nicht möglich wäre, diese Veranstaltungen zum gleichen Zeitfenster zu planen. Beispiel 4.2. E i und E j müssen gleichzeitig stattfinden. In den Domänen sind folgende Elemente enthalten: D i = { (T 1, R 1 ), D j = { (T 4, R 1 ), (T 2, R 3 ), (T 2, R 2 ), (T 2, R 2 ), (T 3, R 1 ), (T 3, R 1 ) } (T 4, R 4 ) } Nach Bildung der Schnittmenge bleiben folgende Elemente in den Domänen: D i = { (T 1, R 1 ), D j = { (T 4, R 1 ), (T 2, R 3 ), (T 2, R 2 ), (T 2, R 2 ), (T 3, R 1 ), (T 3, R 1 ) } (T 4, R 4 ) } Dies kann nach jeder Zuweisung einer Variablen erfolgen, ist jedoch nur sinnvoll, wenn sich eine der beiden Domänen verändert hat. Müssen die Veranstaltungen E i und E j gleichzeitig stattfinden (C8) und besteht für die Veranstaltung E i eine harte Vorplanung für ein Zeitfenster (C11), so wird durch 1. die Domäne D i bereits so eingeschränkt, dass diese nur noch Tupel enthält, die zum vorgeplanten Zeitfenster stattfindet. Durch die Bildung der Schnittmenge ergibt sich automatisch die Bindung der Veranstaltung E j, da durch Bildung der Schnittmenge für D j ebenfalls nur Tupel übrig bleiben, die dem für E i vorgeplanten Zeitfenster entsprechen. Beispiel 4.3. E i und E j müssen gleichzeitig stattfinden. Für E i besteht die harte Vorplanung für T 2. Nach Anwendung von 1. bis 8. sind in den Domänen folgende Elemente enthalten:

36 4.3 Erweiterung der Backtracking-Suche 29 D i = { (T 2, R 1 ), D j = { (T 4, R 1 ), (T 2, R 2 ) } (T 2, R 2 ), (T 3, R 1 ), (T 4, R 4 ) } Durch Anwendung von 9. bleiben in D j auch nur Elemente über, die T 2 enthalten: D i = { (T 2, R 1 ), D j = { (T 4, R 1 ), (T 2, R 2 ) } (T 2, R 2 ), (T 3, R 1 ), (T 4, R 4 ) } Müssen die Veranstaltungen E i und E j gleichzeitig stattfinden (C8) und besteht für die Veranstaltung E i eine Menge von ausgeschlossenen Zeitfenstern (C12), so wird durch 2. die Domäne D i bereits so eingeschränkt, dass diese nur noch Tupel enthält, die die nicht eines ausgeschlossenen Zeitfenster enthalten. Durch Anwendung der zuvor vorgestellten Strategie ergibt sich automatisch die Bindung der Veranstaltung E j, da durch Bildung der Schnittmenge für D j ebenfalls nur Tupel übrig bleiben, die keines der für E i ausgeschlossenen Zeitfenster enthalten. 10. Es wird nun die Situation betachtet, dass die Veranstaltung E j unmittelbar auf E i folgen soll (C9). So werden aus D j alle Tupel gestrichen, zu denen kein direkten Vorgänger in D i existiert. D j = D j \ {(T, R) (T, R ) D i : T + 1 T day T day T } Umgekehrt werden aus D i alle Elemente entfernt, zu denen kein direkter Nachfolger in D j existiert. D i = D i \ {(T, R) (T, R ) D j : T 1 T day T day T } Beispiel 4.4. Gegeben seien die Veranstaltungen E i und E j, wobei E j unmittelbar auf E i folgen muss. In diesem Beispiel sind die Elemente der Domänen nur durch Zeitfenster T dargestellt, da die Räume R nicht von Bedeutung sind.

37 4.3 Erweiterung der Backtracking-Suche 30 Bei harter Vorplanung von T für E i (C11) bleibt automatisch nur T + 1 für E j übrig, da durch 1. alle Zeitfenster außer T aus D i entfernt wurden. Beim Ausschluss des Zeitfensters T für E i (C12) werden automatisch alle Tupel mit T + 1 aus D j ausgeschlossen, da in Schritt 2. alle Tupel (T, R ) aus D i entfernt wurden mit T = T und somit kein (T, R ) D j existiert mit T = T + 1 day T = day T. Wegen den symmetrischen Operationen zwischen E i und E j gilt gleiches auch umgekehrt bei harter Vorplanung für E j und bei Auschluss von Zeitfenstern für E j. Der prinzipielle Ablauf der Funktion REMOVE-INCONSISTENT-VALUES ist durch Algorithmus 25 gezeigt. Wird ein Wert aus der Domäne einer Variablen entfernt, weil er gegen die Kriterien C8 und C9 verstößt, müssen diese Veränderungen an alle Variablen weitergegeben werden, die mit der Variablen in Beziehung stehen. Zu den Operationen REMOVE-OP9 und REMOVE-OP10 wird im Abschnitt ausführlich eingegangen. Im Folgenden werden die einzelnen Löschoperationen vorgestellt. Durch die Anwendung dieser Verfahren zum Entfernen von ungültigen Werten, wird die Suchraumgröße vorab von (rt) e auf e i=1 D i. Mit D i (rt) e gilt zwar weiterhin eine Komplexität von O((rt) e ), durch die Anwendung werden die Domänen jedoch erheblich reduziert. Algorithm 5 Remove inconsistent values: Operation 1 (REMOVE-OP1) 1: function REMOVE-OP1(E i Event) 2: for all (T, R) D i do 3: if T timeslotp rest i then 4: D i D i \(T, R) 5: end if 6: end for 7: end function Forward Checking während der Suche Auch während der Suche können ungültige Werte aus den Domänen entfernt werden. Diese Strategie wird als Forward Checking bezeichnet. Wird einer Variablen E i ein Wert zugewiesen, so wird geprüft, mit welchen noch nicht zugewiesenen Variablen diese durch ein Constraint in Beziehung steht. Auf Basis der getroffenen Zuweisung werden alle Werte aus den Wertebereichen aller noch nicht zugwiesenen Variablen entfernt, deren Zuweisung einen ungültigen Plan verursachen würde. Für

38 4.3 Erweiterung der Backtracking-Suche 31 Algorithm 6 Remove inconsistent values: Operation 2 (REMOVE-OP2) 1: function REMOVE-OP2(E i Event) 2: for all (T, R) D i do 3: if T F orbidden i then 4: D i D i \(T, R) 5: end if 6: end for 7: end function Algorithm 7 Remove inconsistent values: Operation 3 (REMOVE-OP3) 1: function REMOVE-OP3(E i Event) 2: for all (T, R) D i do 3: if R roomp reset i then 4: D i D i \(T, R) 5: end if 6: end for 7: end function Algorithm 8 Remove inconsistent values: Operation 4 (REMOVE-OP4) 1: function REMOVE-OP4(E i Event) 2: for all (T, R) D i do 3: if seats R < eventneedcap i then 4: D i D i \(T, R) 5: end if 6: end for 7: end function Algorithm 9 Remove inconsistent values: Operation 5 (REMOVE-OP5) 1: function REMOVE-OP5(E i Event) 2: for all (T, R) D i do 3: for all Y EventRes i do 4: if Y / RoomRes R then 5: D i D i \(T, R) 6: end if 7: end for 8: end for 9: end function

39 4.3 Erweiterung der Backtracking-Suche 32 Algorithm 10 Remove inconsistent values: Operation 6 (REMOVE-OP6) 1: function REMOVE-OP6(E i Event) 2: for all (T, R) D i do 3: for all Y EventNotRes i do 4: if Y RoomRes R then 5: D i D i \(T, R) 6: end if 7: end for 8: end for 9: end function Algorithm 11 Remove inconsistent values: Operation 7 (REMOVE-OP7) 1: function REMOVE-OP7(E i Event) 2: for all (T, R) D i do 3: if T / Available R then 4: D i D i \(T, R) 5: end if 6: end for 7: end function Algorithm 12 Remove inconsistent values: Operation 8 (REMOVE-OP8) 1: function REMOVE-OP8(E i Event) 2: for all (T, R) D i do 3: for all L EventLec i do 4: if T F orbiddent L then 5: D i D i \(T, R) 6: end if 7: end for 8: end for 9: end function zwei Veranstaltungen E i und E j ist dies ist der Fall, wenn folgende Situationen auftreten: 1. Wird für E i die Zuweisung (T i, R i ) getroffen, so können aus den Domänen der Veranstaltungen, die von einem zu E i gehörenden Dozenten gehalten werden, alle Werte entfernt werden, die T i enthalten, da ein Dozent zu einem Zeitfenster nur eine Veranstaltung halten kann (C1). Sei E i = (T i, R i ). L EventLec i E j {A A Events plan A = } : (L EventLec E sametimeas i j sametimeas j i) D E = D E \ {(T, R) T = T i } 2. Wird für E i die Zuweisung (T i, R i ) getroffen, so können aus den Domänen der Veranstaltungen, die der gleichen Studiengang-Semester-Kombination zugeord-

40 4.3 Erweiterung der Backtracking-Suche 33 net sind, alle Werte entfernt werden, die T i enthalten (falls die Anzahl an erlaubten Kollisionen für diese Kombination erreicht ist), da für eine Studiengang- Semester-Kombination nur eine bestimmte Anzahl an Überschneidungen von Veranstaltungen erlaubt ist (C2). Sei E i = (T i, R i ). E {A A Events plan A = } S EventSem E : (S EventSem i detectedcollisions S permittedcollisions S sametimeas i j sametimeas j i) D E = D E \ {(T, R) T = T i } detectedcollisions i liefert hier für die Studiengang-Semester-Kombination i die Anzahl der bisher festgestellten Überschneidungen von Veranstaltungen. 3. Wird für E i die Zuweisung (T i, R i ) getroffen, so kann aus den Domänen aller anderen nicht betrachteten Veranstaltungen das Tupel (T i, R i ) entfernt werden, da ein Raum pro Zeitfenster nicht doppelt belegt sein kann (C3). Sei E i = (T i, R i ). E {A A Events plan A = } : D E = D E \(T i, R i ) 4. Wird für E i die Zuweisung (T i, R i ) getroffen und ist für einen Dozenten D der Veranstaltung die Anzahl der von ihm zu haltenden Veranstaltungen an einem Tag begrenzt, so wird geprüft ob diese Anzahl erreicht ist. Ist diese erreicht, so werden alle Werte aus den Domänen der Veranstaltungen, die von D gehalten werden, entfernt, die ein Zeitfenster aufweisen, das am gleichen Tag wie T i stattfindet (C10). Sei E i = (T i, R i ). L EventLec i E {A A Events plan A = } : (maxevents L = countevents L,dayi maxevents L 0) (L EventLec E D E = D E \ {(T, R) day T = day Ti }) countevents L,day liefert hier die bisher festgehaltene Anzahl von Veranstaltungen für den Dozenten i am Tag day. 5. Müssen E i und E j gleichzeitig stattfinden und wird der Veranstaltung E i der Wert (T i, R i ) zugewiesen, so können aus D j alle Werte entfernt werden, deren Zeitfenster nicht T i entspricht (C8). Sei E i = (T i, R i ) und eventsamet imeas i = E j. D j = D j \ {(T, R) T T i } 6. Muss E i im direkten Anschluss an E j stattfinden und wird der Veranstaltung E i der Wert (T i, R i ) zugewiesen, so können aus D j alle Werte entfernt werden, deren Zeitfenster nicht unmittelbar T i vorausgeht (C9). Sei E i = (T i, R i ) und eventf ollowst o i = E j. D j = D j \ {(T, R) T T i 1 day T day Ti } oder falls E i = (T i, R i ) und eventf ollowst o j = E i

41 4.3 Erweiterung der Backtracking-Suche 34 D j = D j \ {(T, R) T T i + 1 day T day Ti } Es werden also alle Elemente aus der Domäne der Variablen E j entfernt, die durch die aktuelle Belegung von E i eine Inkonsistenz verursachen würden. Dazu wird der bisher entwickelte Algorithmus durch die Funktion FORWARD-CHECKING erweitert, welche die Anpassung der Wertebereiche durchführt (Algorithmus 13). Durch das Entfernen von ungültigen Werten aus den Domänen vor Beginn und während der Suche wird erreicht, dass die Wertebereiche der Variablen ausschließlich gültige Werte enthalten. Der Beweis dazu folgt in Abschnitt Dadurch, dass die Constraints, welche vor der Suche betrachtet werden unabhängig vom Zustand und damit unabhängig von getätigten Zuweisungen sind, müssen diese während der Suche nicht erneut betrachtet werden. Somit sind alle Constraints abgedeckt und die Wertebereiche der Variablen können ausschließlich gültige Werte enthalten. Wird im Suchbaum eine Variable betrachtet, so werden nun Inkonsistenzen nicht durch Test auf Einhaltung aller Constraints festgestellt, sondern beim Auftreten eines leeren Wertebereichs. Weist eine Variable einen leeren Wertebereich auf, so bedeutet dies, dass keine gültige Zuweisung eines Raums und eines Zeitfensters möglich ist. Forward Checking bietet einige Vorteile im Gegensatz zu einfachem Backtracking [1]. Da die Domänen nur gültige Werte enthalten, werden unter Umständen viele, sich wiederholende Konsistenzprüfungen erspart. Außerdem werden Pfade im Suchbaum, die zu keiner gültigen Lösung führen, früher erkannt. Das liegt daran, dass die Anzahl der Elemente der Domänen reduziert wird. Angenommen, es seien bereits Werte für die ersten zehn Variablen festgelegt und auf Basis dieses Zustands sei nun keine konsistente Belegung der 20. Variable möglich. Ein Forward Checking Algorithmus würde sofort eine Inkonsistenz feststellen, nämlich dadurch, dass die Domäne der Variable keine Elemente enthält. Ein einfacher Backtracking Algorithmus würde noch alle möglichen Belegungen ausprobieren, bevor er die Inkonsistenz erkennt und einen Rücksprung im Suchbaum durchführt. Durch die Anpassung der Wertebereiche wird die Anwendung von Heuristiken ermöglicht, die die Effizienz der Suche verbessern sollen. Dies kann für die Auswahl der als nächstes zu betrachtenden Variable hilfreich sein (siehe Abschnitt und Abschnitt 4.4.2). Die Algorithmen 14 bis 19 zeigen die Verfahren zur Anwendung der Operationen 1 bis 6 des Forward Checking. Diese Operationen bilden die Funktion FORWARD-CHECKING.

42 4.3 Erweiterung der Backtracking-Suche 35 Algorithm 13 Forward Checking Algorithmus 1: function BACKTRACKING-SEARCH(csp) 2: REMOVE-INCONSISTENT-VALUES(Event) 3: return RECURSIVE-BACKTRACKING({}, csp) 4: end function 5: function RECURSIVE-BACKTRACKING(timetable, csp) 6: if timetable is complete then 7: return timetable 8: end if 9: event an unassigned event 10: if some D i = {} then 11: return error 12: end if 13: UnassignedEvents {E i E i Event plan i = } 14: for all (T, R) D event do 15: timetable timetable plan event = (T, R) 16: D i : D i D i 17: FORWARD-CHECKING(event, U nassignedevents) 18: result RECURSIVE-BACKTRACKING(timetable, csp) 19: if result error then 20: return result 21: end if 22: timetable timetable\plan event 23: D i : D i D i 24: end for 25: return error 26: end function Algorithm 14 Anwendung von Operation 1 des Forward Checking (FC-OP1) 1: function FC-OP1(E a ) E a is the last assigned event 2: for all L EventLec a do 3: for all E i unassignedevents do 4: if L EventLec i (eventsametimeas a i) (eventsametimeas i a) then 5: for all (T i, R i ) D i do each value in D i 6: if T i = T a then same timeslot 7: D i D i \(T i, R i ) remove (T i, R i ) 8: end if 9: end for 10: end if 11: end for 12: end for 13: end function

43 4.3 Erweiterung der Backtracking-Suche 36 Algorithm 15 Anwendung von Operation 3 des Forward Checking (FC-OP3) 1: function FC-OP3(E a ) E a is the last assigned event 2: for all E i : plan i = do 3: for all (T i, R i ) D i do 4: if (T i, R i ) = (T a, R a ) then 5: D i D i \(T i, R i ) 6: end if 7: end for 8: end for 9: end function Algorithm 16 Anwendung von Operation 4 des Forward Checking (FC-OP4) 1: function FC-OP4(E a ) E a is the last assigned event 2: for all L EventLec a do 3: if maxevents L = countevents L,daya maxevents L 0 then 4: for all E i {E plan e = L EventLec E } do 5: for all (T i, R i ) D i do 6: if day Ti = day Ta then 7: D i D i \(T i, R i ) 8: end if 9: end for 10: end for 11: end if 12: end for 13: end function Algorithm 17 Anwendung von Operation 5 des Forward Checking (FC-OP5) 1: function FC-OP5(E a ) E a is the last assigned event 2: if (eventsametimeas a = i) (eventsametimeas i = a) then 3: intersection false 4: for all (T i, R i ) D i do 5: if T i = T p then 6: intersection true 7: break 8: end if 9: end for 10: if intersection = false then 11: D i D i \(T i, R i ) 12: end if 13: end if 14: end function

44 4.3 Erweiterung der Backtracking-Suche 37 Algorithm 18 Anwendung von Operation 2 des Forward Checking (FC-OP2) 1: function FC-OP2(E a ) E a is the last assigned event 2: for all S EventSem a do 3: if permittedcollisions S 0 then 4: collisions 0 5: for all E i : S EventSem i do 6: for all E j : (i j) (plan j ) (plan j = plan i ) (EventSem i EventSem j ) do 7: if E i or E j is not a excercise course or the events are assigned to at least one same semester then 8: collisions collisions + 1 9: end if 10: end for 11: end for 12: if collisions = permittedcollisions S then 13: for all E i : (EventSem a EventSem i ) (plan i = ) do 14: for all (T i, R i ) D i do 15: if T i = T a then 16: D i D i \(T i, R i ) 17: end if 18: end for 19: end for 20: end if 21: else 22: for all E i : (E i N Sem (E a )) (plan i = ) (sametimeas i a) (sametimeas a i) do 23: for all (T i, R i ) D i do 24: if T i = T a then 25: D i D i \(T i, R i ) 26: end if 27: end for 28: end for 29: end if 30: end for 31: end function

45 4.3 Erweiterung der Backtracking-Suche 38 Algorithm 19 Anwendung von Operation 6 des Forward Checking (FC-OP6) 1: function FC-OP6(E a ) E a is the last assigned event 2: if eventf ollowst o a = i then E i E a 3: intersection false 4: for all (T i, R i ) D i do 5: if T i = T a 1 day Ti = day Ta then 6: intersection true 7: break 8: end if 9: end for 10: if intersection = false then 11: D i D i \(T i, R i ) 12: end if 13: end if 14: if eventf ollowst o i = a then E a E i 15: intersection false 16: for all (T i, R i ) D i do 17: if T i = T a + 1 day Ti = day Ta then 18: intersection true 19: break 20: end if 21: end for 22: if intersection = false then 23: D i D i \(T i, R i ) 24: end if 25: end if 26: end function Ergänzung der Modelldaten Für den korrekten Ablauf des Backtracking Algorithmus, ist es erforderlich, die vorliegenden Modelldaten zu erweitern. Dazu wird zunächst folgende Definition getroffen: Definition 4.5. (Die Realtion ST ) Die Realtion ST ist eine Teilmenge des kartesischen Produkts Event 2 ST Event Event mit Event Event := {(E i, E j ) E i, E j Event} Es gilt (E i, E j ) ST, falls eventsametimeas i = j, also wenn E i und E j zur gleichen Stunden stattfinden müssen. Für einen gültigen Plan mit plan i = (T i, R i ) und plan j = (T j, R j ) muss also gelten, dass T i = T j. Für ST gelten folgende Eigenschaften. ST ist transitiv. Sie enthält damit alle Elemente der transitiven Hülle dieser Modell-Relation. Es gilt also

46 4.3 Erweiterung der Backtracking-Suche 39 E i, E j, E k Event : (E i, E j ) ST (E j, E k ) ST (E i, E k ) ST. ST ist symmetrisch. Es gilt also (E i, E j ) ST (E j, E i ) ST. Da die Quell- und Zielmenge der Relation identisch sind, wird ST als homogene Relation bezeichnet. Im folgenden kann für (E i, E j ) ST auch die Schreibweise E i ST E j verwendet werden. Um die Domänen bezüglich sametimeas stets konsistent zu halten, ist es nun erforderlich, dass die Eingabedaten um die Angabe der transitiven Werte ergänzt werden, da der Anwender die transitive Hülle nicht angeben muss. Macht der Anwender die Angaben (E i, E j ) ST und (E j, E k ) ST, so wird der Wert (E i, E j ) ST der Relation hinzugefügt. Wenn festgelegt ist, dass E i gleichzeitig mit E j stattfinden muss, so folgt daraus, dass E j auch gleichzeitig mit E i stattfinden muss. Die Modelldaten müssen also um den Wert (E j, E i ) ST ergänzt werden. Diese Relation kann durch einen Graphen G ST = (V, E) mit V = {1,..., e} dargestellt werden. Es existiert genau dann eine ungerichtete Kante zwischen zwei Knoten i und j, wenn (E i, E j ) ST. Dieser Graph enstpricht dem Constraint Graphen mit den Kanten type = ST. Beispiel 4.6. Graph für ST vor und nach Ergänzung der Modelldaten: Gegeben seien die Veranstaltungen E 1 bis E 5. Vor der Ergänzung der Modelldaten gilt ST = {(E 2, E 3 ), (E 3, E 4 ), (E 5, E 3 )}. Daraus ergibt sich folgender Graph G ST : Durch die Erweiterung wird ST um die symmetrischen und transitiven Werte erweitert. Daraus ergibt sich ST = {(E 2, E 3 ), (E 3, E 2 ), (E 3, E 4 ), (E 4, E 3 ), (E 5, E 3 ), (E 3, E 5 ), (E 2, E 4 ), (E 4, E 2 ), (E 2, E 5 ), (E 5, E 2 ), (E 4, E 5 ), (E 5, E 4 )} und der Graph

47 4.3 Erweiterung der Backtracking-Suche 40 Die neu hinzu gekommenen Kanten sind rot gekennzeichnet. Jeder Knoten E j, der bisher von E i über eine Folge von Knoten erreichbar war, ist nun dirket von E i aus mit nur einem Schritt erreichbar und somit direkt benachbart. Dieser Graph wird nun als Adjazenzmatrix dargestellt. Hierbei handelt es sich um eine boolesche e e-matrix A ST, für die gilt { true, falls {i, j} E = A ST ji = A ST ij false, sonst für alle i, j V. ST wird als nicht reflexiv betrachtet. Die Einträge A ST ij mit i = j enthalten also stets den Wert false. Da ST symmetrisch ist, handelt es sich um symmetrische Matrix. Für die Einträge A ST ij mit i, j V. und A ST ji gilt also stets A ST ij = A ST ji Beispiel 4.7. Adjazenzmatrix: Für den erweiterten Graphen aus Beispiel 4.6 ergibt sich folgende Matrix: Neben der Beziehung sametimeas wird die Beziehung f oollowst o genauer betrachtet. Definition 4.8. (Die Relation F T ) Die Realtion F T ist eine Teilmenge des kartesischen Produkts Event 2 F T Event Event mit Event Event := {(E i, E j ) E i, E j Event} Es gilt (E i, E j ) F T, falls followst o i = j, also wenn E i auf E j folgen muss. Für einen gültigen Plan mit plan i = T i, R i und plan j = T j, R j muss also gelten, dass T i = T j+1.

48 4.3 Erweiterung der Backtracking-Suche 41 Für die Relation F T sind im Gegensatz zu ST keine Ergänzungen der Modelldaten notwendig. Dies wird durch die Eigenschaften von F T gezeigt. Satz 4.9. Die Relation F T ist antitransitiv. Es gilt also E i, E j, E k Event : (E i, E j ) F T (E j, E k ) F T (E i, E k ) / F T Beweis. F T ist antitransitiv (Satz 4.9) zz: E i, E j, E k Event : (E i, E j ) F T (E j, E k ) F T (E i, E k ) / F T Da (E i, E j ) F T gilt followst o i = j. Also muss laut Definition gelten, dass T i = T } {{ j+1 mit plan } i = (T i, R i ) und plan j = (T j, R j ). 1 Da (E j, E k ) F T gilt followst o j = k. Also muss laut Definition gelten, dass T j = T } {{ k+1 mit plan } j = (T j, R j ) und plan k = (T k, R k ). 2 Angenommen, es gelte auch (E i, E k ) F T. Daraus folgt, dass T i = T } {{ k+1. } 3 Aus 1,2 und 3 ergibt sich folgende Aussage: (T k+1 = T j+1 T k+1 = T j ) (T k+1 = T j+1 = T j ) Es gilt jedoch T j T j+1 für j = 1..., t. Widerspruch Daraus folgt, dass (E i, E k ) / F T. Satz Die Relation F T ist asymmetrisch. Es gilt also E i, E j Event : (E i, E j ) F T (E j, E i ) / F T Beweis. F T ist asymmetrisch (Satz 4.10) zz: E i, E j Event : (E i, E j ) F T (E j, E i ) / F T Da (E i, E j ) F T gilt followst o i = j. Also muss laut Definition gelten, dass T i = T } {{ j+1 mit plan } i = (T i, R i ) und plan j = (T j, R j ). 1 Angenommen, es gelte auch (E j, E i ) F T. Daraus folgt, dass T j = T } {{ i+1. } 2 Aus 1 und 2 ergibt sich folgende Aussage: T i = T j+1 T i+1 = T j T i+1 = T j läßt sich auch schreiben als T i = T j 1. Nun gilt

49 4.3 Erweiterung der Backtracking-Suche 42 (T i = T j+1 T i = T j 1 ) (T i = T j+1 = T j 1 ) Es gilt jedoch T j+1 T j 1 für j = 1..., t. Widerspruch Daraus folgt, dass (E j, E i ) / F T. Satz Die Relation F T ist irreflexiv. Es gilt also Beweis. F T ist irreflexiv (Satz 4.11) zz: E i Event : (E i, E i ) / F T E i Event : (E i, E i ) / F T Angenommen, es gelte (E i, E i ) F T. Dann gilt followst o i = i. Also muss laut Definition gelten, dass T i = T i+1 mit plan i = (T i, R i ). Es gilt jedoch T i T i+1 für i = 1..., t. Widerspruch Daraus folgt, dass (E i, E i ) / F T. Der Graph G F T enstpricht dem Constraint Graphen mit den Kanten type = F T. Aus den Eigenschaften ergibt sich, dass der Graph G F T = (V, E) mit V = {1,..., E} zur Darstellung keine Schlingen (F T ist irreflexiv) enthält. Da ein Element E i, E j aufgrund der Mengendarstellung höchstens einmal in F T vorkommt, enthält G F T keine Mehrfachkanten. Außerdem enthält G F T keine Zyklen. Beweis. G F T enthält keine Zyklen zz: Es existiert kein Weg W in G F T mit W = (E i,..., E j,..., E k,..., E i ). Angenommen, es gäbe einen solchen Weg W = (E i,..., E j,..., E k,..., E i ). Angenommen, W habe die Länge 1. Dann existiert ein E i mit (E i, E i ) F T. Also wäre F T nicht irreflexiv. Widerspruch Angenommen, W habe die Länge 2. Dann existieren E i und E j mit (E i, E j ) F T und (E j, E i ) F T. Also wäre F T nicht antisymmetrisch. Widerspruch Angenommen, W habe die Länge 3. Dann existieren E i, E j und E k mit (E i, E j ) F T, (E j, E i ) F T und (E i, E k ) F T. Also wäre F T nicht antitransitiv. Widerspruch Angenommen, W habe eine Länge >3. Dann gilt T i > T j und T j > T k und T k > T i. Daraus folgt wiederum

50 4.3 Erweiterung der Backtracking-Suche 43 Es gilt jedoch T i = T i. T i > T j > T k > T i Widerspruch Es existiert also kein Weg W = (E i,..., E j,..., E k,..., E i ). Da festgelegt ist, dass in F T für ein E Event nur ein Vorgängerelement festgelegt werden kann, gilt auch, dass der Ausgangsgrad d (v) für ein v V stets 1 ist. F T Für den Eingangsgrad d + (v) gilt 1 d+ (v) e 1 (e 1, da F T irreflexiv). F T F T Beispiel Graph zur Darstellung von F T : F T sei gegeben durch F T = {(E 1, E 4 ), (E 2, E 4 ), (E 3, E 4 )}. Die Veranstaltungen E 1, E 2 und E 3 müssen also im Anschluss an E 4 stattfinden. Daraus ergibt sich folgender Graph: Analog zu ST wird der Graph zur Darstellung von F T als Adjazenzmatrix repräsentiert. Bei dieser Matrix handelt es sich ebenfalls um eine boolesche e e- Matrix A F T, für die gilt { true, falls (i, j) E A F ij T = false, sonst. für alle i, j V. Da F T irreflexiv ist, gilt für A F ij T = false für i = j. Außerdem ist F T antisymmetrisch. Daraus folgt, dass A F ij T A F ji T für alle i, j V. Abbildung 4.2 zeigt den allgemeinen Aufbau der Matrix. E i1 E i2 E i3... E ie E i E i E i E ie Abbildung 4.2. Allgemeine Struktur der Matrix A F T

51 4.3 Erweiterung der Backtracking-Suche Wiederherstellen eines Zustands nach Rücksprung Tritt während der Backtracking Suche ein inkonsistenter Zustand auf, so probiert der Algorithmus eine andere Zuweisung für die zuletzt betrachtete Variable. Sind alle möglichen Belegungen für diese Variable bereits betrachtet, so springt er zur letzten betrachteten Variable und probiert es mit einer anderen Zuweisung für diese. Bei einem solchen Rücksprung ist zu beachten, dass die Werte der Domänen, aus denen bei der Betrachtung der letzten Variablen Elemente entfernt wurden, wieder hergestellt werden müssen. Beispiel Rücksprung: Gegeben sind drei Veranstaltungen E 1, E 2 und E 3. Vor Begin der Suche wurden deren Wertebereiche D 1, D 2 und D 3 bereits eingeschränkt. Als Wurzelknoten wurde E 1 ausgewählt. Damit ergibt sich folgender Anfangszustand. Nun wird E 1 das Tupel (T 1, R 1 ) zugewiesen. Durch diese Zuweisung wird aus den Domänen D 1 und D 2 der Wert entfernt (T 1, R 1 ). Als nächstes wird E 2 betrachtet und der Wert (T 2, R 2 ) ausgewählt. Diese Zuweisung verursucht die Entfernung von (T 2, R 2 ) aus D 3. Nun ist E 3 zu betrachten. Da D 3 = wird eine Inkonsistenz festgestellt. Die Zuweisung plan 2 = (T 2, R 2 ) wird rückgängig gemacht und E 2 erneut betrachtet.

52 4.3 Erweiterung der Backtracking-Suche 45 Nun müssen aber die Elemente aus D 3, die durch die Zuweisung von plan 2 entfernt wurden wieder hergestellt werden. Die Speicherung jedes Zustands würde einen enormen Speicheraufwand benötigen. So müßten bei jeder Zuweisung eines Wertes zu einer Variablen die Domänen aller Variablen gepeichert werden, um bei einem Rücksprung den Zustand wiederherzustellen. Anstatt ein Element zu löschen, wird dieses als gelöscht markiert. Dabei wird der Zustand festgehalten, indem es gelöscht wurde. Wird nun ein Rücksprung durchgeführt, werden alle Elemente, die in diesem Zustand gelöscht wurden, wieder hergestellt. Daraus ergibt sich Algorithmus 21. Die Funktion FORWARD-CHECKING erhält nun neben der gerade betrachteten Veranstaltung und der Menge der noch nicht zugewiesenen Veranstaltungen zusätzlich die Makierung label als Parameter. Dieser Parameter dient zur Markierung des Zustands. Soll ein Element gelöscht werden, weil es eine Inkonsistenz versuchen würde, so erhält dieses Element label als Markierung und wird von nun an nicht mehr betrachtet. Anhand von FC-OP1 wird exemplarisch gezeigt, wie die Operationen des Forward Checkings abgeändert werden, um das Löschen bzw. Markieren von Werten durchzuführen. Diese Operation ist Teil der Funktion FORWARD-CHECKING, die unter anderem den Parameter label hat, der den aktuellen Zustand repräsentiert. Wird ein Wert entfernt, so erhält dieser die Markierung label. Die Markierung des Wertes (T, R) wird mit Label((T, R)) angegeben Kantenkonsistenz In diesem Abschitt wird der Begriff der Kantenkonsistenz erläutert. Die Kantenkonsistenz beschreibt die Konsistenthaltung von benachbarten Knoten im Constraint-Graphen. Dabei werden getroffene Einschränkungen für einen Knoten an alle benachbarten Knoten weitergegeben. Dazu werden Algorithmen entworfen, die die Einhaltung der Kantenkonsistenz gewährleisten.

53 4.3 Erweiterung der Backtracking-Suche 46 Algorithm 20 Anwendung von FC-OP1 des Forward Checking mit Markieren des zu löschenden Elements 1: for all E i unassignedevents do 2: for L EventLecturer event do 3: if L EventLec i then 4: for all (T i, R i ) D i do 5: if T i = T event then 6: p label = label label the value as removed 7: end if 8: end for 9: end if 10: end for 11: end for Allgemeine Erläuterung Bei den Constraints C8 (zwei Veranstaltungen müssen gleichzeitig statt finden) und C9 (zwei Veranstaltungen müssen zu zwei aufeinander folgenden Stunden statt finden) handelt es sich um binäre Constraints. Sie stellen also eine Einschränkung zwischen zwei Veranstaltungen dar. Ist eine Veranstaltung E i über eines dieser Constraints im Graphen mit E j verbunden und ändert sich der Wertebereich von E i, so müssen diese Änderungen an E j weitergegeben werden. E j wiederum kann mit einer weiteren Veranstaltung E k in Verbindung stehen. Also müssen die Veränderungen, die von E i an E j weitergegeben wurden nun auch von E j an E k übergeben werden. Mit diesem Konzept der Weitergabe von Veränderungen wird die Kantenkonsistenz gewährleistet. Dies ist bei der Anwendung von Forward Checking zwingend erforderlich, um ungültige Werte aus den Domänen zu entfernen. Die Überprüfung der Kantenkonsistenz findet als Verarbeitungssschritt vor dem Beginn des Suchprozesses und als Weitergabeschritt nach jeder Zuweisung während der Suche statt. Dieser Prozess muss wiederholt angewendet werden, bis keine weiteren Inkonsistenzen verbleiben. Beispiel 4.14 verdeutlicht die Notwendigkeit der Einhaltung der Kantenkonsistenz. Beispiel Kantenkonsistenz: Angenommmen, die Veranstaltungen E 1 bis E 3 müssen gleichzeitig stattfinden. Es ist festgelegt, dass E 1 und E 2 sowie E 2 und E 3 gleichzeitig stattfinden müssen. Also müssen auch E 1 und E 3 gleichzeitig stattfinden. Nun wird vor Beginn der Suche die Funktion REMOVE-INCONSISTENT-VALUES aufgerufen. Nach Anwendung REMOVE-OP1 bis REMOVE-OP8 sehen die Domänen der Variablen wie folgt aus. D 1 = { (T 2, ), (T 3, ), (T 4, ) } D 2 = { (T 1, ), (T 3, ), (T 4, ), (T 5, ) } D 3 = { (T 4, ), (T 5, ) }

54 4.3 Erweiterung der Backtracking-Suche 47 Algorithm 21 Forward Checking mit Rücksprungmarkierung 1: function BACKTRACKING-SEARCH(csp) 2: REMOVE-INCONSISTENT-VALUES(Event) 3: return RECURSIVE-BACKTRACKING({}, csp, 1) 4: end function 5: function RECURSIVE-BACKTRACKING(timetable, csp, label) 6: if timetable is complete then 7: return timetable 8: end if 9: event an unassigned event 10: if any D i = {} then 11: return error 12: end if 13: UnassignedEvents {E i E i Event plan i = } 14: for all (T, R) : (T, R) D event Label((T, R)) = 0 do 15: timetable timetable plan event = (T, R) 16: FORWARD-CHECKING(event, U nassignedevents, label) 17: result RECURSIVE-BACKTRACKING(timetable, csp, label + 1) 18: if result error then 19: return result 20: end if 21: timetable timetable\plan event 22: for all D i do 23: for all (T, R) D i do 24: if Label((T, R)) = label then 25: label (T, R) as not removed Label((T, R)) 0 26: end if 27: end for 28: end for 29: end for 30: return error 31: end function

55 4.3 Erweiterung der Backtracking-Suche 48 Die Räume R der Tupel (T, R) sind bei dieser Prüfung nicht von Bedeutung und es wird daher aus Gründen der Übersichtlichkeit auf deren Darstellung verzichtet. Zunächst werden die Wertebereiche D 2 und D 3 betrachtet. Durch Bildung der Schnittmenge werden aus D 2 alle Werte (T, R) entfernt, für die kein (T, R ) in D 3 mit T = T existieren und umgekehrt. D 1 = { (T 2, ), (T 3, ), (T 4, ) } D 2 = { (T 1, ), (T 3, ), (T 4, ), (T 5, ) } D 3 = { (T 4, ), (T 5, ) } Nun werden D 1 und D 2 betrachtet. D 1 = { (T 2, ), (T 3, ), (T 4, ) } D 2 = { (T 1, ), (T 3, ), (T 4, ), (T 5, ) } D 3 = { (T 4, ), (T 5, ) } Nachdem D 1 und D 2 verglichen wurden, müssen nun D 2 und D 3 erneut betrachtet werden, da (T 5, ) D 2 und (T 5, ) / D 3 und (T 5, ) / D 1. Es werden also erneut D 2 und D 3 betrachtet. D 1 = { (T 2, ), (T 3, ), (T 4, ) } D 2 = { (T 1, ), (T 3, ), (T 4, ), (T 5, ) } D 3 = { (T 4, ), (T 5, ) } Anschließend werden keine Werte gelöscht und es müssen daher keine weiteren Betrachtungen hinsichtlich dieses Kriterium vorgenommen werden. Das gleiche Prinzip wird beim Löschen von inkonsistenten Werten im Rahmen des Forward Checking angewand. Lediglich mit dem Unterschied, dass die Werte als gelöscht markiert und nicht tatsächlich aus den Domänen entfernt werden. Transitive Beziehungen in ST Die Gewährleistung der Kantenkonsistenz für Veranstaltungen, die zur gleichen Stunde stattfinden müssen, erfordert ein zusätzliche Betrachtung. Im Rahmen des Forward Checking, werden durch FC-OP2 nach der Zuweisung alle Werte aus den Domänen der noch nicht zugwiesenen Veranstaltungen entfernt, denen ebenfalls mindestens eines der Semester der gerade zugewiesenen Veranstaltung zugeordnet ist, die das Zeitfenster des zugewiesenen Wertes enthalten. Hierbei gilt jedoch die Ausnahme, dass dies nicht für Veranstaltungen durchgeführt wird, die gleichzeitig stattfinden müssen. Die Zuweisung des gleichen Zeitfensters für zwei solcher Veranstaltungen soll also für eine Semester-Studiengang-Kombination nicht als Kollision gewertet werden. Hierbei tritt jedoch das Problem auf, dass bei einer Beziehung zwischen mehreren Veranstaltungen, also wenn mindestens drei Veranstaltungen gleichzeitig stattfinden müssen, transtitive Beziehungen nicht erkannt werden. Dies hat zur Folge, dass Werte aus Domänen von Veranstaltungen

56 4.3 Erweiterung der Backtracking-Suche 49 gelöscht werden, obwohl diese gleichzeitig stattfinden müssen. Daraus folgt, dass kein gültiger Plan gefunden werden kann, da die Domänen kein Tupel aufweisen die das gleiche Zeitfenster enthalten. Dies liegt daran, dass der Anwender zwar die Angaben (E i, E j ) ST und (E j, E k ) ST macht, aber nicht die Angabe (E i, E k ) ST. Beispiel Transitive Beziehungen zwischen Veranstaltungen: Es ist festgelegt, dass (E 1, E 2 ) ST und (E 2, E 3 ) ST. Es wurde bisher keiner der Veranstaltungen ein Wert zugweisen. Ihnen ist ein gleiches Semester zugeordnet. Es gilt also S Semester : S EventSem 1, EventSem 2, EventSem 3. Damit ist die Voraussetzung zur Anwendung von FC-OP2 des Forward Checking erfüllt und wird nach Zuweisung einer der Veranstaltungen auf die jeweils anderen Veranstaltungen angewand. Nun wird für Veranstaltung E 1 die Zuweisung plan 1 = (T 1, R 1 ) getroffen. Beim Forward Checking wird nicht erkannt, dass E 1 und E 3 gleichzeitig stattfinden müssen, da dies nicht expliziet angegeben wurde und durch FC-OP2 werden alle Werte (T, R ) D 3 entfernt für die T = T 1 gilt. Damit gilt (T, R ) D 3 : T = T 1 und es kann kein gültiger Plan gefunden werden. Damit ein gültiger Plan mit T 1 = T 2 = T 3 gefunden werden kann, muss die transitive Beziehung (E 1, E 3 ) ST aufgedeckt und festgehalten werden. Da der Anwender die Angbabe (E 1, E 3 ) ST nicht machen muss, ist es erforderlich, dass das System die Relation ST um diese notwendige Angabe erweitert. Der Constraint Graph muss um alle indirekt erreichbaren Paare erweitert werden. Ist ein Knoten E j von E i aus über den Weg W = (E i,..., E j ) erreichbar, so wird eine neue Kante {E i, E j } hinzugefügt, also E = E {E i, E j }. Der Algorithmus von Warshall [11] berechnet einen Graphen G + ST = (V, E+ ), der genau dann eine Kante {E i, E j } enthält, wenn es in G einen Weg von E i nach E j gibt. G + bildet also die transitive Hülle des Graphen G ST. Durch den Algorithmus von Warshall (siehe Algorithmus 22) werden in jedem Schritt neue Kanten hinzu genommen. In Schritt k werden Kanten hinzu genommen, wenn sich zwischen den Kanten i und j ein Weg bilden läßt, der über den Knoten k führt (d.h. es existieren die Kanten {i, k} und {k, j}). Die Funktion BUILT- TRANSITIVE-RELATIONS-ST wird in den Algorithmus eingebunden und noch vor dem Entfernen von ungültigen Werten vor Begin der Suche ausgeführt (siehe Algorithmus 23 Zeile 2). Die benötigten Informationen über den Graphen G ST werden dem Algorithmus in Form der Adjazenzmatrix A ST zur Verfügung gestellt. Die Anwendung dieser Stragtegie ist nur für den Graphen G ST notwendig. Aufgrund der Antitransitivität von F T ist dies für G F T nicht erforderlich. Gewähleistung der Kantenkonsistenz Um die Kantenkonsistenz sicherzustellen, müssen die beiden Relationen ST und F T zusammengefasst werden. Diese ist notwendig, da ein E Event sowohl Teil

57 4.3 Erweiterung der Backtracking-Suche 50 Algorithm 22 Algorithmus von Warshall 1: function BUILT-TRANSITIVE-RELATIONS-ST(A ST ) 2: n e 3: for k = 1,...,n do 4: for i = 1,...,n do 5: for j = 1,...,n do 6: if {i, k} E and {k, j} E then A ST ik = 1 and AST kj = 1 7: create the edge {i, j} A ST ij 1 8: end if 9: end for 10: end for 11: end for 12: end function der Relation ST als auch F T sein kann. Es kann gelten, dass (E, E i ) ST und (E, E j ) F T bzw. (E j, E) F T für 1 i, j e. Würden diese beiden Relationen getrennt betrachtet, so wird eine Veränderung des Wertebereichs nicht weitergeben, wenn eine Veranstaltung sowohl in ST als auch in F T enthalten ist. Dazu werden die Graphen G ST und G F T zum Graphen G zusammengefasst. Beispiel Beziehung zwischen ST und F T : Gegeben seinen die Veranstaltungen E 1 bis E 4. ST und F T seien gegeben durch ST = {(E 1, E 3 )} und F T = {(E 1, E 2 ), (E 3, E 4 )}. Wird jeder Graph seperat betrachtet ergeben diese sich wie folgt: Es fällt auf, dass die Veranstaltungen E 1 und E 3 in ST und F T enthalten sind. Angenommen, die Kantenkonsistenz würde zunächst nur für G ST hergestellt. Im Anschluss finde die Prüfung für G F T statt. Werden im Rahmen der Prüfung für F T Änderungen am Wertebereich D 1 bzw. D 3 vorgenommen, so werden diese nicht mehr an D 3 bzw. D 1 weitergegeben, da die Knoten E 1 und E 3 in G F T nicht benachbart sind. Daher werden die Graphen G ST und G F T zum Graphen G zusamemengefasst.

58 4.3 Erweiterung der Backtracking-Suche 51 Algorithm 23 Forward Checking mit Ergänzung der Modelldaten 1: function BACKTRACKING-SEARCH(csp) 2: BUILT-TRANSITIVE-RELATIONS-ST(G ST ) 3: REMOVE-INCONSISTENT-VALUES(Event) 4: return RECURSIVE-BACKTRACKING({}, csp, 1) 5: end function 6: function RECURSIVE-BACKTRACKING(timetable, csp, label) 7: if timetable is complete then 8: return timetable 9: end if 10: event an unassigned event 11: if any D i = {} then 12: return error 13: end if 14: UnassignedEvents {E i E i Event plan i = } 15: for all (T, R) : (T, R) D event Label((T, R)) = 0 do 16: timetable timetable plan event = (T, R) 17: FORWARD-CHECKING(event, U nassignedevents, label) 18: result RECURSIVE-BACKTRACKING(timetable, csp, label + 1) 19: if result error then 20: return result 21: end if 22: timetable timetable\plan event 23: for all D i do 24: for all (T, R) D i do 25: if Label((T, R)) = label then 26: label (T, R) as not removed Label((T, R)) 0 27: end if 28: end for 29: end for 30: end for 31: return error 32: end function

59 4.3 Erweiterung der Backtracking-Suche 52 Die Kanten der Relation ST sind gestrichelt dargestellt, die Kanten aus F T als durchgehende Kanten. Der Graph G bildet genau die Nachbarschaft jeder Variablen E i mit N T ype (E i ) mit T ype = ST, F T. Wird nun die Domäne einer Veranstaltung E verändert, werden alle Veranstaltungen E i N ST (E) oder E i N F T (E) erneut betrachtet. Dieser Prozess muss solange wiederholt werden, bis keine weiteren Inkonsistenzen auftreten. Dies geschieht deshalb, da durch das Entfernen eines Wertes aus einer Domäne eine neue Inkonsistenz durch Variablen auftreten kann, die mit der betrachteten Variablen in Beziehung stehen. Ein häufig verwendeter Algorithmus zur Herstellung der Kantenkonsistenz ist der AC-3 1 Algorithmus von Mackworth [5]. Der Kantenkonsistenz Algorithmus AC-3 bildet hiermit die noch nicht betrachteten Funktionen REMOVE-OP9 und REMOVE-OP10 der Funktion REMOVE-INCONSISTENT-VALUES 25. Außerdem wird AC-3 nun auch für Forward Checking verwendet, also in der Funktion FORWARD-CHECKING 26. Laufzeitanalyse für AC-3 Angenommen, es gilt (E i, E j ) ST für alle 1 i e 1 und j = i + 1. Dies bedeutet, dass alle Veranstaltungen gleichzeitig stattfinden sollen. Nachdem die transitive Hülle für G ST gebildet wurde, sind alle Knoten durch eine ungerichtete Kante miteinander verbunden und es entsteht der vollständige Graph G + ST. In einem vollständigen Graphen ist die Anzahl der Kanten E = ( ) n 2 = n(n 1). Da 2 für alle 1 i e 1 und j = i + 1 gilt, dass (E i, E j ) ST, ist F T =. Beim Graphen G handelt es sich also um einen vollständigen Graphen. G enthält also maximal e2 e-viele Kanten. 2 Jede dieser Kanten (E i, E j ) kann maximal (r t) in die Queue eingefügt werden, da maximal (r t)-viele Elemente aus D j entfernt werden. Die Überprüfung der Constraints C8 und C9 hat jeweils den Aufwand 2(r t) 2, da für eine Kante (E i, E j ) die Schnittmenge zwischen D i und D j gebildet wird. 1 Die Bezeichnung AC-3 wurde vom Entwickler verwendet, da es sich hierbei um die dritte von ihm in einer Arbeit entwickelte Version eines Arc Consistency Algorithmus handelt.

60 4.3 Erweiterung der Backtracking-Suche 53 Algorithm 24 Algorithmus AC-3 für die Kantenkonsistenz 1: function AC-3(csp) 2: queue ST F T 3: while queue is not empty do 4: (E i, E j ) REMOVE-FIRST(queue) 5: if REMOVE-INCONSISTENT-VALUES-ST-FT(E i, E j ) then 6: for all E k N ST,F T (E i ) do 7: add (E k, E i ) to queue 8: end for 9: end if 10: end while 11: end function 12: function REMOVE-INCONSISTENT-VALUES-ST-FT(E i, E j ) 13: removed f alse 14: for all (T, R) D i do 15: if no (T, R ) D j allows to satisfy C8/C9 between E i and E j then 16: delete (T, R) from D i 17: removed true 18: end if 19: end for 20: return removed 21: end function Algorithm 25 Remove inconsistent values before start of search (REMOVE- INCONSISTENT-VALUES) 1: function REMOVE-INCONSISTENT-VALUES(Event) 2: for all E i Event do 3: if E i has timeslot preset then 4: REMOVE-OP1(E i ) 5: end if 6: if E i has forbidden timeslots then 7: REMOVE-OP2(E i ) 8: end if 9: if E i has room preset then 10: REMOVE-OP3(E i ) 11: end if 12: REMOVE-OP4(E i ) 13:... 14: REMOVE-OP8(E i ) 15: 16: AC-3(csp) 17: end for 18: end function

61 4.3 Erweiterung der Backtracking-Suche 54 Algorithm 26 Durchführung des Forward-Checking (FORWARD-CHECKING) 1: function FORWARD-CHECKING(Event,U nassignedevents) 2: for all E i UnassignedEvents do 3: perform FC-OP1(Event) - FC-OP6(Event) 4: AC-3(csp) 5: end for 6: end function Der Gesamtaufwand für AC-3 liegt also bei e 2 e 2 rt 2(rt) 2. Daraus folgt eine Laufzeit in O(e 2 (rt) 3 ) Korrektheitsbeweis Es wird gezeigt, dass die Domänen aller Variablen während des Ablaufs von Algorithmus 13 stets gültige Werte enthalten. Dies bedeutet nicht, dass kein inkonsistenter Zustand auftreten kann. Dies ist nämlich dann der Fall, wenn ein Wertebereich keine Elemente enthält. Die Zuweisung eines Werts aus einem Wertebereich ist jedoch für den aktuellen Zustand konsistent. Eine Übersicht darüber, welche Constraints vor Suchbegin und welche während der Suche geprüft werden, ist in Abbildung 4.3 dargestellt. Abbildung 4.3. Abdeckung der Constraints

62 4.3 Erweiterung der Backtracking-Suche 55 Beweis. Der beschriebene Algorithmus liefert stets konsistente Zustände. Die Veranstaltungen sind gegeben durch die Menge Event = {E 1,..., E e }. Ein Zustand ist die aktuelle (Teil-) Zuweisung der Variablen. Eine solcher Zustand wird repräsentiert durch plan = {plan 1,..., plan e }, wobei es sich bei plan i um die Zuweisung für Veranstaltung E i handelt. Es gilt { (Ti, R plan i = i ), falls eine Zuweisung für E i existiert, sonst. Wie bereits definiert, ist ein Zustand konsistent, wenn die aktuelle Belegung der Variablen gegen keines der definierten Constraints verstößt. Der Zustand plan = {,..., } ist stets konsistent. z.z.: Sei die Belegung plan = {plan i1, plan i2,..., plan ik,,..., } für 0 k < e ein konsistenter Zustand. Dann ist auch die Zuweisung plan (plan ik+1 ) durch Algorithmus 13 stets konsistent. C1 Angenommen, es läge eine Verletzung von C1 vor. Dann existiert laut Definition ein i und j mit 1 i j e und T i = T j, so dass EventLec i EventLec j. Angenommen, die Verletzung von C1 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es existiert ein m k+1 mit T im = T ik+1 EventLec im EventLec ik+1. } {{ } es ex.l EventLec im EventLec ik+1 Bei der Zuweisung plan im = (T im, R im ) war plan ik+1 =. Also wurde durch FC-OP1 die Operation D ik+1 = D ik+1 \ {(T, R) T = T im } ausgeführt. Wegen T im = T ik+1 ist (T ik+1, R ik+1 ) / D ik+1. Widerspruch C2 Angenommen, es läge eine Verletzung von C2 vor. Dann existiert laut Definition ein i und j mit 1 i j e und T i = T j und eventgrp i = eventgrp j, so dass permittedcollissions eventgrpi )detectedcollissions eventgrpj. Angenommen, die Verletzung von C2 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es existiert ein m k+1 mit T im = T ik+1 EventSem im EventSem ik+1 } {{ } es ex.s EventSem im EventSem ik+1 permittedcollissions EventSemim detectedcollissions EventSemik+1. Bei der Zuweisung plan im = (T im, R im ) war plan ik+1 = und es galt permitted- Collissions EventSemim detectedcollissions EventSemik+1. Also wurde durch FC-OP2 die Operation D ik+1 = D ik+1 \ {(T, R) T = T im } ausgeführt.

63 4.3 Erweiterung der Backtracking-Suche 56 Wegen T im = T ik+1 ist (T ik+1, R ik+1 ) / D ik+1. C3 Angenommen, es läge eine Verletzung von C3 vor. Dann existiert laut Definition ein i und j mit 1 i j e und T i = T j und R i = R j. Angenommen, die Verletzung von C3 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es existiert ein m k + 1 mit T im = T ik+1 R im = R ik+1. Bei der Zuweisung plan im = (T im, R im ) war plan ik+1 =. Also wurde durch FC-OP3 die Operation D ik+1 = D ik+1 \(T im, R im ) ausgeführt. Wegen T im = T ik+1 und R im = R ik+1 ist (T ik+1, R ik+1 ) / D ik+1. C4 Angenommen, es läge eine Verletzung von C4 vor. Dann existiert laut Definition ein i mit 1 i e und roomcap i < eventneedcap i. Angenommen, die Verletzung von C4 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es gilt roomcap ik+1 < eventneedcap ik+1. Vor Suchbegin wurde durch REMOVE-OP3 die Operation D ik+1 = D ik+1 \ {(T, R) seats R < eventneedcapi k+1 } ausgeführt. Daher ist (T ik+1, R ik+1 ) / D ik+1. C5 Angenommen, es läge eine Verletzung von C5 vor. Dann existiert laut Definition ein i mit 1 i e, so dass Y EventRes i : Y / RoomRes i oder EventNotRes i RoomRes Ri. Angenommen, die Verletzung von C5 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es Y EventRes ik+1 : Y / RoomRes Rik+1 oder EventNotRes ik+1 RoomRes Rik+1. Vor Suchbegin wurden durch REMOVE-OP5 und REMOVE-OP6 die Operationen D ik+1 = D ik+1 \ {(T, R) Y Event Res ik+1 : Y / RoomRes Rik+1 und } } D ik+1 = D ik+1 \ {(T, R) Y EventNotRes ik+i : Y RoomRes Rik+1 ausgeführt. Daher ist (T ik+1, R ik+1 ) / D ik+1. C6 Angenommen, es läge eine Verletzung von C6 vor. Dann existiert laut Definition ein i mit 1 i e und ein L EventLec i, so dass T i unwantedt L. Angenommen, die Verletzung von C6 erfolge durch die Zuweisung plan ik+1 =

64 4.3 Erweiterung der Backtracking-Suche 57 (T ik+1, R ik+1 ). D.h es gilt L EventLec ik+1 und T ik+1 unwantedt L. Vor Suchbegin wurde durch REMOVE-OP8 die Operation D ik+1 = D ik+1 \ {(T, R) L Event Lec ik+1 : T F orbiddent L } ausgeführt. Daher ist (T ik+1, R ik+1 ) / D ik+1. C7 Angenommen, es läge eine Verletzung von C7 vor. Dann existiert laut Definition ein i mit 1 i e und ein T i / RoomAvail Ri. Angenommen, die Verletzung von C7 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es gilt T ik+1 / RoomAvail Rik+1. Vor Suchbegin wurde durch REMOVE-OP7 die Operation D ik+1 = D ik+1 \ { (T, R) T ik+1 / Room Avail Rik+1 } ausgeführt. Daher ist (T ik+1, R ik+1 ) / D ik+1. C8 Angenommen, es läge eine Verletzung von C8 vor. Dann existieren laut Definition ein i und j mit 1 i j e und eventsamet imeas i = j und T i T j. Angenommen, die Verletzung von C8 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es existiert ein m k + 1 mit eventsamet imeas ik+1 = i m T ik+1 T im. Vor Suchbegin wurden die Operationen D im = D im \ { (T, R) (T, R ) D jk+1 : T T } und D jk+1 = D jk+1 \ {(T, R) (T, R ) D im : T T } ausgeführt. Bei der Zuweisung plan im = (T im, R im ) war plan ik+1 =. Also wurde durch FC-OP5 die Operation D jk+1 = D jk+1 \ {(T, R) T T im } ausgeführt. Außerdem wird die Veränderung von D jk+1 durch AC-3 an alle weiteren Domänen weitergegeben. Wegen T im T ik+1 ist (T ik+1, R ik+1 ) / D ik+1. C9 Angenommen, es läge eine Verletzung von C9 vor. Dann existiert laut Definition ein i mit 1 i e und eventf ollowst o i = j und T i T j +1. Angenommen, die Verletzung von C9 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ).

65 4.3 Erweiterung der Backtracking-Suche 58 D.h es existiert ein m k + 1 mit eventf ollowst o ik+1 = i m T ik+1 T im + 1. Vor Suchbegin wurden die Operationen D ik+1 = D ik+1 \ {(T, R) (T, R ) D im : T + 1 T day T day T } und D im = D im \ { (T, R) (T, R ) D ik+1 : T 1 T day T day T } ausgeführt. Bei der Zuweisung plan im = (T im, R im ) war plan ik+1 =. Also wurde durch FC-OP6 die Operation D jk+1 = D jk+1 \ {(T, R) T T im + 1} ausgeführt. Außerdem wird die Veränderung von D jk+1 durch AC-3 an alle weiteren Domänen weitergegeben. Wegen T ik+1 T im + 1 ist (T ik+1, R ik+1 ) / D ik+1. C10 Angenommen, es läge eine Verletzung von C10 vor. Dann existiert laut Definition ein i mit 1 i l und ein D Days mit maxevents i 0, so dass { } E j Event, plan j = (T j, R j ) day Tj = D L i EventLec j > maxevents i gilt. Angenommen, die Verletzung von C10 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es existiert ein m < k + 1 und ein D Days mit maxevents i 0, so dass nach der Zuweisung plan im = } (T im, R im ) gilt {E j Event, plan j = (T j, R j ) day Tj = D L i EventLec j }{{} = maxevents i.! Bei der Zuweisung plan im = (T im, R im ) war plan ik+1 =. Also wurde durch FC-OP4 die Operation D ik+1 = D ik+1 \ { (T, R) day T = day ik+1 } ausgeführt. Nun gilt für jedes (T, R) D ik+1, dass day T day ik+1. Daher ist (T ik+1, R ik+1 ) / D ik+1. C11 Angenommen, es läge eine Verletzung von C11 vor. Dann existiert laut Definition ein i mit 1 i e und ein T i timeslotp reset i. Angenommen, die Verletzung von C11 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es gilt T ik+1 timeslotp reset ik+1. Vor Suchbegin wurde durch REMOVE-OP1 die Operation D ik+1 = D ik+1 \ { (T, R) T ik+1 timeslot P reset ik+1 } ausgeführt.

66 4.4 Optimierung der Backtracking Suche 59 Daher ist (T ik+1, R ik+1 ) / D ik+1. C12 Angenommen, es läge eine Verletzung von C12 vor. Dann existiert laut Definition ein i mit 1 i e und ein T i F orbiddent i. Angenommen, die Verletzung von C12 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es gilt T ik+1 F orbiddent ik+1. Vor Suchbegin wurde durch REMOVE-OP2 die Operation D ik+1 = D ik+1 \ { (T, R) T ik+1 F orbid dent ik+1 } ausgeführt. Daher ist (T ik+1, R ik+1 ) / D ik+1. C13 Angenommen, es läge eine Verletzung von C13 vor. Dann existiert laut Definition ein i mit 1 i e und ein R i roomp reset i. Angenommen, die Verletzung von C13 erfolge durch die Zuweisung plan ik+1 = (T ik+1, R ik+1 ). D.h es gilt R ik+1 roomp reset ik+1. Vor Suchbegin wurde durch REMOVE-OP3 die Operation D ik+1 = D ik+1 \ { (T, R) R ik+1 room P reset ik+1 } ausgeführt. Daher ist (T ik+1, R ik+1 ) / D ik Optimierung der Backtracking Suche Es werden nun weitere Ansätze zur Optimierung der Backtracking-Suche betrachtet. Diese beschäftigen sich mit der Frage, welche Variable als erstes, bzw. als nächstes zugewiesen werden soll und mit welchen Werten der Domänen begonnen werden soll Auswahl des Startknoten Als Startknoten wird die Veranstaltung ausgewählt, die am meisten Beschränkungen aufweist (Degree Heuristic). Durch die Anwendung dieser Heuristik wird versucht, den Verzweigungsgrad von zukünftigen Zuweisungen zu verringern, indem die Variable ausgewählt wird, die in den meisten Constraints der übrigen Variablen enthalten ist. Da diese Heuristik zur Auswahl des Startknotens verwendet wird, ist bei der Anwendung der Heuristik noch keine Variable zugewiesen. Um die Anzahl der Beziehungen über die Constraints einer Variablen zu allen

67 4.4 Optimierung der Backtracking Suche 60 anderen zu bestimmen, wird der Constraint Graph verwendet. Dieser stellt genau die Beziehung zwischen den Variablen dar. Die Funktion degree(e i ) liefert für die Variable E i diese Anzahl der Beziehungen zu den übrigen Variablen. mit degree(e i ) = e j=1 de i ST (E j) + d E i F T (E j) + d E i Lec (E j) + d E i Sem (E j) { d E i 1, falls ST (E Ei N j) = ST (E j ) 0, sonst. { d E i 1, falls F T (E Ei N j) = F T (E j ) 0, sonst. { d E i 1, falls Lec (E Ei N j) = Lec (E j ) 0, sonst. { d E i 1, falls Sem (E Ei N j) = sem (E j ) 0, sonst. Der zuvor beschriebene Algorithmus wird so erweitert, dass beim ersten Aufruf der Funktion RECURSIVE-BACKTRACKING die zu betrachtende Veranstaltung nach der Degree Heuristik ausgewählt wird. Diese Funktion wird mit SELECT- ROOT bezeichnet (Zeile 12 von Algorithmus 27) Auswahl einer Variablen Nun wird nicht nur die Auswahl des Startknotens betrachtet, sondern es wird nach jeder Zuweisung eine bestimmte Veranstaltung ausgewählt. Ziel ist es erneut, möglichst früh im Suchbaum Inkonsistenzen aufzudecken und somit, Suchpfade möglichst früh abbrechen zu können. Es wird also eine Veranstaltung ausgewählt, für die am wenigsten Zuweisungen möglich sind. Im weiteren Verlauf der Suche werden die Veranstaltungen absteigend nach der Anzahl der zulässigen Werte sortiert (Minimum Remaining Values Heuristic). Dies wird durch die bisher nicht betrachtete Funktion SELECT-EVENT in Zeile 14 des Algorithmus 27 umgesetzt. Diese Funktion betrachtet die Domänen der Variablen und bewertet die Anzahl der verbliebenen Werte. Es wird nun die Variable ausgewählt, die am wenigsten gültige Zuweisungen erlaubt. SELECT-EVENT = min D i für alle E i mit plan i = Es werden nur Veranstaltungen betrachtet, denen bisher noch kein Wert zugewiesen wurde Auswahl eines Wertes Bisher wurden nur die Variablen und die Strategie zur Auswahl der als nächstes zu betrachtenden Variablen untersucht. Für die Festlegung der Reihenfolge, in der die Werte ausprobiert werden kann die Least Constraining Value Heuristik effektiv

68 4.4 Optimierung der Backtracking Suche 61 Algorithm 27 Forward Checking mit Auswahl des Startknotens 1: function BACKTRACKING-SEARCH(csp) 2: BUILT-TRANSITIVE-RELATIONS-ST(G ST ) 3: REMOVE-INCONSISTENT-VALUES(Event) 4: return RECURSIVE-BACKTRACKING({}, csp, 1) 5: end function 6: function RECURSIVE-BACKTRACKING(timetable, csp, label) 7: if timetable is complete then 8: return timetable 9: end if 10: event an unassigned event 11: if no variable has been considered then 12: event SELECT-ROOT(csp) 13: else 14: event SELECT-EVENT(Event) 15: end if 16: if any D i = {} then 17: return error 18: end if 19: UnassignedEvents {E i E i Event plan i = } 20: for all (T, R) : (T, R) D event Label((T, R)) = 0 do 21: timetable timetable plan event = (T, R) 22: FORWARD-CHECKING(event, U nassignedevents, label) 23: result RECURSIVE-BACKTRACKING(timetable, csp, label + 1) 24: if result error then 25: return result 26: end if 27: timetable timetable\plan event 28: for all D i do 29: for all (T, R) D i do 30: if Label((T, R)) = label then 31: label (T, R) as not removed Label((T, R)) 0 32: end if 33: end for 34: end for 35: end for 36: return error 37: end function

69 4.4 Optimierung der Backtracking Suche 62 sein. Sie versucht, einen Wert auszuwählen, der die wenigsten Wahlmöglichkeiten für im Constraint-Graphen benachbarten Variablen ausschließt. Diese Strategie verfolgt den Ansatz, maximale Flexibilität für nachfolgende Variablenzuweisungen beizubehalten. Bei der Least Constraining Value Heuristik wird nun vor der Zuweisung eines Werts für die Variable E i für jeden Wert d D i geprüft, wie weit er die Domänen aller Variablen E N t (E i ) einschränkt, wobei plan E = und t = {Lec, Sem, ST, F T }. Die Werte der Domäne werden aufsteigend nach der Anzahl der Werte sortiert, die sie aus den Domänen der benachbarten Variablen ausschließen würden. Begonnen wird also mit der Zuweisung der Werte, die am wenigsten Auswahlmöglichkeiten auschließen. Diese Prüfung erfolgt anhand der in Abschnitt angebrachten Kriterien. Der Algorithmus wird um die Funktion SORT-DOMAIN erweitert, welche diese Sortierung der Werte durchführt. Daraus ergibt sich Algorithmus 29. Die Auswahl des nächsten Werts erfolgt nun nicht mehr zufällig, sondern über eine feste Reihenfolge, da die Werte der Domäne aufsteigend nach dem Wert v(d) sortiert sind. Algorithm 28 Sortieren der Werte einer Domäne (SORT-DOMAIN) 1: function SORT-DOMAIN(event) 2: for all d D event do 3: v(d) 0 4: for all E N t (event) with plan E = do 5: v(d) v(d) + number of values in D E, which would be inconsistent because of the assignement plan event d 6: end for 7: end for 8: sort D event in ascending order by v(d) 9: end function Backjumping Wie in Kapitel 2.3 vorgestellt, wird beim Backjumping zu einem Element aus der Konfliktmenge der inkonsistenten Variablen X zurückgesprungen. Diese enthält alle bereits zugewiesenen Variablen, die mit X durch ein Constraint verbunden sind. Wie gezeigt, handelt es sich beim Constraint Graphen des vorliegenden Stundenplanungsproblem um einen vollständigen Graphen. Das bedeutet, dass jeder Knoten im Constraint Graph mit allen anderen Knoten direkt über eine Kanten verbunden ist. Damit enthält die Konfliktmenge einer Variablen X alle Variablen Y, für die Y X und plan Y. Daher macht die Strategie des Backjumping hier keinen Sinn, da wie beim chronologischen Backtracking zur zuvor betrachteten Variablen im Suchbaum zurückgegangen wird.

70 4.4 Optimierung der Backtracking Suche 63 Algorithm 29 Forward Checking erweitert um das Sortieren des Wertebereichs der ausgewählten Variablen. Entgültige Fassung des Backtracking Algorithmus. 1: function BACKTRACKING-SEARCH(csp) 2: BUILT-TRANSITIVE-RELATIONS-ST(G ST ) 3: REMOVE-INCONSISTENT-VALUES(Event) 4: return RECURSIVE-BACKTRACKING({}, csp, 1) 5: end function 6: function RECURSIVE-BACKTRACKING(timetable, csp, label) 7: if timetable is complete then 8: return timetable 9: end if 10: if no variable has been considered then 11: event SELECT-ROOT(csp) 12: else 13: event SELECT-EVENT(Event) 14: end if 15: if any D i = {} then 16: return error 17: end if 18: SORT-DOMAIN(event) 19: UnassignedEvents {E i E i Event plan i = } 20: for all (T, R) : (T, R) D event Label((T, R)) = 0 do 21: timetable timetable plan event = (T, R) 22: FORWARD-CHECKING(event, U nassignedevents, label) 23: result RECURSIVE-BACKTRACKING(timetable, csp, label + 1) 24: if result error then 25: return result 26: end if 27: timetable timetable\plan event 28: for all D i do 29: for all (T, R) D i do 30: if Label((T, R)) = label then 31: label (T, R) as not removed Label((T, R)) 0 32: end if 33: end for 34: end for 35: end for 36: return error 37: end function

71 4.4 Optimierung der Backtracking Suche Zerlegung des Constraint Graphen Eine Zerlegung des Constraint Graphen in Teilprobleme wäre auch beim vorliegenden Problem der Stundenplanung anwendbar. So könnte das Problem nach Semester-Studiengang-Kombinationen oder Dozenten unterteilt werden. Ein Unterproblem wäre dann die Suche eines Stundenplans für eine Semester-Studiengang- Kombinationen bzw. für einen Dozenten. Allerdings wäre hier auch der Aufwand für die Zusammenfassung der Ergebnisse der Teillösungen zu einer Gesamtlösung zu berücksichtigen. Bei einer Zerlegung des Problems mit e Veranstaltungen in Teilprobleme mit je c Veranstaltungen läge der Aufwand für die Bildung der Lösungen in O((rt) e e ). Mit dem Zusammenführen der Lösungen liegt der Aufwand jedoch wieder in O((rt) e ), also exponentiell zu e. Dies liegt daran, dass c die Teillösungen für sich wieder einen Graphen bilden. Hier bildet alle möglichen Lösungen eines Teilproblems eine Super-Variable. Für den Fall, dass der Graph dieser Super-Variablen einen Baum darstellt, existieren effiziente Algorithmen, welche die Lösungen in O(nd 2 ) zusammenfügen. Beim hier vorliegenden Problem bilden die Teilprobleme jedoch einen Graphen, der auch Zyklen enthalten kann, also keinen Baum darstellt. Dies ist nicht verwunderlich, da das Timetabling-Problem NP-vollständig ist. Abbildung 4.4 zeigt ein Beispiel für die Zerlegung des Constraint Graphen in Teilprobleme für das Stundenplanungsproblem. Hier tritt der Fall auf, dass die Teilprobleme einen Graphen mit Zyklus bilden. Es gibt jedoch Abbildung 4.4. Beispiel für die Zerlegung des Constraint Graphen in Teilprobleme für das Stundenplanungsproblem noch einen weiteren Grund, warum die Anwendung dieser Strategie für das vorliegende Problem nicht sinnvoll ist. Um eine gültige Lösung, durch Zusammenführung der Ergebgnisse der Teilprobleme zu erhalten, müssen alle Lösungen der jeweili-

72 4.5 Lokale Suche zur Lösung des CSP 65 gen Problem gebildet werden. Hier genügt es nicht, lediglich eine Lösung für jedes Teilproblem zu bilden. Da es darum geht, möglichst schnell eine beliebige Lösung zu erhalten, würde dies eine Verschlechterung der Laufzeit bedeuten. Daher wird auf die Anwendung dieses Verfahrens verzichtet. 4.5 Lokale Suche zur Lösung des CSP Auch bei der Lokalen Suche werden vor Suchbeginn ungültige Werte aus den Domänen der Variablen entfernt. Dadurch wird die Wahrscheinlichkeit erhöht, dass für eine Variable ein gültiger Wert ausgewählt wird. Doch zuvor müssen ebenfalls transitive Beziehungen für die Relation ST gebildet werden, da dies für die korrekte Ausführung des Kantenkonsistenz-Algorithmus AC-3 erforderlich ist. Durch den Parameter random kann angegeben werden, ob bei der Bildung der Initiallösung jeder Variablen der erste Wert aus der Domäne zugewiesen wird oder ein zufällig gewählter Wert. In jedem Schritt wird nun zufällig eine Variable ausgewählt, die gegen mindestens ein Constraint verstößt. Die Zustandsübergangsfunktion wählt nun für diese Variable den Wert aus, dessen Zuweisung gegen die wenigsten Constraints verstößt. h(v) = Anzahl der verletzten Constraints bei der Zuweisung des Wertes v Diese Strategie wird als Min-Conflicts Heuristik bezeichnet. Eine benachbarte Lösung entsteht also durch das Ändern des Werts einer Variablen. Algorithmus 30 zeigt eine auf das Stundenplanungsproblem angepasste Fassung des Lokale Suche Algorithmus.

73 4.5 Lokale Suche zur Lösung des CSP 66 Algorithm 30 Lokale Suche unter Verwendung der Min-Conflicts Heuristik zum Lösen des Stundenplanungsproblems als CSP 1: function MIN-CONFLICTS(csp, max steps, random) returns a solution 2: or failure 3: BUILT-TRANSITIVE-RELATIONS-ST(G ST ) 4: DELETE-INCONSISTENT-VALUES(Event) 5: if random then 6: current assign each variable a random value of the domain 7: else 8: current assign each variable the first value of the domain 9: end if 10: for i = 1 to max steps do 11: if current is a complete and valid timetable then 12: return current 13: end if 14: var a randomly chosen, conflicted variable from Event 15: value min h(v) for v D var 16: set plan var = value in current 17: end for 18: return f ailure 19: end function

74 5 Technischer Entwurf Das Ziel ist nun die Umsetzung des beschriebenen Algorithmus 29. Da für die Umsetzung eine effiziente Implementierung gefordert ist, werden in diesem Kapitel für die Implementierung relevante Bereiche betrachtet und versucht, möglichst effiziente Methoden für die bevorstehende Implementierung zu erarbeiten. 5.1 Darstellung des Constraint Graphen Durch das Forward Checking werden die Wertebereiche gemäss C1, C2, C3, C8, C9 und C10 konsistent gehalten. Dies entspricht genau den durch den Constraint Graphen dargestellten Nachbarschaften und damit den Beziehungen zwischen den Veranstaltungen. Da das Forward Checking die elementare Operation für die Konsistenthaltung der Wertebereiche darstellt, häufig durchgeführt wird und auf dem Constraint Graphen arbeitet, werden die Komplexität und der Ablauf nun in diesem Abschnitt genauer betrachtet. Für die Darstellung des Graphen bietet sich eine Repräsentation in Form einer Adjazentmatrix an. Um die Nachbarschaften N type mit type = {lec, sem, ST, F T } eines Knotens festzustellen, müssen dabei jedoch immer alle Knoten betrachtet werden. Das Forward Checking wird nach jeder Zuweisung eines Wertes durchgeführt. Wurde eine Zuweisung vorgenommen, so müssten alle e Veranstaltungen betrachtet werden, um festzustellen, für welche Variablen die Löschoperationen für die Wertebereiche durchgeführt werden müssen. Um eine Verbesserung der Laufzeit zu erreichen, wird der Graph nicht durch eine Matrix dargestellt, sondern es werden für jede Variable die Nachbarschaften festgehalten. Auf diese Weise kann direkt auf jeden benachbarten Knoten zugegriffen werden. Es müssen also nur N type Knoten für die entsprechende Nachbarschaft betrachtet werden. Der Faktor e wird dadurch auf N type veringert. Dies wird im folgenden Vergleich verdeutlicht. Nach der Zuweisung der Variablen E i wäre der Ablauf zur Durchführung der Löschoperation FC-OP1 bei einer Matrixdarstellung des Graphen folgender:

75 5.1 Darstellung des Constraint Graphen Betrachte jeden Dozenten L von E i 2. Betrachte jede Variable j i und prüfe ob (E i, E j ) / ST 3. Falls (E i, E j ) / ST und L auch Dozent von E j, dann lösche inkonsistente Werte aus D j Der Aufwand für 1. läge bei der maximalen Anzahl von zuweisbaren Dozenten für eine Veranstaltung, also bei max LecRef. Durch 2. wird jede Variable betrachtet, also e. Um festzustellen, ob der Dozent auch in E j enthalten ist werden erneut max LecRef Vergleiche benötigt. Die Anzahl der Elemente einer Domäne ist durch r t beschränkt. Beim Löschen müssen diese alle betrachtet werden. Insgesamt läge der Aufwand bei (max 2 LecRef e tr). Bei der Darstellung durch Speicherung der Nachbarschaften für jeden Knoten, läuft FC-OP1 folgenmaßen ab: 1. Betrachte jedes E j N lec (E i ) 2. Falls (E i, E j ) / ST lösche die inkonsistenten Werte aus D j Der Aufwand für 1. liegt bei N lec. Die Größe der Nachbarschaft ist nach oben durch max LecRef beschränkt. Zum Löschen werden alle t r Werte betrachet. Der Gesamtaufwand für FC-OP1 liegt damit bei (max LecRef rt). Da es sich bei max LecRef um eine Konstante handelt, liegt der Aufwand der ersten Strategie bei O(etr). Im Vergleich dazu, liegt der Aufwand des verwendeten Verfahrens bei O(rt). Der Ablauf von Operation FC-OP2 ist identisch mit dem zuvor vorgestellten, mit dem Unterschied, dass die Prüfung nicht für Dozenten der zugewiesenen Veranstaltung vorgenommen wird, sondern für die Semester. Es wird also die Nachbarschaft N sem verwendet. Der Gesamtaufwand für FC-OP2 liegt bei (max SemRef rt) und damit in O(rt). Für die Anwendung von FC-OP3 werden alle Wertebereiche D i mit 1 i e und i event betrachtet. Der zugewiesene Wert plan event = (T event, R event ) wird aus allen Domänen D i enfernt. Es werden also e 1 Wertebereiche mit maximal r t Werten bearbeitet. Der Aufwand dafür liegt somit bei O(ert). Durch FC-OP4 wird für jeden Dozenten (maximal max LecRef ) der gerade zugewiesenen Veranstaltung geprüft, wie viele Veranstaltungen an jedem Tag hat. Dafür wird jede Veranstaltung betrachtet, um zu prüfen ob diese von dem gleichen Dozenten gehalten wird und an welchem Tag diese stattfindet. Der Aufwand bisher liegt damit bei (max 2 LecRef e). Wird ein Verstoss festgestellt, so müssen aus den Domänen der noch nicht zugewiesenen und von diesen Dozenten gehaltenen Veranstaltungen die Werte entfernt werden, deren T am gleichen Tag stattfindet wie das zugewiesene Zeitfenster T. Der Aufwand hiefür liegt bei (e max LecRef rt), da für jede Veranstaltung geprüft wird ob diese noch nicht zugewiesen ist und vom gleichen Dozenten gehalten wird. Beim Löschen werden maximal rt Elemente betrachtet.

76 5.2 Darstellung der Variablen und Domänen 69 Damit liegt der Gesamtaufwand von FC-OP4 bei (max 2 LecRef e + e max LecRef rt), also in O(e + ert). Die Operationen FC-OP5 und FC-OP6 werden durch den Kantenkonsistenzalgorithmus AC-3 durchgeführt. Wie gezeigt wurde, liegt dessen Laufzeit bei O(e 2 (rt) 3 ). 5.2 Darstellung der Variablen und Domänen Für die Repräsentation der Variablen wird ein strukturierter Datentyp EventDomain angelegt. Für eine Variable wird deren Name festgehalten. Außerdem ist für jede Variable deren Domäne zu verwalten. Eine Domäne besteht aus einer Menge von 2-Tupeln. Eine effiziente Implementierung der Domänendarstellung ist wichtig, da zum einen eine Domäne sehr viele Elemente enthalten kann und des Weiteren werden diese Werte oft durchlaufen, da der Algorithmus ungültige Tupel aus den Domänen als gelöscht markieren soll. Eine Variable besteht also aus einem Namen und aus einem Verweis auf das erste Element ihrer Domäne. Dazu wird für ein Element einer Domäne ein weiterer strukturierter Datentyp DomainValue angelegt. Auf den ersten Blick würde sich die Darstellung dieser Tupel in Form von Arrays anbieten. Dies wäre auch eine mögliche Umsetzung, da jedoch unter dem Aspekt der Effizienz von einem Programm stets möglichst wenig Arbeitsspeicher belegt werden sollte, gelten Arrays bei großen Datenmengen als nicht sehr effizient. Abhilfe bietet hier das Prinzip der linearen Kette, bzw. einfach verketteten Liste, welches hier mit Hilfe der dynamischen Speicherverwaltung realisiert wird. Dies bedeutet, dass ein Element in einer Domäne eine Referenz auf das nachfolgende Element besitzt. Auf diese Weise kann die gesammte Liste und damit die Domäne durchlaufen werden. Der Anfang der Liste wird duch eine Referenz auf das erste Element dargestellt. Eine Referenz auf NULL markiert das Ende, also das letzte Element der Liste. Hier ist eine einfach verkettete Liste ausreichend, da die Liste stets von Anfang bis Ende durchlaufen wird und dabei die einzelnen Tupel betrachtet, bzw. makiert werden. Eine doppelt verkettete Liste, bei der für jedes Listenelement neben einer Referenz auf das nachfolgende Element auch eine Referenz auf das vorhergehende Element erhält, ist deshalb nicht erforderlich. Der Aufbau der Liste ist in Abbildung 5.1 gezeigt. Ein großer Nachteil einer Liste gegenüber einem Array besteht darin, dass kein wahlfreier Zugriff auf das i-te Element der Liste möglich ist. Dies ist hier aber auch nicht erforderlich, da die Domäne vom ersten bis zum letzten Element durchlaufen wird. Für das Sortieren der Domäne ist dies ebenfalls nicht erforderlich. Da vor Begin der Suche bereits Werte aus den Domänen entfernt werden, bietet an dieser Stelle eine verkettete Listen den Vorteil, dass Elemente der Liste aufgrund der

77 5.3 Operationen auf Domänen 70 hohen Flexibilität und einfachen Funktionen zum Löschen eines Elements leicht entfernt werden können. Hier werden die Elemente tatsächlich entfernt und nicht nur als gelöscht markiert, da diese ungültige Belegungen darstellen und nicht mehr betrachtet werden dürfen. 5.3 Operationen auf Domänen Für die Bearbeitung der Domänen werden Funktionen für das Markieren von zu löschenden Elementen benötigt. Diese werden benötigt, um Werte zu löschen, als gelöscht zu markieren und die Wertebereiche zu sortieren. Im Folgenden bezeichnet head den Kopf der Liste. Sei T ein Element der Liste, dann liefert T next den Nachfolger von T. Abbildung 5.1. Lineare Liste für die Darstellung einer Domäne Löschen von Werten aus einer Domäne vor Suchbeginn Zum entgültigen Löschen eines Listenelements wird die Liste vom Anfang durchlaufen, bis auf ein Element gestoßen wird, das gelöscht werden muss. Nun muss die Referenz des Vorgängerelements des zu löschenden Elements auf das nachfolgende Element des zu löschenden Knoten umgeleitet werden. Der prinzipielle Ablauf der Funktion DELETE-INCONSISTENT-VALUES wurde bereits in Kapitel beschrieben. Zunächst verdeutlicht Beispiel 5.1 das Vorgehen beim Löschen eines Listenelements. Beispiel 5.1. Löschen eines Listenelements Angenommen, der Wert (T 1, R 2 ) soll aus der gerade betrachteten Domäne entfernt werden. Die Liste wird durchlaufen und mittlerweile zeigt der Zeiger p auf den Vorgänger des zu löschenden Elements. Der Zeiger p1 zeigt also auf das zu löschende Element. Die Referenz auf den Nachfolger des Vorgängers des zu löschenden Elements wird auf den Nachfolger des zu löschenden Nachfolgers umgelenkt.

78 5.3 Operationen auf Domänen 71 Nun ist nur noch das zu löschende Element zu entfernen. Nun werden Funktionen zum Löschen von Werten aus den Domänen benötigt. deleteallvalueswitht(e i Event, T j T imeslot): Entfernt aus D i alle Werte (T, R), für die T = T j. deleteallvalueswithr(e i Event, R j Room): Entfernt aus D i alle Werte (T, R), für die R = R j. deleteallvaluesnotequalt(e i Event, T j T imeslot): Entfernt aus D i alle Werte (T, R), für die T T j. deleteallvaluesnotequalr(e i Event, R j Room): Entfernt aus D i alle Werte (T, R), für die R R j. deletevalueswithtr(e i Event, T j T imeslot, R k Room): Entfernt aus D i den Wert (T j, R k ). Da die Liste eine Menge repräsentiert, ist dieser Wert höchstens einmal in der Liste vorhanden. Nach dem Löschen dieses Werts kann der Suchvorgang daher abgebrochen werden. Es wird nun die Funktion deleteallvalueswitht (s. Algorithmus 31) genauer betrachtet. Hier muss der Fall, dass ein zu löschendes Element am Anfang der Liste steht berücksichtigt werden. Hier wird der Verweis auf den Anfang der Liste von E i auf den Nachfolger des bisher ersten Elements umgeleitet und das bisher erste Element entfernt. Nun muss erneut geprüft werden, ob das neue erste Element gelöscht werden muss. Hierbei kann auch der Fall auftreten, dass die Liste aus nur einem Element besteht. Dann erhält der Zeiger, der den Anfang der Liste markiert einen Verweis auf den Wert NULL. Dies wird solange wiederholt, bis das erste Element der Liste nicht gelöscht wird. Anschließend wird der Rest der Liste durchlaufen. Es ist nun sichergestellt, dass ein zu löschendes Element nicht am Anfang der Liste steht. Wird ein Wert gelöscht, so wird die Referenz des Vorgängers auf dessen Nachfolger auf den Nachfolger des zu löschenden Werts umgeleitet und der Wert gelöscht.

79 5.3 Operationen auf Domänen 72 Algorithm 31 Löschen eines Listenelements 1: function deleteallvalueswitht(e i Event, T j T imeslot) 2: Löschen des bzw. der ersten Elemente 3: flag = TRUE gibt an, ob das erste Element der Liste gelöscht wurde 4: while flag AND (E head NULL) do 5: if E head next == NULL then D i enthält nur ein Element 6: if E head T == T j then zu löschendes Element gefunden 7: lösche E head 8: E head = NULL head zeigt nun auf NULL, leere Liste 9: return Abbruch, da D i = 10: end if 11: else D i enthält mind. zwei Element 12: if E head T == T j then zu löschendes Element gefunden 13: lösche E head und leite diese Referenz auf E head next um 14: flag = TRUE 15: else 16: flag = FALSE 17: end if 18: end if 19: end while 20: Löschen übrigen Elemente 21: p = E head 22: while p next NULL do Solange das Ende Liste noch nicht erreicht 23: p1 = p next p1 verweist immer auf den Nachfolger von p 24: if p next T == T j then zu löschendes Element gefunden 25: leite die Referenz p next auf p1 next um und lösche p1 26: else 27: p = p1 nächstes Element 28: end if 29: end while 30: end function Die übrigen Funktionen zum Löschen von Elementen gehen nach der selben Strategie vor. Sie unterscheiden sich lediglich in der Vergleichsoperation, mit der geprüft wird, ob das gerade betrachtete Element gelöscht werden muss. Es müssen die Fallunterscheidungen in den Zeilen 6, 12 und 24 angepasst werden. Diese sehen für die übrigen Funktionen wie folgt aus: deleteallvalueswithr(e i Event, R j Room): if ((E head R) == R j ) then bzw. if ((p next R) == R j ) then deleteallvaluesnotequalt(e i Event, T j T imeslot): if ((E head T ) T j ) then

80 5.3 Operationen auf Domänen 73 bzw. if ((p next T ) T j ) then deleteallvaluesnotequalr(e i Event, R j Room): if ((E head R) R j ) then bzw. if ((p next R) R j ) then deletevalueswithtr(e i Event, T j T imeslot, R k Room): if ((E head T ) == T j ) AND ((E head R) == R k ) then bzw. if ((p next T ) == T j ) AND ((E head R) == R k ) then Außerdem kann hier nach jeder Löschoperation abgebrochen werden, da wie bereits erwähnt, jedes Element höchstens einmal in der Liste vorhanden ist Löschen von Werten aus einer Domäne im Rahmen des Forward Checking Wie bereits erläutert, wird ein Wert nicht wirklich aus einer Domäne gelöscht, sondern lediglich als gelöscht markiert, um ihn eventuell zu einem späteren Zeitpunkt wiederherzustellen. Diese Markierung wird zunächst für jedes Element einer Domäne auf den Wert 0 gesetzt. Dies bedeutet also, dass dieses Elemente noch in der Domäne vorhanden ist. Soll es nun als gelöscht markiert werden, so wird die Markierung des Elements auf die Markierung (label) des aktuellen Zustands gesetzt. Hier wird die Darstellung der Elemente einer Domäne als verkettete Liste berücksichtigt. Ansonsten entsprechen diese Algorithmen denen, die bereits in Abschnitt vorgestellt wurden. Daher wird sich hier auf die beispielhafte Darstellung von Operation 1 des Forward Checking beschränkt (siehe Algorithmus 32). Durch dieses Vorgehen ist es nun erforderlich, für jedes Element einer Domäne ihre Markierung zu verwalten. Dazu wird für jeden Wert ein Attribut label angelegt. Hat label den Wert 0, so bedeutet dies, dass das Element noch in der Domäne vorhanden ist und zugewiesen werden kann Sortieren der Elemente einer Domäne Die Sortierung der Elemente einer Domäne findet anhand der Kenngröße v(d) statt. Um diesen Wert für ein Element d der Domäne D i zu ermittelt, wird zunächst die Summe der Anzahl der Elemente aller Domänen ermittelt. Dann wird die Zuweisung plan i = d vorgenommen und das Forward Checking durchgeführt. Anschließend wird erneut die Summe der verbleibenden Elemente aller Domänen ermittelt. Die Differenz der Summen vor und nach der Zuweisung stellt nun den Wert v(d) dar. Abschließend wird die Zuweisung plan i = d zurückgenommen und der nächste Wert betrachtet (siehe Algorithmus 33).

81 5.3 Operationen auf Domänen 74 Algorithm 32 Anwendung von Operation 1 des Forward Checking auf verkettete Liste 1: for all E i unassignedevents do 2: for L EventLecturer event do 3: if L EventLec i then 4: p = head(d i ); erstes Element D i 5: while p next!= NULL do jedes Element von D i 6: if T p = T event then gleiche Stunde 7: p label = label markiere das Tupel als gelöscht 8: end if 9: p = p next betrachte nun den Nachfolger 10: end while 11: end if 12: end for 13: end for Algorithm 33 Ermitteln der Kenngröße v(d) für das Sortieren der Werte einer Domäne 1: for all D i mit 1 i e und plan i = do 2: for all d D i do 3: do the assignement plan i = d 4: add the assignement to the timetable 5: v 1 e j=1 D j 6: FORWARD-CHECKING(E i, UnassignedEvents, -1) 7: v 2 e j=1 D j 8: undo the assignement; plan i = 9: remove the assignement from the timetable (with label -1) 10: v(d) = v 1 v 2 11: end for 12: end for In den vorherigen Abschnitten wurde die Darstellung der Domänen in Form von einfach verketteten Listen vorgestellt. Zum Sortieren dieser Listen wird nun ein Mergesort-Algorithmus betrachtet. Mergesort zerlegt die zu sortierende Liste in kleinere Listen, die für sich sortiert werden. Diese sortierten Listen werden dann wieder zusammengefügt, bis wieder eine sortierte Gesamtliste ensteht. Durch Mergesort werden die zu sortierenden Elemente sequentiell betrachtet. Daher eignet sich dieses Verfahren besonders zur Sortierung von verketteten Listen. Der hier verwendeten Mergesort-Algorithmus für einfach verkettete Listen wurde in [6] vorgestellt (siehe Algorithmus 34). Mergesort führt pro Rekursionsebene n = D i Vergleiche durch. Es gibt log(n) Rekursionsebenen, da sich pro Ebene die Länge der betrachteten Liste halbiert. Daraus kann eine Komplexität von

82 5.3 Operationen auf Domänen 75 Algorithm 34 Sortieren einer verkettete Liste mit Mergesort 1: function MERGESORT(pointer c) Zerlegen der Liste 2: pointer a, b 3: if c next = NULL then 4: return c; 5: end if 6: a c 7: b (c next) 8: while (b NULL) AND (b next NULL) do 9: c (c next) 10: b (b next next) 11: end while 12: b (c next) 13: (c next) NULL 14: return MERGE(MERGESORT(a), MERGESORT(b)) 15: end function 16: 17: function MERGE(pointer a, pointer b) Zusammenfügen zu einer 18: pointer c HEAD sortierten Liste 19: while (a NULL) AND (b NULL) do 20: if v(a) v(b) then 21: (c next) a 22: c a 23: (a next) a 24: else 25: (c next) b 26: c b 27: (b next) b 28: end if 29: end while 30: if a = NULL then 31: (c next) b 32: else 33: (c next) a 34: end if 35: end function

83 5.5 Kantenkonsistenz 76 O(n log(n)) gefolgert werden. Beispiel 5.2 verdeutlicht das Vorgehen zum Mischen und Zusammenfügen der Listenelemente. Beispiel 5.2. Sortieren einer linearen Liste mit Mergesort Gegeben sei eine Domäne mit vier Elementen. Im ersten Schritt werden zwei Listen mit je zwei Elementen gebildet. Diese zwei-elementigen Listen werden sortiert. Im letzen Schritt werden die beiden Listen sortiert zu einer einzigen Liste zusammengefügt. 5.4 Erstellen der Domänen Für jede Variable wird eine Domäne angelegt. Dabei handelt es sich bei dem Typen einer Variablen um die zuvor vorgestellte Datenstruktur. Zunächst werden für jede Domäne alle möglichen Zeitfenster-Raum Kombinationen angelegt. Jede Domäne hat also zunächst t r viele Elemente und erhält einen Verweis auf das erste Elemente. Die Domäne werden mit Hilfe eines zweidimensionalen dynamischen Arrays dargestellt. Dieses Array wird mit eventdomains bezeichnet und hat den Aufbau wie in Abbildung 5.2 vorgestellt. Um dieses Array mit den entsprechenden Daten zu belegen, wird Algotithmus 35 angewendet. 5.5 Kantenkonsistenz In diesem Abschnitt wird gezeigt, wie das in Kapitel vorgestellte Konzept der Kantenkonsistenz umgesetzt wird Darstellung der Graphen von ST und FT Die Graphen zur Darstellung der Nachbarschaft N ST (E i ) und N F T (E i ) einer Variablen E i können jeweils als Adjazenzmatrix dargestellt werden. Diese Matrizen

84 5.5 Kantenkonsistenz 77 Abbildung 5.2. Darstellung aller Domänen Algorithm 35 Erstellen der Domänen 1: for all E i with i = 1,..., e do 2: for all T j with j = 1,..., t do 3: for all R k with k = 1,..., r do 4: create new domain value (T j, R k ) 5: if D i = then 6: set the new value as the head of D i 7: else 8: add the new value to D i 9: end if 10: if (T j, R k ) is the last value to add then 11: finish the list with NULL 12: end if 13: end for 14: end for 15: end for werden als zweidimensionale Arrays sametimeasmatrix und followstomatrix der Größe (e e) verwaltet. Der Zugriff auf A ij erfolgt dabei über den Indexoperator matrix[i][j]. Diese Matrixen haben somit den in Abbildung 5.3 dargestellten Aufbau Warshall Algorithmus Das Verfahren zur Berechnung des Graphen G + ST wurde Kapitel in vorgestellt. Die Matrix A ST wird so berechnet, dass sametimeas[i,j] gleich 1, genau dann wenn ein Pfad von Knoten E i nach Knoten E j existiert. Dieses Algorithmus wird wie folgt umgesetzt: Die Laufzeit dieses Verfahrens liegt bei O(e 3 ), da jede der drei Schleifen genau e-mal durchlaufen wird. Die Laufzeit kann jedoch verbessert werden, indem die dritte Schleife nur durchlaufen wird, falls eine Verbindung von E i nach E k besteht. Das heißt, nur wenn ein Pfad von E i nach E k existiert, muss

85 5.5 Kantenkonsistenz 78 Abbildung 5.3. Darstellung der Matrizen A ST und A F T Algorithm 36 Umsetzung des Algorithmus von Wahrschall [4] 1: for k = 0; k < e; k + + do a represents the matrix sametimeasmatrix 2: for i = 0; i < e; i + + do 3: for j = 0; j < e; j + + do 4: a[i][j] = a[i][j] a[i][k] && a[k][j] 5: end for 6: end for 7: end for geprüft werden, ob auch ein Pfad von E k nach E j existiert, um die Verbindung von E i nach E j in den Graphen aufzunehmen. Daraus ergibt sich Algorithmus 37. Im schlechtesten Fall handelt es sich bei G + F T um einen vollständigen Graphen. Algorithm 37 Umsetzung des Algorithmus von Wahrschall mit verbesserter Laufzeit 1: for k = 0; k < e; k + + do 2: for i = 0; i < e; i + + do 3: if a[i][k] then 4: for j = 0; j < e; j + + do 5: a[i][j] = a[i][j] a[k][j] 6: end for 7: end if 8: end for 9: end for Dann hat jeder Knoten den Grad V 1 = e 1. So liegt die Laufzeit zwar immer noch bei O(e 3 ), realistisch betrachtet, tritt der Fall, dass alle Veranstaltungen gleichzeitig stattfinden müssen jedoch nicht auf.

86 5.5 Kantenkonsistenz Constraint Propagation Um den Constraint-Graphen konsistent zu halten, werden Veränderungen von Domänen an benachbarte Knoten weitergegeben (s. Algorithmus 24). Wird also die Domäne D i eines Knotens E i verändert, müssen alle E k N ST,F T (E i ) nochmal betrachtet werden. Diese werden dazu in eine Queue eingefügt. Anschließend findet die Prüfung für das erste Element in der Schlange statt. Dieser Prozess wird solange wiederholt, bis sich kein weiteres Element in der Queue befindet. Bilden der Nachbarschaften Dazu werden zunächst für alle Knoten die Nachbarschaften gebildet und festgehalten. So müssen bei einer Veränderung nicht erneut alle Knoten betrachtet werden, um zu prüfen, ob diese sich in der entsprechenden Nachbarschaft befinden und somit in die Queue eingefügt werden müssen. Diese Nachbarschaften werden wie durch Algorithmus 38 dargestellt gebildet. Da die Matrix A + ST symmetrisch ist, muss für (i, j) nur E j in die Nachbarschaft von E i eingefügt werden, weil für (j, i) bereits der Wert E i in die Nachbarschaft von E j hinzugefügt wird. Für A + F T gilt diese Symmetrie nicht. Daher wird für (i, j) sowohl N F T (E i ) um E j ergänzt, als auch N F T (E j ) um E i. Darstellung der Queue Die Queue zur Verwaltung der zu prüfenden Variablen wird als linere verkettete Liste umgesetzt. Dies hat die Vorteile, dass die maximale Größe der Queue nicht von Begin an feststehen muss und dynamisch Elemente entnommen und hinzugefügt werden können. Es wird eine Datenstruktur Queue angelegt. Diese enthält einen Verweis auf den Anfang der Liste. Jedes dieser Listenelemente erhält wiederrum einen Verweis auf dessen Nachfolger. Außerdem wird durch einen Verweis auf das Ende der Liste der Punkt festgehalten, an dem neue Elemente eingefügt werden. Dadurch kann vermieden werden, dass zum Einfügen eines Elements die gesammte Liste durchlaufen werden muss, um das Ende zu finden. Ein Listenelement repräsentiert eine Kante der Graphen G + ST und G F T. Daher enthält ein solches Element die Informationen darüber welche Kante es darstellt. Der Startknoten der Kante wird durch e1 und der Enknoten durch e2 festgehalten. Dadurch ergibt sich die in Abbildung 5.4 dargestellte Struktur für die Queue. Um ein Ele- Abbildung 5.4. Darstellung der Queue

87 5.5 Kantenkonsistenz 80 Algorithm 38 Bilden der Nachbarschaften N ST,N F T,N Lec und N Sem 1: Für alle E i mit i = 1,..., e setzte N ST = und N F T = 2: for i = 0; i < e; i + + do 3: for j = 0; j < e; j + + do 4: 5: if sametimeasm atrix[i][j] then 6: N ST (E i ) N F T (E i ) E j 7: end if 8: 9: if f ollowst om atrix[i][j] then 10: N F T (E i ) N F T (E i ) E j 11: N F T (E j ) N F T (E j ) E i 12: end if 13: 14: if i j then 15: 16: for all L i EventLec i do 17: for all L j EventLec j do 18: if L i = L j then 19: N Lec (E i ) N Lec (E i ) E j 20: end if 21: end for 22: end for 23: 24: for all S i EventSem i do 25: for all S j EventSem j do 26: if S i = S j then 27: N Lec (E i ) N Lec (E i ) E j 28: end if 29: end for 30: end for 31: end if 32: end for 33: end for ment in die Queue einzufügen, wird an das Element, auf das der Zeiger tail der Queue verweist, das neue Element angehangen. Dieses neue Element bildet nun das neue Ende der Schlange. Der Verweis auf den Nachfolger des ehemals letzten Elements zeigt nun nicht mehr auf den Wert NULL, sondern auf das neue Element. Dieses wiederum markiert das Ende der Liste durch den Verweis auf den Wert NULL als dessen Nachfolger. Ein Element wird nur dann in die Queue eingefügt, wenn es noch nicht enthalten ist. Dadurch wird vermieden, dass die Prüfung für das gleiche Element mehrfach ausgeführt wird.

88 5.6 Integration des Algorithmus 81 Die Funktion zur Entnahme eines Elements liefert das erste Element in der Queue. Anschließend wird der Verweis head auf den Nachfolger dieses Elements umgeleitet. Nun kann der Speicherplatz des ersten Elements freigegeben werden. Um festzustellen, ob die Queue leer ist, wird geprüft ob die Zeiger head und tail auf den Wert NULL zeigen. Ist dies der Fall, so enthält die Queue keine weiteren Elemente. 5.6 Integration des Algorithmus Für den in C zu realisierenden Algorithmus wird ein Modul backtrackingcsp angelegt. In diesem Modul befindet sich die Implementierung des Backtracking Algorithmus zur Lösung des CSP. Dieses Modul besitzt die gleichen Schnittstellen wie das Modul tabu_search, welches die Implementierung des bisher verwendeten Tabu-Suche Algorithmus enthält. Die entwickelten Algorithmen zur Lösung des CSPs werden durch eine Funktion des Moduls ase_jni_timetabling gestartet und liefert einen Stundenplan oder einen Fehler, falls kein gültiger Plan gefunden wurde. Das bestehende Modul ase_jni_timetabling stellt die Schnittstelle zwischen der Oberfläche und der Algorithmuskomponente dar. Es ist möglich, die Algorithmen zur Lösung des Problems als CSP vor der Tabu-Suche zu starten und die so gefundene Lösung als Initallösung für die Tabu-Suche zu verwenden. Die Backtracking und Lokale Suche sind aber auch seperat verwendbar. Wird ein gültiger Plan gefunden, so wird der Suchvorgang abgebrochen und die Lösung ausgegeben. Das Datenbankmodel bleibt durch die Integration des Algorithmus unverändert, da keine Änderung an der Struktur der Eingabedaten erforderlich ist. Eventuelle Parameter für den Algorithmus, die vom Benutzer vorgegeben werden können, werden weiterhin in einer Konfigurationsdatei über das Java-System verwaltet und über die JNI-Schnittstelle in die Algorithmuskomponente übermittelt. Die grafische Benuzterschnittstelle wird geringfügig angepasst. Wird durch den neuen Algorithmus eine gültige Lösung gefunden, so wird diese an den Benutzer weitergegeben. Außerdem kann nun eine definitive Aussage über die Gültigkeit der Eingabedaten getroffen werden. Wird das Backtracking oder Lokale Suche Verfahren zum Finden einer Initiallösung für die Tabu-Suche verwendet, so wird, nachdem eine gültige Lösung gefunden wurde und die Tabu-Suche gestartet wird, eine Meldung ausgegeben, dass die Stammdaten konsistent sind und bereits ein gültiger Plan gefunden wurde und nun dieser Plan optimiert werden kann.

89 6 Implementierung Abbildung 6.1 zeigt den Ablauf des implementierten Verfahrens für die Backtracking- Suche zur Lösung des vorliegenden Stundenplanungsproblems als CSP. Abbildung 6.1. Ablauf der Backtracking Suche in Form eines Flussdiagramms

90 6 Implementierung 83 Durch Abbildung 6.2 wird dargestellt, welche Algorithmen bei der Implementierung durch andere Algorithmen verwendet werden. Abbildung 6.2. Verwendung der Algorithmen

91 6.1 Vorgehensweise Vorgehensweise Prinzipiell wird bei der Implementierung so vorgegangen, dass der beschriebene Backtracking-Algorithmus schrittweise erweitert wird. Begonnen wird also mit einem einfachen Backtrackingverfahren, das schließlich um die beschriebenen Heuristiken erweitert wird. Dabei wird wie folgt vorgegangen (Phase 1): 1.1 Implementierung eines Testszenarios (siehe Kapitel 7.1) 1.2 Implementierung der Darstellung der Domänen und deren Werte Funktionen zum Erstellen der Wertebereiche und deren Werte Funktionen zur Ausgabe der Wertebereiche über die Konsole 1.3 Implementierung der Konsistenzprüfung vor Suchbeginn Funktion DELETE-INCONSISTENT-VALUES Funktionen zum Entfernen von Werten anhand bestimmter Kriterien 1.4 Implementierung des Forward Checking Funktion FORWARD-CHECKING Funktionen zum Markieren von Werten, die als gelöscht angesehen werden sollen 1.5 Implementierung der Wiederherstellung von Werten, die als gelöscht markiert sind 1.6 Implementierung eines Backtracking-Algorithmus mit Forward Checking 1.7 Integration des Backtracking-Algorithmus zum des Stundenplanungsproblems als CSP Integration in die C-Komponente des Systems Anpassen der GUI zum Aufruf des Verfahrens (hier noch keine Kombination mit der TABU-Suche) Auf die Implementierung des einfachen Backtracking-Algorithmus wird verzichtet, da bereits im Rahmen einer früheren Arbeit ein solcher für die Lösung des Problems entwickelt wurde. Dabei wurde das Problem zwar nicht als CSP dargestellt und gelöst, aber da hier ein Backtracking mit Forward Checking angewendet wird, müssen zunächst die Funktionen implementiert werden, die die Wertebereiche konsistent halten. Für die Implementierung eines Backtracking-Algorithmus ohne Forward Checking müßte ein Rahmenwerk geschaffen werden, um die aktuelle Belegung auf Inkonsistenzen zu überprüfen, da die Wertebereiche auch ungültige Belegungen zulassen würden. Dieses Rahmenwerk würde später durch das Forward Checking nicht mehr benötigt. Daher wird auf die Umsetzung eines einfachen Backtracking-Algorithmus verzichtet. In Phase 2 wird der Algorithmus um die beschriebenen Heuristiken zur Verbesserung der Effizienz des Verfahrens. 2.1 Implementierung der Funktion SELECT-ROOT zur Auswahl des Startknotens 2.2 Implementierung der Funktion SELECT-UNASSIGNED-EVENT zur Auswahl der als nächstes zu betrachtenden Variablen 2.3 Implementierung der Funktion SORT-DOMAIN zur zum Sortieren der Wertebereiche 2.4 Anpassen der GUI, so dass die Backtracking-Suche mit der TABU-Suche kombiniert werden kann

92 6.2 Allgemeine Anmerkungen 85 Nachdem der Umsetzung des Backtracking-Verahrens wird mit der Realisierung der Lokalen Suche zum Lösen des CSPs begonnen. Dies erfolgt in Folgenden Schritten. 3.1 Implementierung der Funktion zur zufälligen Auswahl einer Variablen, die gegen mindestens ein Constraint verstößt 3.2 Implementierung der Funktion zur Auswahl des Werts, welcher der gewählten Variable zugewiesen wird 3.3 Implementierung des gesamten Ablaufs der Lokalen Suche 6.2 Allgemeine Anmerkungen Um den Ablauf der Suche möglichst effizient zu halten, wird auf spezielle Situationen geachtet. So werden iterative Durchläufe von Schleifen abgebrochen, wenn sichergestellt ist, dass auf die verbleibenden Iterationen verzichtet werden kann. Beispielsweise kann beim Löschen eines Wertes, der ein bestimmtes Zeitfenster und einen Raum enthält, nach dem Auftreten des zu löschenden Wertes auf die weitere Abarbeitung des Wertebereiches verzichtet werden, da ein Wert (T, R) höchstens einmal in einem Wertebereich enthalten ist. Außerdem kann durch die Wahl der Darstellungsform von bestimmten Daten eine Steigerung der Effizienz erreeicht werden. So könnte eine Beziehung zwischen einen Datum X i und X j wie folgt festgehalten werden. { 1, falls Beziehung zwischen Xi und X array i [j] = j besteht 0, sonst. Für 1 i, j n müssten n = array i Operationen durchgeführt werden, um alle Daten zu selektieren, die mit X i in Verbindung stehen. Steht X i mit k Daten in Verbindung, so sind bei der folgenden Form der Speicherung von Beziehungen auch nur k-viele Operationen erforderlich zur Selektierung erforderlich. { j, falls Beziehung zwischen Xi und X array i [j] = j besteht 0, sonst. Für 1 j k werden die k Beziehung an den ersten k Positionen in array gespeichert. Um den nächsten freien Speicherplatz zu verwalten, wird ein Index verwalten. Beide Varianten stellen einen Speicherplatzbedarf von n dar. Der Unterschied liegt im Aufwand für den Zugriff auf die entsprechenden Daten. Neben der Effizienz wird großer Wert auf einen fehlerfreien Ablauf des Verfahrens gelegt. Dazu gehört auch eine sichere Speicherverwaltung. Es wird darauf geachtet, dass Speicher, der mit malloc dynamisch reserviert wurde, nach Beendigung des Suchalgorithmus auch wieder freigegeben wird (free). In den meisten Fällen wird nach der Beendigung eines Programms der reservierte und nicht freigegebene Speicher vom Betriebssystem organisiert und somit freigegeben. Dies ist jedoch in keinem Standard gefordert und ist damit von der Implementation der Speicherverwaltung des Betriebssystems abhängig. Daher wird hier darauf geachtet, dass

93 6.4 Anpassung der grafischen Benutzeroberfläche 86 die Freigabe des Speichers impiliziet erfolgt. Außerdem werden Abfragen verwendet, um Belegungen von Variablen und Zeigern zu vermeiden, die zu Laufzeitfehlern führen würden. Auf diese Weise können natürlich nicht alle krititschen Situationen abgefangen werden, aber das Risiko des Auftretens einer solchen Situation kann verringert werden. 6.3 Module Im Rahmen der Implementierung wird das System um das Modul backtracking_csp erweitert. Dieses Modul enthält alle Funktionen, die unmittelbar den Backtracking Algorithmus betreffen. Dies sind Funktionen für den eigentlicher Aufruf der Backtracking Suche, das Entfernen von ungültigen Werten vor Suchbeginn, die Auswahl des Startknoten, die Auswahl der nächsten Variablen, die Sicherstellung der Kantenkonsistenz (Warshall, AC-3) und das Sortieren der Werte einer Domäne. Im Modul local_search_csp befinden sich alle Funktion, die zur Durchführung der Lokalen Suche notwendig sind. Diese sind Funktionen für den Aufruf der Lokalen Suche, die Auswahl einer Variablen und die Auswahl eines Werts. Außerdem wird das Modul domain_operations_csp hinzugefügt. Hier werden Funktionen verwaltet, die sämtliche Operationen auf den Wertebereichen der Variablen ausführen. Dies sind Funktionen für das Erstellen der Domänen, das Löschen von Werten nach verschiedenen Kriterien, das Markieren von Werten nach verschiedenen Kriterien und das Wiederherstellen von markierten Werten. Für Funktionen, die Operationen auf der Queue zur Verwaltung der noch zu betrachtetenden Knoten im Rahmen der Herstellung der Kantenkonsistenz ausführen, wird das Modul queue_operations_csp eingebunden. Dieses enthält Funktionen für das Hinzufügen von Werten zur Queue und die Entnahme des ersten Elements der Queue. 6.4 Anpassung der grafischen Benutzeroberfläche Die Oberfläche wird um einen Dialog zum Aufruf der Algorithmen zur Lösung des Planungsproblems als CSP erweitert. Hier kann der Anwender zwischen dem

94 6.4 Anpassung der grafischen Benutzeroberfläche 87 Backtracking und der lokalen Suche wählen. Nach dem Start der Suche kann keines der Auswahlelemente betätigt werden. Zusätzlich werden hier Informationen über die benötigte Laufzeit und die Anzahl der betrachteten Zustände gegeben. Über den Dialog der Einstellungen können Konfigurationen der Algorithmen getätigt werden. Für die Backtracking Suche sind dies Einstellungen über die zu verwendenen Heuristiken. Für die Lokale Suche kann angegeben werden, ob diese mit einem zufällig gewählten Plan beginnen soll und wie oft Nachbarschaftswechsel durchgeführt werden sollen. Diese Einstellungen werden in einer Konfigurationsdatei mit den bisherigen Konfigurationsparametern verwaltet. Der Dialog zum Aufruf der Tabu-Suche wird so erweitert, dass der Anwender wählen kann, ob die Suche mit einer initialen Lösung beginnen soll. Bei der Implementierung wird darauf geachtet, dass diese Auswahl nur möglich ist, wenn bereits ein Plan gefunden wurde, der aktuelle Plan gültig ist. Ansonsten wird dem Anwender nicht die Möglichkeit gegeben, diese Option auszuwählen und die Suche startet mit einer vom System gewählten Initiallösung. Bei dieser vom System gewählten Lösung handelt es sich mit einer sehr hohen Wahrscheinlichkeit um einen ungültigen Plan und bei großen Projekten wird unter Umständen mit der Tabu-Suche viel Zeit benötigt, um erst einmal einen gültigen Plan zu finden. Abbildung 6.3 zeigt den Dialog, über den die Ausführung der Suche gestartet werden kann. Abbildung 6.3. Der Dialog zum Ausführen der Backtracking- und Lokalen Suche zum Lösen des Stundenplanungsproblems als CSP

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

Mehr

Wissensbasierte Systeme 5. Constraint Satisfaction Probleme

Wissensbasierte Systeme 5. Constraint Satisfaction Probleme Wissensbasierte Systeme 5. Constraint Satisfaction Probleme Michael Beetz Vorlesung Wissensbasierte Systeme 1 Inhalt 5.1 Begriffe 5.2 Constraint Satisfaction in Linienbildern 5.3 Beispielanwendungen 5.4

Mehr

Grundlagen der Künstlichen Intelligenz

Grundlagen der Künstlichen Intelligenz Grundlagen der Künstlichen Intelligenz 22. Constraint-Satisfaction-Probleme: Kantenkonsistenz Malte Helmert Universität Basel 14. April 2014 Constraint-Satisfaction-Probleme: Überblick Kapitelüberblick

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

Konzepte der Informatik

Konzepte der Informatik Konzepte der Informatik Vorkurs Informatik zum WS 2011/2012 26.09. - 30.09.2011 17.10. - 21.10.2011 Dr. Werner Struckmann / Christoph Peltz Stark angelehnt an Kapitel 1 aus "Abenteuer Informatik" von Jens

Mehr

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!. 040304 Übung 9a Analysis, Abschnitt 4, Folie 8 Die Wahrscheinlichkeit, dass bei n - maliger Durchführung eines Zufallexperiments ein Ereignis A ( mit Wahrscheinlichkeit p p ( A ) ) für eine beliebige Anzahl

Mehr

Kapitel MK:IV. IV. Modellieren mit Constraints

Kapitel MK:IV. IV. Modellieren mit Constraints Kapitel MK:IV IV. Modellieren mit Constraints Einführung und frühe Systeme Konsistenz I Binarization Generate-and-Test Backtracking-basierte Verfahren Konsistenz II Konsistenzanalyse Weitere Analyseverfahren

Mehr

Das Briefträgerproblem

Das Briefträgerproblem Das Briefträgerproblem Paul Tabatabai 30. Dezember 2011 Inhaltsverzeichnis 1 Problemstellung und Modellierung 2 1.1 Problem................................ 2 1.2 Modellierung.............................

Mehr

Informationsblatt Induktionsbeweis

Informationsblatt Induktionsbeweis Sommer 015 Informationsblatt Induktionsbeweis 31. März 015 Motivation Die vollständige Induktion ist ein wichtiges Beweisverfahren in der Informatik. Sie wird häufig dazu gebraucht, um mathematische Formeln

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse 11 13. 501322 Lösung 10 Punkte

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse 11 13. 501322 Lösung 10 Punkte 50. Mathematik-Olympiade. Stufe (Regionalrunde) Klasse 3 Lösungen c 00 Aufgabenausschuss des Mathematik-Olympiaden e.v. www.mathematik-olympiaden.de. Alle Rechte vorbehalten. 503 Lösung 0 Punkte Es seien

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Wissensbasierte Systeme

Wissensbasierte Systeme WBS5 Slide 1 Wissensbasierte Systeme Vorlesung 5 vom 17.11.2004 Sebastian Iwanowski FH Wedel WBS5 Slide 2 Wissensbasierte Systeme 1. Motivation 2. Prinzipien und Anwendungen 3. Logische Grundlagen 4. Suchstrategien

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Kapiteltests zum Leitprogramm Binäre Suchbäume

Kapiteltests zum Leitprogramm Binäre Suchbäume Kapiteltests zum Leitprogramm Binäre Suchbäume Björn Steffen Timur Erdag überarbeitet von Christina Class Binäre Suchbäume Kapiteltests für das ETH-Leitprogramm Adressaten und Institutionen Das Leitprogramm

Mehr

Anmerkungen zur Übergangsprüfung

Anmerkungen zur Übergangsprüfung DM11 Slide 1 Anmerkungen zur Übergangsprüfung Aufgabeneingrenzung Aufgaben des folgenden Typs werden wegen ihres Schwierigkeitsgrads oder wegen eines ungeeigneten fachlichen Schwerpunkts in der Übergangsprüfung

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

7 Rechnen mit Polynomen

7 Rechnen mit Polynomen 7 Rechnen mit Polynomen Zu Polynomfunktionen Satz. Zwei Polynomfunktionen und f : R R, x a n x n + a n 1 x n 1 + a 1 x + a 0 g : R R, x b n x n + b n 1 x n 1 + b 1 x + b 0 sind genau dann gleich, wenn

Mehr

Was sind Jahres- und Zielvereinbarungsgespräche?

Was sind Jahres- und Zielvereinbarungsgespräche? 6 Was sind Jahres- und Zielvereinbarungsgespräche? Mit dem Jahresgespräch und der Zielvereinbarung stehen Ihnen zwei sehr wirkungsvolle Instrumente zur Verfügung, um Ihre Mitarbeiter zu führen und zu motivieren

Mehr

WinWerk. Prozess 6a Rabatt gemäss Vorjahresverbrauch. KMU Ratgeber AG. Inhaltsverzeichnis. Im Ifang 16 8307 Effretikon

WinWerk. Prozess 6a Rabatt gemäss Vorjahresverbrauch. KMU Ratgeber AG. Inhaltsverzeichnis. Im Ifang 16 8307 Effretikon WinWerk Prozess 6a Rabatt gemäss Vorjahresverbrauch 8307 Effretikon Telefon: 052-740 11 11 Telefax: 052-740 11 71 E-Mail info@kmuratgeber.ch Internet: www.winwerk.ch Inhaltsverzeichnis 1 Ablauf der Rabattverarbeitung...

Mehr

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

Mehr

WS 2009/10. Diskrete Strukturen

WS 2009/10. Diskrete Strukturen WS 2009/10 Diskrete Strukturen Prof. Dr. J. Esparza Lehrstuhl für Grundlagen der Softwarezuverlässigkeit und theoretische Informatik Fakultät für Informatik Technische Universität München http://www7.in.tum.de/um/courses/ds/ws0910

Mehr

Grundlagen der Theoretischen Informatik, SoSe 2008

Grundlagen der Theoretischen Informatik, SoSe 2008 1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)

Mehr

M@school Software- und Druckerzuweisung Selbstlernmaterialien

M@school Software- und Druckerzuweisung Selbstlernmaterialien Bildung und Sport M@school Software- und Druckerzuweisung Selbstlernmaterialien Hinweise zum Skript: LMK = Linker Mausklick RMK = Rechter Mausklick LMT = Linke Maustaste RMT = Rechte Maustaste Um die Lesbarkeit

Mehr

4 Aufzählungen und Listen erstellen

4 Aufzählungen und Listen erstellen 4 4 Aufzählungen und Listen erstellen Beim Strukturieren von Dokumenten und Inhalten stellen Listen und Aufzählungen wichtige Werkzeuge dar. Mit ihnen lässt sich so ziemlich alles sortieren, was auf einer

Mehr

Lernmaterial für die Fernuni Hagen effizient und prüfungsnah

Lernmaterial für die Fernuni Hagen effizient und prüfungsnah Lernmaterial für die Fernuni Hagen effizient und prüfungsnah www.schema-f-hagen.de Sie erhalten hier einen Einblick in die Dokumente Aufgaben und Lösungen sowie Erläuterungen Beim Kauf erhalten Sie zudem

Mehr

Algorithmen II Vorlesung am 15.11.2012

Algorithmen II Vorlesung am 15.11.2012 Algorithmen II Vorlesung am 15.11.2012 Kreisbasen, Matroide & Algorithmen INSTITUT FÜR THEORETISCHE INFORMATIK PROF. DR. DOROTHEA WAGNER KIT Universität des Landes Baden-Württemberg und Algorithmen nationales

Mehr

Insiderwissen 2013. Hintergrund

Insiderwissen 2013. Hintergrund Insiderwissen 213 XING EVENTS mit der Eventmanagement-Software für Online Eventregistrierung &Ticketing amiando, hat es sich erneut zur Aufgabe gemacht zu analysieren, wie Eventveranstalter ihre Veranstaltungen

Mehr

Die reellen Lösungen der kubischen Gleichung

Die reellen Lösungen der kubischen Gleichung Die reellen Lösungen der kubischen Gleichung Klaus-R. Löffler Inhaltsverzeichnis 1 Einfach zu behandelnde Sonderfälle 1 2 Die ganzrationale Funktion dritten Grades 2 2.1 Reduktion...........................................

Mehr

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien Sie haben von der VR DISKONTBANK GmbH ein signiertes PDF-Dokument (i.d.r. eine Zentralregulierungsliste mit dem Status einer offiziellen Rechnung) erhalten und möchten nun die Signatur verifizieren, um

Mehr

Mediator 9 - Lernprogramm

Mediator 9 - Lernprogramm Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

8 Diskrete Optimierung

8 Diskrete Optimierung 8 Diskrete Optimierung Definition 8.1. Ein Graph G ist ein Paar (V (G), E(G)) besteh aus einer lichen Menge V (G) von Knoten (oder Ecken) und einer Menge E(G) ( ) V (G) 2 von Kanten. Die Ordnung n(g) von

Mehr

Mathematischer Vorbereitungskurs für Ökonomen

Mathematischer Vorbereitungskurs für Ökonomen Mathematischer Vorbereitungskurs für Ökonomen Dr. Thomas Zehrt Wirtschaftswissenschaftliches Zentrum Universität Basel Gleichungen Inhalt: 1. Grundlegendes 2. Lineare Gleichungen 3. Gleichungen mit Brüchen

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

8. Quadratische Reste. Reziprozitätsgesetz

8. Quadratische Reste. Reziprozitätsgesetz O Forster: Prizahlen 8 Quadratische Reste Rezirozitätsgesetz 81 Definition Sei eine natürliche Zahl 2 Eine ganze Zahl a heißt uadratischer Rest odulo (Abkürzung QR, falls die Kongruenz x 2 a od eine Lösung

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG it4sport GmbH HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG Stand 10.07.2014 Version 2.0 1. INHALTSVERZEICHNIS 2. Abbildungsverzeichnis... 3 3. Dokumentenumfang... 4 4. Dokumente anzeigen... 5 4.1 Dokumente

Mehr

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH MORE Profile Pass- und Lizenzverwaltungssystem erstellt von: Thorsten Schumann erreichbar unter: thorsten.schumann@more-projects.de Stand: MORE Projects GmbH Einführung Die in More Profile integrierte

Mehr

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt AMPEL-Steuerung(en) Die Beschreibung und Programmierung der Ampel (vor allem Ampel_5) können sehr kompliziert

Mehr

Charakteristikum des Gutachtenstils: Es wird mit einer Frage begonnen, sodann werden die Voraussetzungen Schritt für Schritt aufgezeigt und erörtert.

Charakteristikum des Gutachtenstils: Es wird mit einer Frage begonnen, sodann werden die Voraussetzungen Schritt für Schritt aufgezeigt und erörtert. Der Gutachtenstil: Charakteristikum des Gutachtenstils: Es wird mit einer Frage begonnen, sodann werden die Voraussetzungen Schritt für Schritt aufgezeigt und erörtert. Das Ergebnis steht am Schluß. Charakteristikum

Mehr

SUDOKU - Strategien zur Lösung

SUDOKU - Strategien zur Lösung SUDOKU Strategien v. /00 SUDOKU - Strategien zur Lösung. Naked Single (Eindeutiger Wert)? "Es gibt nur einen einzigen Wert, der hier stehen kann". Sind alle anderen Werte bis auf einen für eine Zelle unmöglich,

Mehr

Einführung in. Logische Schaltungen

Einführung in. Logische Schaltungen Einführung in Logische Schaltungen 1/7 Inhaltsverzeichnis 1. Einführung 1. Was sind logische Schaltungen 2. Grundlegende Elemente 3. Weitere Elemente 4. Beispiel einer logischen Schaltung 2. Notation von

Mehr

Verwalten und Organisieren von Fotos,

Verwalten und Organisieren von Fotos, Verwalten und Organisieren von Fotos, Datensicherung auf einen externen Datenträger durchführen, Datensicherung auf externe Datenträger - Datensicherheit Grundsätze 02 - Sicherungsmethode / FreeCommander

Mehr

MuP-Arbeitshilfen. Kreativität organisieren Der innovative Prozess. Problem-Phase

MuP-Arbeitshilfen. Kreativität organisieren Der innovative Prozess. Problem-Phase MuP-Arbeitshilfen Kreativität organisieren Der innovative Prozess Kreativität und Organisation erscheinen zunächst als Gegensatz. Gerade die Verbindung aus einem eher sprunghaften, emotionalen und einem

Mehr

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar 2013. CAP-News 40

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar 2013. CAP-News 40 CAP-News 40 CAP-News ist in unrägelmäßigen Abständen erscheinende Information zum Produktkonfigurator CAP/VARIANTS. Hier werden die neuen Befehle, Funktionen und Möglichkeiten beschrieben. In CAP-News

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Lineare Gleichungssysteme 1 Zwei Gleichungen mit zwei Unbekannten Es kommt häufig vor, dass man nicht mit einer Variablen alleine auskommt, um ein Problem zu lösen. Das folgende Beispiel soll dies verdeutlichen

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

15 Optimales Kodieren

15 Optimales Kodieren 15 Optimales Kodieren Es soll ein optimaler Kodierer C(T ) entworfen werden, welcher eine Information (z.b. Text T ) mit möglichst geringer Bitanzahl eindeutig überträgt. Die Anforderungen an den optimalen

Mehr

Monitore. Klicken bearbeiten

Monitore. Klicken bearbeiten Sascha Kretzschmann Institut für Informatik Monitore Formatvorlage und deren Umsetzung des Untertitelmasters durch Klicken bearbeiten Inhalt 1. Monitore und Concurrent Pascal 1.1 Warum Monitore? 1.2 Monitordefinition

Mehr

Constraint-Algorithmen in Kürze - Mit der Lösung zur Path-Consistency-Aufgabe 9

Constraint-Algorithmen in Kürze - Mit der Lösung zur Path-Consistency-Aufgabe 9 Constraint-Algorithmen in Kürze - Mit der Lösung zur Path-Consistency-Aufgabe 9 Prof. Dr. W. Conen Version 1.0c Januar 2009 Genereller Ablauf der Suche Gegeben: Variablen X, Domains D, Constraints R (explizit

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

Die vorliegende Arbeitshilfe befasst sich mit den Anforderungen an qualitätsrelevante

Die vorliegende Arbeitshilfe befasst sich mit den Anforderungen an qualitätsrelevante ISO 9001:2015 Die vorliegende Arbeitshilfe befasst sich mit den Anforderungen an qualitätsrelevante Prozesse. Die ISO 9001 wurde grundlegend überarbeitet und modernisiert. Die neue Fassung ist seit dem

Mehr

Gleichungen Lösen. Ein graphischer Blick auf Gleichungen

Gleichungen Lösen. Ein graphischer Blick auf Gleichungen Gleichungen Lösen Was bedeutet es, eine Gleichung zu lösen? Was ist überhaupt eine Gleichung? Eine Gleichung ist, grundsätzlich eine Aussage über zwei mathematische Terme, dass sie gleich sind. Ein Term

Mehr

Synchronisierung von Transaktionen ohne Sperren. Annahme: Es gibt eine Methode, zu erkennen, wann eine Transaktion die serielle Ordnung verletzt.

Synchronisierung von Transaktionen ohne Sperren. Annahme: Es gibt eine Methode, zu erkennen, wann eine Transaktion die serielle Ordnung verletzt. OPTIMISTIC CONCURRENCY CONTROL Synchronisierung von Transaktionen ohne Sperren. Annahme: Es gibt eine Methode, zu erkennen, wann eine Transaktion die serielle Ordnung verletzt. Abbruch einer Transaktion

Mehr

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland OECD Programme for International Student Assessment Deutschland PISA 2000 Lösungen der Beispielaufgaben aus dem Mathematiktest Beispielaufgaben PISA-Hauptstudie 2000 Seite 3 UNIT ÄPFEL Beispielaufgaben

Mehr

Aufgabenset 1 (abzugeben 16.03.2012 an LK@wacc.de)

Aufgabenset 1 (abzugeben 16.03.2012 an LK@wacc.de) Aufgabenset 1 (abzugeben 16.03.2012 an LK@wacc.de) Aufgabe 1 Betrachten Sie die Cashflows der Abbildung 1 (Auf- und Abwärtsbewegungen finden mit gleicher Wahrscheinlichkeit statt). 1 Nehmen Sie an, dass

Mehr

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 4 Die Datenbank Kuchenbestellung In diesem Kapitel werde ich die Theorie aus Kapitel 2 Die Datenbank Buchausleihe an Hand einer weiteren Datenbank Kuchenbestellung

Mehr

Aus Knoten und Kanten, die Bezeichnungen haben können. Ein Graph, bei dem die Kanten Richtungen haben.

Aus Knoten und Kanten, die Bezeichnungen haben können. Ein Graph, bei dem die Kanten Richtungen haben. ormale Methoden der Informatik WS 2/2 Lehrstuhl für atenbanken und Künstliche Intelligenz ProfrrJRadermacher H Ünver T Rehfeld J ollinger 3 ufgabenblatt esprechung in den Tutorien vom 72 (ab Übungstermin)

Mehr

Mandant in den einzelnen Anwendungen löschen

Mandant in den einzelnen Anwendungen löschen Mandant in den einzelnen Anwendungen löschen Bereich: ALLGEMEIN - Info für Anwender Nr. 6056 Inhaltsverzeichnis 1. Allgemein 2. FIBU/ANLAG/ZAHLUNG/BILANZ/LOHN/BELEGTRANSFER 3. DMS 4. STEUERN 5. FRISTEN

Mehr

Algorithmen und Datenstrukturen 2

Algorithmen und Datenstrukturen 2 Algorithmen und Datenstrukturen 2 Sommersemester 2006 3. Vorlesung Peter F. Stadler Universität Leipzig Institut für Informatik studla@bioinf.uni-leipzig.de Algorithmen für Graphen Fragestellungen: Suche

Mehr

Plotten von Linien ( nach Jack Bresenham, 1962 )

Plotten von Linien ( nach Jack Bresenham, 1962 ) Plotten von Linien ( nach Jack Bresenham, 1962 ) Ac Eine auf dem Bildschirm darzustellende Linie sieht treppenförmig aus, weil der Computer Linien aus einzelnen (meist quadratischen) Bildpunkten, Pixels

Mehr

Informatik Kurs Simulation. Hilfe für den Consideo Modeler

Informatik Kurs Simulation. Hilfe für den Consideo Modeler Hilfe für den Consideo Modeler Consideo stellt Schulen den Modeler kostenlos zur Verfügung. Wenden Sie sich an: http://consideo-modeler.de/ Der Modeler ist ein Werkzeug, das nicht für schulische Zwecke

Mehr

Informatik I WS 07/08 Tutorium 24

Informatik I WS 07/08 Tutorium 24 Info I Tutorium 24 Informatik I WS 07/08 Tutorium 24 3.2.07 astian Molkenthin E-Mail: infotut@sunshine2k.de Web: http://infotut.sunshine2k.de Organisatorisches / Review is zum 2.2 müssen alle Praxisaufgaben

Mehr

1) Farbsteuergerät in der Nikobus-Software unter Modul zufügen hinzufügen.

1) Farbsteuergerät in der Nikobus-Software unter Modul zufügen hinzufügen. Programmierung des Farbsteuergeräts 340-00112 für Nikobus Diese Bedienungsanleitung gilt auch für die Nikobus-Produkte 340-00111 und 340-00113. Achtung: einige der aufgeführten Betriebsarten sind nur auf

Mehr

Speicher in der Cloud

Speicher in der Cloud Speicher in der Cloud Kostenbremse, Sicherheitsrisiko oder Basis für die unternehmensweite Kollaboration? von Cornelius Höchel-Winter 2013 ComConsult Research GmbH, Aachen 3 SYNCHRONISATION TEUFELSZEUG

Mehr

Projektmanagement in der Spieleentwicklung

Projektmanagement in der Spieleentwicklung Projektmanagement in der Spieleentwicklung Inhalt 1. Warum brauche ich ein Projekt-Management? 2. Die Charaktere des Projektmanagement - Mastermind - Producer - Projektleiter 3. Schnittstellen definieren

Mehr

Algorithmen und Datenstrukturen. Große Übung vom 29.10.09 Nils Schweer

Algorithmen und Datenstrukturen. Große Übung vom 29.10.09 Nils Schweer Algorithmen und Datenstrukturen Große Übung vom 29.10.09 Nils Schweer Diese Folien Braucht man nicht abzuschreiben Stehen im Netz unter www.ibr.cs.tu-bs.de/courses/ws0910/aud/index.html Kleine Übungen

Mehr

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes. Binäre Bäume Definition: Ein binärer Baum T besteht aus einer Menge von Knoten, die durch eine Vater-Kind-Beziehung wie folgt strukturiert ist: 1. Es gibt genau einen hervorgehobenen Knoten r T, die Wurzel

Mehr

Pflegeberichtseintrag erfassen. Inhalt. Frage: Antwort: 1. Voraussetzungen. Wie können (Pflege-) Berichtseinträge mit Vivendi Mobil erfasst werden?

Pflegeberichtseintrag erfassen. Inhalt. Frage: Antwort: 1. Voraussetzungen. Wie können (Pflege-) Berichtseinträge mit Vivendi Mobil erfasst werden? Connext GmbH Balhorner Feld 11 D-33106 Paderborn FON +49 5251 771-150 FAX +49 5251 771-350 hotline@connext.de www.connext.de Pflegeberichtseintrag erfassen Produkt(e): Vivendi Mobil Kategorie: Allgemein

Mehr

1. Einführung 2. 2. Erstellung einer Teillieferung 2. 3. Erstellung einer Teilrechnung 6

1. Einführung 2. 2. Erstellung einer Teillieferung 2. 3. Erstellung einer Teilrechnung 6 Inhalt 1. Einführung 2 2. Erstellung einer Teillieferung 2 3. Erstellung einer Teilrechnung 6 4. Erstellung einer Sammellieferung/ Mehrere Aufträge zu einem Lieferschein zusammenfassen 11 5. Besonderheiten

Mehr

Sortierverfahren für Felder (Listen)

Sortierverfahren für Felder (Listen) Sortierverfahren für Felder (Listen) Generell geht es um die Sortierung von Daten nach einem bestimmten Sortierschlüssel. Es ist auch möglich, daß verschiedene Daten denselben Sortierschlüssel haben. Es

Mehr

4. Lernen von Entscheidungsbäumen. Klassifikation mit Entscheidungsbäumen. Entscheidungsbaum

4. Lernen von Entscheidungsbäumen. Klassifikation mit Entscheidungsbäumen. Entscheidungsbaum 4. Lernen von Entscheidungsbäumen Klassifikation mit Entscheidungsbäumen Gegeben sei eine Menge von Objekten, die durch /Wert- Paare beschrieben sind. Jedes Objekt kann einer Klasse zugeordnet werden.

Mehr

Alle Schlüssel-Karten (blaue Rückseite) werden den Schlüssel-Farben nach sortiert und in vier getrennte Stapel mit der Bildseite nach oben gelegt.

Alle Schlüssel-Karten (blaue Rückseite) werden den Schlüssel-Farben nach sortiert und in vier getrennte Stapel mit der Bildseite nach oben gelegt. Gentlemen", bitte zur Kasse! Ravensburger Spiele Nr. 01 264 0 Autoren: Wolfgang Kramer und Jürgen P. K. Grunau Grafik: Erhard Dietl Ein Gaunerspiel für 3-6 Gentlemen" ab 10 Jahren Inhalt: 35 Tresor-Karten

Mehr

Anzeige von eingescannten Rechnungen

Anzeige von eingescannten Rechnungen Anzeige von eingescannten Rechnungen Wenn Sie sich zu einer Eingangsrechnung die eingescannte Originalrechnung ansehen möchten, wählen Sie als ersten Schritt aus Ihrem Benutzermenü unter dem Kapitel Eingangsrechnung

Mehr

Die Lernumgebung des Projekts Informationskompetenz

Die Lernumgebung des Projekts Informationskompetenz Beitrag für Bibliothek aktuell Die Lernumgebung des Projekts Informationskompetenz Von Sandra Merten Im Rahmen des Projekts Informationskompetenz wurde ein Musterkurs entwickelt, der den Lehrenden als

Mehr

Erstellen von x-y-diagrammen in OpenOffice.calc

Erstellen von x-y-diagrammen in OpenOffice.calc Erstellen von x-y-diagrammen in OpenOffice.calc In dieser kleinen Anleitung geht es nur darum, aus einer bestehenden Tabelle ein x-y-diagramm zu erzeugen. D.h. es müssen in der Tabelle mindestens zwei

Mehr

Lernerfolge sichern - Ein wichtiger Beitrag zu mehr Motivation

Lernerfolge sichern - Ein wichtiger Beitrag zu mehr Motivation Lernerfolge sichern - Ein wichtiger Beitrag zu mehr Motivation Einführung Mit welchen Erwartungen gehen Jugendliche eigentlich in ihre Ausbildung? Wir haben zu dieser Frage einmal die Meinungen von Auszubildenden

Mehr

Modellbildungssysteme: Pädagogische und didaktische Ziele

Modellbildungssysteme: Pädagogische und didaktische Ziele Modellbildungssysteme: Pädagogische und didaktische Ziele Was hat Modellbildung mit der Schule zu tun? Der Bildungsplan 1994 formuliert: "Die schnelle Zunahme des Wissens, die hohe Differenzierung und

Mehr

Die elektronische Rechnung als Fortsetzung der elektronischen Beauftragung so einfach geht es:

Die elektronische Rechnung als Fortsetzung der elektronischen Beauftragung so einfach geht es: Bei Rückfragen erreichen Sie uns unter 0571-805474 Anleitung Die elektronische Rechnung als Fortsetzung der elektronischen Beauftragung so einfach geht es: Inhalt 1 Hintergrund zur elektronischen Rechnung

Mehr

Wie Sie mit Mastern arbeiten

Wie Sie mit Mastern arbeiten Wie Sie mit Mastern arbeiten Was ist ein Master? Einer der großen Vorteile von EDV besteht darin, dass Ihnen der Rechner Arbeit abnimmt. Diesen Vorteil sollten sie nutzen, wo immer es geht. In PowerPoint

Mehr

Pädagogik. Melanie Schewtschenko. Eingewöhnung und Übergang in die Kinderkrippe. Warum ist die Beteiligung der Eltern so wichtig?

Pädagogik. Melanie Schewtschenko. Eingewöhnung und Übergang in die Kinderkrippe. Warum ist die Beteiligung der Eltern so wichtig? Pädagogik Melanie Schewtschenko Eingewöhnung und Übergang in die Kinderkrippe Warum ist die Beteiligung der Eltern so wichtig? Studienarbeit Inhaltsverzeichnis 1. Einleitung.2 2. Warum ist Eingewöhnung

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Brückenkurs Mathematik TU Dresden 2015 Lineare Gleichungssysteme Schwerpunkte: Modellbildung geometrische Interpretation Lösungsmethoden Prof. Dr. F. Schuricht TU Dresden, Fachbereich Mathematik auf der

Mehr

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 -

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 - Matrix42 Use Case - Sicherung und Rücksicherung persönlicher Version 1.0.0 23. September 2015-1 - Inhaltsverzeichnis 1 Einleitung 3 1.1 Beschreibung 3 1.2 Vorbereitung 3 1.3 Ziel 3 2 Use Case 4-2 - 1 Einleitung

Mehr

WS 2013/14. Diskrete Strukturen

WS 2013/14. Diskrete Strukturen WS 2013/14 Diskrete Strukturen Prof. Dr. J. Esparza Lehrstuhl für Grundlagen der Softwarezuverlässigkeit und theoretische Informatik Fakultät für Informatik Technische Universität München http://www7.in.tum.de/um/courses/ds/ws1314

Mehr

Ein neues System für die Allokation von Spenderlungen. LAS Information für Patienten in Deutschland

Ein neues System für die Allokation von Spenderlungen. LAS Information für Patienten in Deutschland Ein neues System für die Allokation von Spenderlungen LAS Information für Patienten in Deutschland Ein neues System für die Allokation von Spenderlungen Aufgrund des immensen Mangels an Spenderorganen

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

LU-Zerlegung. Zusätze zum Gelben Rechenbuch. Peter Furlan. Verlag Martina Furlan. Inhaltsverzeichnis. 1 Definitionen.

LU-Zerlegung. Zusätze zum Gelben Rechenbuch. Peter Furlan. Verlag Martina Furlan. Inhaltsverzeichnis. 1 Definitionen. Zusätze zum Gelben Rechenbuch LU-Zerlegung Peter Furlan Verlag Martina Furlan Inhaltsverzeichnis Definitionen 2 (Allgemeine) LU-Zerlegung 2 3 Vereinfachte LU-Zerlegung 3 4 Lösung eines linearen Gleichungssystems

Mehr

LIFO Kurzinformation zur Methode

LIFO Kurzinformation zur Methode LIFO Kurzinformation zur Methode Grundlagen LIFO steht für Life Orientations. Die von den Sozialpsychologen Dr. Allan Katcher und Dr. Stuart Atkins entwickelte Methode ist besonders hilfreich, um die Wahrnehmung

Mehr

Umfrage in den 5er-Klassen zu Hausaufgaben in den Nebenfächern im Schuljahr 2014/15

Umfrage in den 5er-Klassen zu Hausaufgaben in den Nebenfächern im Schuljahr 2014/15 Umfrage in den 5er-Klassen zu Hausaufgaben in den Nebenfächern im Schuljahr /5 Ausgangsituation Beim letzten offenen Gesprächsabend im Schuljahr /5 wurde von Eltern aus 5er Klassen beanstandet, dass nicht

Mehr

Einführung in die Algebra

Einführung in die Algebra Prof. Dr. H. Brenner Osnabrück SS 2009 Einführung in die Algebra Vorlesung 13 Einheiten Definition 13.1. Ein Element u in einem Ring R heißt Einheit, wenn es ein Element v R gibt mit uv = vu = 1. DasElementv

Mehr

Quadratische Gleichungen

Quadratische Gleichungen Quadratische Gleichungen Aufgabe: Versuche eine Lösung zu den folgenden Zahlenrätseln zu finden:.) Verdoppelt man das Quadrat einer Zahl und addiert, so erhält man 00..) Addiert man zum Quadrat einer Zahl

Mehr

Checkliste. Prioritäten setzen mit dem Pareto-Prinzip

Checkliste. Prioritäten setzen mit dem Pareto-Prinzip Checkliste Prioritäten setzen mit dem Pareto-Prinzip Checkliste Prioritäten setzen mit dem Pareto-Prinzip Das Pareto-Prinzip ist eine Methode des Zeitmanagements. Diese Checkliste stellt Ihnen das Pareto-Prinzip

Mehr

Stammdatenanlage über den Einrichtungsassistenten

Stammdatenanlage über den Einrichtungsassistenten Stammdatenanlage über den Einrichtungsassistenten Schritt für Schritt zur fertig eingerichteten Hotelverwaltung mit dem Einrichtungsassistenten Bitte bereiten Sie sich, bevor Sie starten, mit der Checkliste

Mehr

Access [basics] Gruppierungen in Abfragen. Beispieldatenbank. Abfragen gruppieren. Artikel pro Kategorie zählen

Access [basics] Gruppierungen in Abfragen. Beispieldatenbank. Abfragen gruppieren. Artikel pro Kategorie zählen Abfragen lassen sich längst nicht nur dazu benutzen, die gewünschten Felder oder Datensätze einer oder mehrerer Tabellen darzustellen. Sie können Daten auch nach bestimmten Kriterien zu Gruppen zusammenfassen

Mehr

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel 3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel EADS 3.1 Konstruktion von minimalen Spannbäumen 16/36

Mehr

«Initialpfad / teilnehmerspezifische Pfade» Kurzanleitung

«Initialpfad / teilnehmerspezifische Pfade» Kurzanleitung QuickStart «Initialpfad / teilnehmerspezifische Pfade» Kurzanleitung Initialpfad Initialpfad für alle Teilnehmenden Beispiel: Ihr Fragebogen enthält 58 Fragen. Möchten Sie, dass Ihre Teilnehmer grundsätzlich

Mehr

4. BEZIEHUNGEN ZWISCHEN TABELLEN

4. BEZIEHUNGEN ZWISCHEN TABELLEN 4. BEZIEHUNGEN ZWISCHEN TABELLEN Zwischen Tabellen können in MS Access Beziehungen bestehen. Durch das Verwenden von Tabellen, die zueinander in Beziehung stehen, können Sie Folgendes erreichen: Die Größe

Mehr

Algorithmische Mathematik

Algorithmische Mathematik Algorithmische Mathematik Wintersemester 2013 Prof. Dr. Marc Alexander Schweitzer und Dr. Einar Smith Patrick Diehl und Daniel Wissel Übungsblatt 6. Abgabe am 02.12.2013. Aufgabe 1. (Netzwerke und Definitionen)

Mehr