Raphael Fischer fischrap@student.ethz.ch 17.04.2014 Informatik II - Übung 08 Raphael Fischer fischrap@student.ethz.ch 17.04.2014
U8.A1 a) und b): Binäre Suche Entscheidungsbäume Hier eigentlich kein Baum sondern eine Kette von Entscheidungen Raphael Fischer 02.12.2018
U8.A1 d): Binäre Suche Implementierung Wieder Key-Value-Konzept: public Value find(List<Unit<Key, Value>> haystack, Key needle); Generics FTW: public interface IBinarySearch<Key extends Comparable<Key>, Value> { Wichtig: Seid euch bewusst, ob end-Pointer past-the end ist oder nicht! Abstrakte Klasse. Konkrete Implementierungen: ArrayList LinkedList Spezielle Klasse für Key-Value Paare Raphael Fischer 02.12.2018
Theorie: Backtracking Raphael Fischer 02.12.2018
Theorie: Backtracking Raphael Fischer 02.12.2018
Theorie: Backtracking Tree-pruning Raphael Fischer 02.12.2018
Backtracking Grundgerüst Funktion, die einen Schritt näher zur Lösung gehen soll: Iteriere durch alle Möglichkeiten für diesen Schritt: 1. Prüfe, ob die Möglichkeit möglich ist Falls ja: Lösung kopieren Schritt in Kopie reinschreiben Rekursion mit Kopie Schritt in Lösung reinschreiben Rekursion Schritt rückgängig machen o d e r Raphael Fischer 02.12.2018
Aufgabe: Sudoku-Backtracking Funktion, die einen Schritt näher zur Lösung gehen soll: Iteriere durch alle Möglichkeiten für diesen Schritt: 1. Prüfe, ob die Möglichkeit möglich ist Falls ja: Lösung kopieren Schritt in Kopie reinschreiben Rekursion mit Kopie Schritt in Lösung reinschreiben Rekursion Schritt rückgängig machen o d e r Raphael Fischer 02.12.2018
U8.A2 Rucksackproblem mit Backtracking Problembeschreibung: k Gegenstände x1, ..., xk; Jeweils bekannter Wert und Gewicht Auswahl von Gegenständen, so dass Gesamtgewicht nicht überschritten wird Optimierungsproblem: Maximieren des Wertes der ausgewählten Gegenstände Raphael Fischer 02.12.2018
U8.A2 Rucksackproblem und Backtracking Raphael Fischer
U8.A2 a) Lösung eindeutig? Beweis Beweis-Aufgabe. Tipp: Etwas nachdenken und Vermutung anstellen Entweder Gegenbeispiel Falls nicht möglich: Beweis Raphael Fischer 02.12.2018
U8.A2 b) Implementierung: Bruteforce public interface IRucksack { public Selection findBest(ArrayList<Integer> values, ArrayList<Integer> weights, int maxWeight); } Alle möglichen Kombinationen ausprobieren Raphael Fischer 02.12.2018
Summiert diejenigen Einträge in addends auf, bei denen das Bit 1 ist U8.A2 b) Implementierung: Bruteforce Nützlich: Selection-Klasse: public class Selection { private int bits; private int size; public void setBits(int bits)//... public int bits()//... public void set(int index, boolean value)//... public boolean get(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } int mask = 1 << index; return (bits & mask) != 0; } public int sum(ArrayList<Integer> addends)//... } Summiert diejenigen Einträge in addends auf, bei denen das Bit 1 ist Raphael Fischer 02.12.2018
U8.A2 b) Implementierung: Bruteforce Wie durch alle möglichen Selektionen iterieren? Binärzahl mit #Stellen = #Gegenstände Hochzählen von 00…000 bis 11…111 Selection benutzen Raphael Fischer 02.12.2018
U8.A2 c) Backtracking Iteration Gewicht 12 kg 1 kg 4 kg 2 kg Wert $4 $2 $10 $1 Genommen? Nein Ja Todo Funktion, die einen Schritt näher zur Lösung gehen soll: Iteriere durch alle Möglichkeiten für diesen Schritt: 1. Prüfe, ob die Möglichkeit möglich ist Falls ja: Lösung kopieren Schritt in Kopie reinschreiben Rekursion mit Kopie Hier nur zwei Möglichkeiten: Nehme es nehme es nicht Lösung = Selection Schritt in Lösung reinschreiben Rekursion Schritt rückgängig machen o d e r Raphael Fischer 02.12.2018
Reversi Raphael Fischer 02.12.2018
U8.A3: Reversi (Teil 2): checkMove() Implementation von ICheckMove ohne das Framework Alle 8 Richtungen durchgehen. Schöne Variante: for (int dx=-1; dx<=1; dx++) { for (int dy=-1; dy<=1; dy++) { if (x == 0 && y == 0) continue; //Prüfe, ob es in diese Richtung eine Reihe von Gegner-Steinen gibt und dann ein eigener Nützliche Funktion: gb.getOccupation(coordinates) == GameBoard.empty Raphael Fischer 02.12.2018
U8.A3: greedyPlayer() Einfacher Computergegner Tipps Schaut einen Zug voraus Bester Zug: Zug, nach dessen Durchführung man maximal mehr Steine besitzt als der Gegner Tipps Code von letztem Mal recyceln Hier dürft ihr GameBoard.checkMove() verwenden Für alle möglichen Züge: Board kopieren (mit gb.clone()) Zug nochmal überprüfen Zug ausführen Bewerten mit gb.countStones(color) Raphael Fischer 02.12.2018
…viel Spass! Raphael Fischer 02.12.2018