Übungen zum Vortrag „Backtracking mit Heuristiken“

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Algorithmische Anwendung
Zusammenfassung der Vorwoche
Kapselung , toString , equals , Java API
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
Sortieren mit Binären Bäumen
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
DO...WHILE Anweisung.
Prinzipien des Algorithmenentwurfs Backtracking Prof. Dr. Th. Ottmann
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (04 – Entwurfsverfahren) Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Einführung in die Programmierung mit Java
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Einführung in die Programmierung Datensammlung
Einführung in die Programmierung Anweisungen und Datentypen
Thema: Fibonacci-Zahlen
Weitere Beispiele für Verzweigung mit und ohne Turtle
Informatikunterricht mit Java
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sitzung 3: Klassen, Objekte, Arrays und Kontrollstrukturen
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Rekursive Funktionen (Fakultät)
Backtracking mit Heuristiken
Rekursion mit Listen: Quicksort
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
2.4 Rekursion Klassifikation und Beispiele
Objektorientiertes Konstruieren
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
CuP - Java Sechste Vorlesung Entspricht ungefähr Kapitel 3. 1 – 3
Informatik Datenstruktur Graph 3.3 Durchlaufen von Graphen
Programmierung von Agenten in Java: Implementierung einer Supply-Chain
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Java-Kurs - 6. Übung Besprechung der Hausaufgabe
© 2004 Pohlig Informatik Kurse © 2004 Pohlig Informatik Kurse Der Tramp tanzt die Rekursion zünderUntersuchen(…) Basisfall Rückmeldung:
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Algorithmen und Datenstrukturen 1 SS 2002
Java-Kurs - 6. Übung Besprechung der Hausaufgabe
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Schleifen mit der Turtle
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
JAVA lernen: Methoden.
Felder in Java.
Implementieren von Klassen
 Präsentation transkript:

Übungen zum Vortrag „Backtracking mit Heuristiken“ Java-Implementierung studieren von „Backtracking im Labyrinth“ Pseudocode schreiben zu „Backtracking beim n Damen Problem“ Implementierung der Springerwege (optional)

A) Java-Implementierung studieren von „Backtracking im Labyrinth“ Vorgehen: Handouts zu den Vortragsfolien und Sourcecode zum Programm „Labyrinth“ verteilen. 2. Die Schüler studieren den Pseudocode zu „Backtracking im Labyrinth“ im Handout und vergleichen mit der Java Implementierung FindeLoesung aus Labyrinth.java. 3. Besprechung der Java Implementierung anhand der folgenden Folien.

A) Java-Implementierung „Labyrinth“ Zuerst definieren wir eine Datenstruktur, welche die Lösung des Labyrinths enthalten wird. Als Lösung werden die Labyrinthfelder auf dem gefundenen Weg in der Besuchsreihenfolge durchnummeriert. public class Lsg { int[][] feld; // Labyrinthfelder im 2D-Koord.system public Lsg(int K, int L) { // Konstruktor feld = new int[K][L]; // Labyrinth mit KxL Feldern }

A) Java-Implementierung „Labyrinth“ Aufruf von FindeLoesung: // Zufälliges Labyrinth erzeugen, // Start (startX, startY) und Ziel (zielX, zielY) definieren // und Datenstruktur loesung für Lösung mit new erzeugen newLabyrinth(12,12); // Startfeld markieren loesung.feld[startX][startY] = 1; // FindeLoesung(int index, Lsg loesung, int aktX, int aktY) if (FindeLoesung(2, loesung, startX, startY)) { // Die gefundene Lösung steht in loesung System.out.println(„Loesung gefunden!“); } else System.out.println(„Keine Loesung!“);

A) Java-Implementierung „Labyrinth“ Java-Implementierung von FindeLoesung: final static int LEER = 0, SACKGASSE = -1; // Feldinformation final static int[] STEPX = { 0, 1, 0,-1 }; // STEPX,-Y: Schritte final static int[] STEPY = { -1, 0, 1, 0 }; // in alle Richtungen   boolean FindeLoesung(int index, Lsg loesung, int aktX, int aktY) { // index = aktuelle Schrittzahl // loesung = Referenz auf bisherige Teil-Lösung // aktX, aktY = aktuelle Feldposition im Labyrinth int schritt = -1; // while(es gibt es noch neue Teil-Lösungsschritte) while (schritt != LINKS) { // Wähle einen neuen Teil-Lösungsschritt schritt; schritt ++; // Weg nach 1. oben, 2. rechts, 3. unten // und 4. links zu erweitern versuchen. int neuX = aktX + STEPX[schritt]; int neuY = aktY + STEPY[schritt];

