Slides

```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>();
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
if (tree == null)
return null;
if (tree.left == null)
return new UnlinkSmallestResult<T>(tree, tree.right);
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
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
Ü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
```