Informatik II Übung 8 Gian Ulli [email protected] n.ethz.ch/~ug/ Folien z.T. von Gábor Sörös übernommen Gian Ulli | 22.04.15 | 1 Aufgabe 7.1 – Tic-Tac-Toe MAX Strategie von MAX MIN MAX MIN Gian Ulli | 22.04.15 | 2 Aufgabe 7.2 @Override public int height(BinarySearchTree<T> tree) { if (tree == null) return 0; return 1 + Math.max(height(tree.left), height(tree.right)); } @Override public ArrayList<T> inOrder(BinarySearchTree<T> tree) { if (tree == null) return new ArrayList<T>(); ArrayList<T> result = new ArrayList<T>(); result.addAll(inOrder(tree.left)); result.add(tree.thing); result.addAll(inOrder(tree.right)); return result; } Gian Ulli | 22.04.15 | 3 Aufgabe 7.2 @Override public BinarySearchTree<T> insert(BinarySearchTree<T> tree, int key, T thing) { if (tree == null) return new BinarySearchTree<T>(key, thing); if (key == tree.key) { tree.thing = thing; } else if (key < tree.key) { tree.left = insert(tree.left, key, thing); } else { tree.right = insert(tree.right, key, thing); } return tree; } Gian Ulli | 22.04.15 | 4 Aufgabe 7.2 @Override public UnlinkSmallestResult<T> unlinkSmallest(BinarySearchTree<T> tree){ if (tree == null) return null; if (tree.left == null) return new UnlinkSmallestResult<T>(tree, tree.right); UnlinkSmallestResult<T> result = unlinkSmallest(tree.left); tree.left = result.tree; result.tree = tree; return result; } Gian Ulli | 22.04.15 | 5 Aufgabe 7.2 @Override public BinarySearchTree<T> remove(BinarySearchTree<T> tree, int key) { if (tree == null) return null; if (key < tree.key) { tree.left = remove(tree.left, key); return tree; } else if (key > tree.key) { tree.right = remove(tree.right, key); return tree; } // Root has to be removed // ... Gian Ulli | 22.04.15 | 6 Aufgabe 7.2 @Override public BinarySearchTree<T> remove(BinarySearchTree<T> tree, int key) { // ... if (isLeaf(tree)) return null; if (tree.left == null) return tree.right; if (tree.right == null) return tree.left; // Replace by smallest element of right subtree UnlinkSmallestResult<T> r = unlinkSmallest(tree.right); r.smallest.left = tree.left; r.smallest.right = r.tree; return r.smallest; } Gian Ulli | 22.04.15 | 7 Aufgabe 7.3 Demo Gian Ulli | 22.04.15 | 8 Mehr Generics: extends n Beispiel class MyPair<T> { public T first, second; } n Sortieren von MyPairs nach pair.first? n Schon gesehen: nach Comparable casten n Besser class MyPair<T extends Comparable<T>> { ... } Gian Ulli | 22.04.15 | 9 Mehr Generics: Maps n Oft werden indexierte Daten benötigt n Personalien nach AHV-Nummer (unique id) n Dokumente nach Identifier (z.B. file name) n … n Solche Datenstrukturen nennt man Maps n Identifier (Key) wird auf Inhalt (Value) "gemappt" n In der Java Standardbibliothek n interface Map<Key extends Comparable<Key>, Value> n Implementationen: TreeMap, HashMap, … Gian Ulli | 22.04.15 | 10 Aufgabe 8.1 – Binärsuche § Entscheidungsbaum zeichnen & Überlegungen anstellen § Übereinanderlegen, Faktoren § Implementierung: § find(List<Unit<Key, Value>> haystack, Key needle) § Eine Hilfsfunktion kann nützlich sein § Siehe auch Skript S. 181 (Folie 469) § setFactor(int factor) § Verallgemeinern der Suche à neu auch unbalancierte Suchbäume § getNumberOfCalls() § Benchmarking mit verschiedenen Faktoren § Durschnittliche # rekursiver Aufrufe für verschiedene Faktoren Gian Ulli | 22.04.15 | 11 Aufgabe 8.2– Rucksackproblem Gian Ulli | 22.04.15 | 12 Aufgabe 8.2 Das allgemeine Rucksackproblem § k Gegenstände x1, ..., xk; Jeweils bekannter Wert und Gewicht § Auswahl von Gegenständen, sodass Gesamtgewicht nicht überschritten wird § Optimierungsproblem: Maximieren des Wertes der ausgewählten Gegenstände a) b) c) d) Theorie Bruteforce Ansatz Backtracking Ansatz Vergleich von Bruteforce und Backtracking Gian Ulli | 22.04.15 | 13 Aufgabe 8.2 – Teilmengen § Wie viele unterschiedlichen Möglichkeiten hat unser Dieb? § M = Menge der „verfügbaren“ Gegenständen § Der Dieb kann nur eine Teilmenge davon nach Hause bringen § Der Dieb kann auch die leere Menge Ø (fauler Dieb) oder die gesamte Menge M (starker Dieb mit grossem Sack) schaffen! § #Teilmengen := #Elemente in der Potenzmenge von M § Beispiel § à Eine Menge M mit |M|=k besitzt 2^k Teilmengen Gian Ulli | 22.04.15 | 14 Aufgabe 8.2 – Einfache Diebstrategie § Zu implementierendes Verfahren in Pseudocode: 1. Initialisierung 2. Nimm nächste Konfiguration (wie genau…?) 3. Berechne das gesamte Gewicht if (gesamtes Gewicht < G) berechne Gesamtwert if (neuer Gesamtwert > Gesamtwert aktuelle optimale Lösung) aktuelle Konfiguration ist neue optimale Lösung 4. Falls noch Konfigurationen übrig, gehe zu Punkt 2 else Berechnung fertig Gian Ulli | 22.04.15 | 15 Aufgabe 8.2 – Bitwertigkeit § Konfiguration als Bitfolge: class Selection § Die Bitwertigkeit bezeichnet den Stellenwert eines einzelnen Bits, den es durch seine Position innerhalb einer Binärzahl hat. MSB - Most Significant Bit/Byte ‣ Das höchstwertige Bit ist das Bit, das innerhalb der Zahl an der Stelle mit dem höchsten Stellenwert steht. LSB - Least Significant Bit/Byte ‣ Analog dem MSB besitzt das niedrigstwertige Bit den niedrigsten Stellenwert. Gian Ulli | 22.04.15 | 16 Aufgabe 8.2 – Tipps für die Implementation § class Selection ist gut dokumentiert § Achtung: bei Vergrösserung der Konfiguration (neuen Gegenstand in den Sack legen, A1c) muss der neue Stellenwert initialisiert werden § Beispiel-Selections für die Menge M Gian Ulli | 22.04.15 | 17 Aufgabe 8.2 – Tipps für die Implementation Bruteforce Ansatz: public Selection findBest(ArrayList<Integer> values, ArrayList<Integer> weights, int maxWeight) { ... } int last = java.Math.pow(2, values.size()); //Anzahl der Teilmengen for (int i = 0; i < last; i++) { new Selection(values.size(), i); //Selection Bitfeld mit Wert i ... } ... Gian Ulli | 22.04.15 | 18 Aufgabe 8.2 – Backtracking § Was heisst „Backtracking“? § Prinzip: “trial and error” § Beispiel: Ausgang in einem Labyrinth suchen § Sich für eine Richtung entscheiden § In diese Richtung weitergehen § Wenn “letztendlich” erfolglos § zurückkehren und eine andere Richtung wählen § Wenn “letztendlich” erfolgreich § fertig… Backtracking Falls bereits alle Richtungen ausprobiert à noch weiter zurück. Gian Ulli | 22.04.15 | 19 Aufgabe 8.2 – Tipps für die Implementation Backtracking Ansatz: (Hilfsmethode) private Selection backtracking(Selection best, int weight, ArrayList<Integer> values, ArrayList<Integer> weights, int maxWeight){ if (best.size() == values.size()) // Alle Objekte bestimmt --> Abbruch // Selection ohne neuem Objekt Selection without = ...; ... Selection withoutResult = backtracking(...); } // Selection with new object Selection with = ...; ... if (...) { Selection withResult = ...; ... } return ...; Gian Ulli | 22.04.15 | 20 Aufgabe 8.3 – Reversi (Teil 2) HumanPlayer RandomPlayer GreedyPlayer nextMove() nextMove() nextMove() wartet auf Eingabe von der Kommandozeile wählt einen zufälligen (aber gültigen!) nächsten Zug wählt nächsten Zug anhand einer einfachen, nicht-rekursiven Bewertungsfunktion Download Übungsserie 7 Übungsserie 8 Gian Ulli | 22.04.15 | 21 Aufgabe 8.3 – Reversi (Teil 2) a. Implementieren von ICheckMove ohne Framework-Funktion. b. Implementieren eines Spielers, der unter allen möglichen Zügen den besten auswählt Bester Zug: Zug, nach dessen Durchführung man maximal mehr Steine besitzt als der Gegner: «Denktiefe = 1» d.h.: Kein Spielbaum nötig! Ermitteln des besten Zugs: Board kopieren (clone), Zug ausführen, zählen Gian Ulli | 22.04.15 | 22 Aufgabe 8.3 – checkMove() § Überprüfe jede der 8 Richtungen auf dem Brett § In einer „korrekten Richtung“ kommen zuerst Steine des Gegners und dann ein eigener § Es muss mindestens eine korrekte Richtung geben Gian Ulli | 22.04.15 | 23 Aufgabe 8.3 – GreedyPlayer n Einfacher Computergegner n Suchtiefe: 1 (mein Zug) n Bewertungsfunktion: Unterschied der Steine nach dem Zug n Tipps n Ein GameBoard kann mit gb.clone() kopiert werden n Ihr dürft GameBoard.checkMove() hier verwenden n Mit einer etwas intelligenteren Bewertungsfunktion ist schon ein ziemlich starker Gegner möglich (auch ohne Rekursion) Gian Ulli | 22.04.15 | 24
© Copyright 2024