A) Java-Implementierung „Labyrinth“ // Tests, ob schritt gültig ist   boolean ok = true; // Test, ob schritt innerhalb Brett bleibt if (neuX < 0 || neuX >= K) ok = false; if (neuY < 0 || neuY >= L) ok = false; // Test, ob schritt durch Wand führt (sofern innerhalb) if (ok && hatWand(aktX,aktY,neuX,neuY,schritt)) ok = false; // Test, ob schritt auf ein bereits besuchtes Feld führt if (ok && loesung.feld[neuX][neuY] != LEER) // if (schritt ist gültig) if (ok) { // Erweitere loesung um schritt // Markiere neues Feld mit aktueller Schrittzahl loesung.feld[neuX][neuY] = index;

A) Java-Implementierung „Labyrinth“   // if (loesung noch nicht vollständig) if (!ausgangGefunden(neuX, neuY) { // rekursiver Aufruf von FindeLoesung if (FindeLoesung(index+1, loesung, neuX, neuY)) { // Lösung gefunden return true; } else { // Wir sind in einer Sackgasse: // Mache schritt rückgängig: Backtracking loesung.feld[neuX][neuY] = SACKGASSE; } } else return true; // Lösung gefunden -> fertig return false; // keine Lösung gefunden // Bei true als Rückgabewert steht die Lösung in loesung

B) Pseudocode schreiben zu „Backtracking beim n Damen Problem“ Vorgehen: Aufgabenstellung (gemäss folgender zwei Folien) vorstellen. Die Schüler erarbeiten selbständig einen Lösungs- vorschlag zum n Damenproblem als Pseudocode. Sie können dabei auf das Handout und die Lösung zum Labyrinth zurückgreifen. 3. Lösung als Pseudocode vorstellen (gemäss Folien). 4. Demontration des animierten Algorithmus mit dem Javaprogramm „Dame“.

B) Das n Damenproblem als Pseudocode Aufgabe: Stellen Sie n Damen auf einem nxn Schachbrett so auf, dass keine die andere bedroht. Lösen Sie diese Aufgabe auf Papier in Java und Pseudocode mit einem Backtracking Algorithmus für 3 <= n <= 14. Nehmen Sie den Code zum allgemeinen Backtracking Algorithmus als Ausgangslage. Sie haben 20 Minuten Zeit. Details: Eine Dame bedroht gegnerische Schachfiguren, die auf der gleichen Zeile, Spalte oder Diagonale stehen wie sie. Die Prozedur soll folgende Signatur haben: boolean FindeLoesung(int spalte, DameLsg loesung) Sie wird als FindeLoesung(1, loesung) aufgerufen. Das Resultat steht bei Rückgabe von true in loesung.

B) Das n Damenproblem als Pseudocode Hinweise zur Implementierung: Für eine effiziente Implementierung soll die Stellung der Damen in folgenden Variablen gehalten werden: boolean z[] = new boolean[n]; // besetzte Zeile boolean d1[] = new boolean[2n]; // besetzte / Diagonalen boolean d2[] = new boolean[2n-1]; // besetzte \ Diagonalen int dame[] = new int[n]; // i-te Dame steht in Spalte i und Zeile dame[i] Diese Variablen sind in der Klasse DameLsg enthalten und mit loesung.z, loesung.d1 usw. ansprechbar. Sie verhindern, dass das Schachbrett zeilen-, spalten- und diagonalenweise nach Bedrohungen abgesucht werden muss. Bem. Zeilen- und Spaltennummern beginnen hier mit 0.

B) Das n Damenproblem als Pseudocode Lösung als Pseudocode: boolean FindeLoesung(int spalte, DameLsg loesung) { // spalte = aktuelle Schrittzahl und zugleich aktuelle Spalte // loesung = Referenz auf bisherige Teil-Lösung int zeile = -1;   // while(es gibt es noch neue Teil-Lösungsschritte) while (zeile != n-1) { // Wähle einen neuen Teil-Lösungsschritt schritt; zeile++; // Zeilen von oben nach unten ausprobieren // if (schritt ist gültig), if („Dame (zeile, spalte) wird nicht bedroht“) { // Erweitere loesung um schritt „Platziere Dame auf (zeile, spalte) in dame[] und führe die neu ausgeübten Bedrohungen in z, d1, d2 nach.“

B) Das n Damenproblem als Pseudocode Lösung als Pseudocode (Fortsetzung): // if (loesung noch nicht vollständig) if (spalte != n-1) { // rekursiver Aufruf von FindeLoesung if (FindeLoesung(spalte+1, loesung)) { // Lösung gefunden return true; } else { // Wir sind in einer Sackgasse: „Mache schritt rückgängig mit Backtracking: Lösche Dame und ihre ausgeübten Bedrohungen.“ } } else return true; // Lösung gefunden -> fertig } return false; // keine Lösung gefunden

C) Implementierung der Springerwege (optional) Aufgabe: Als grössere optionale Übung implementieren die Schüler den im Vortrag vorgestellten Backtracking Algorithmus zu den Springerwegen inklusive der Heuristik von Warnsdorf. Damit sollen dann mögliche Springerwege für verschiedene Schachbrettgrössen berechnet werden. Zusatz: Springerkreise finden (Startfeld = Endfeld) Erklären, warum es bei nxn mit n ungerade keinen Springerkreis geben kann