Informatik II
Übung 8
Gian Ulli
ug@student.ethz.ch
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 2025