45
| | Michael Baumann [email protected] n.ethz.ch/~mbauman 27.04.2016 Informatik II Übung 08

Folienmaster ETH Zürichn.ethz.ch/~mbauman/inf/Tipps8.pdf · Michael Baumann [email protected] n.ethz.ch/~mbauman 27.04.2016 Informatik II Übung 08 | |

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • ||

    Michael [email protected]/~mbauman27.04.2016

    Informatik IIÜbung 08

    mailto:[email protected]://n.ethz.ch/~mbauman

  • ||

    1) Nachbesprechung Serie 7

    2) Backtracking

    3) Vorbesprechung Serie 8

    2

    Ablauf

  • ||

    Serie 7

    3

  • || 4

    Aufgabe 1Wir

    Wir

    Gegner

    Gegner

  • || 5

    Aufgabe 2: preOrder

    private ArrayList preOrder(BinarySearchTree tree, ArrayList arrayList) {

    if (tree == null) return arrayList;arrayList.add(tree.thing);arrayList = preOrder(tree.left, arrayList);arrayList = preOrder(tree.right, arrayList);return arrayList;

    }

    public ArrayList preOrder(BinarySearchTree tree) {return preOrder(tree, new ArrayList());

    }

  • || 6

    Aufgabe 2: insert

    public BinarySearchTree insert(BinarySearchTree tree, int key, T thing) {

    if (tree == null) {return new BinarySearchTree(key, thing);

    }

    if (tree.key == key) {tree.thing = thing;

    } else if (key 

  • || 7

    Aufgabe 2: find

    public T find(BinarySearchTree tree, int key) {if (tree == null) return null;if (key == tree.key) {

    return tree.thing;}if (key 

  • || 8

    Aufgabe 2: remove

    public BinarySearchTree remove(BinarySearchTree tree, int key) {

    if (tree == null) return null;if (tree.key == key) {

    ...}if (key 

  • || 9

    Aufgabe 2: remove

    public BinarySearchTree remove(BinarySearchTree tree, int key) {

    if (tree == null) return null;if (tree.key == key) {

    if (isLeaf(tree)) return null;if (hasOneChild(tree)) {

    if (tree.left != null) {return tree.left;

    }return tree.right;

    }UnlinkSmallestResult result = 

    unlinkSmallest(tree.right);result.smallest.right = result.tree;result.smallest.left = tree.left;return result.smallest;

    }...

    }

  • || 10

    Aufgabe 2: unlinkSmallest

    public UnlinkSmallestResult unlinkSmallest(BinarySearchTree tree) {

    if (tree.left == null) {return new UnlinkSmallestResult(tree, tree.right);

    }UnlinkSmallestResult result = unlinkSmallest(tree.left);tree.left = result.tree;return new UnlinkSmallestResult(result.smallest, tree);

    }

  • || 11

    Aufgabe 3

    ● Klasse PlayerBase:

    ● Klasse RandomPlayer:

    public abstract class PlayerBase implements ReversiPlayer {protected int color = 0;protected long timeout = 0;protected final long getTimout() { return timeout; }public void initialize(int color, long timeout) {

    this.color = color;}

    }

    public class RandomPlayer extends PlayerBase {private Random rand = new Random();public Coordinates nextMove(GameBoard gb) {

    ...}

    }

  • || 12

    Aufgabe 3: nextMove

    public Coordinates nextMove(GameBoard gb) {ArrayList validMoves = new 

    ArrayList(gb.getSize() * gb.getSize());for (int row = 1; row 

  • || 13

    Aufgabe 3

    ● Weiterer Vorschlag:● PlayerBase könnteArrayList getAvailableMoves(...)enthalten, damit man das nicht immer neu implementieren muss

  • ||

    Backtracking

    14

  • || 15

  • || 16

    Backtracking: Beispiel Sudoku

    ● Implementiere ein Programm, das Sudokus lösen kann

  • || 17

    Backtracking: Beispiel Sudoku

    ● Ansatz 1:● Computer sind schnell, probiere alle Möglichkeiten aus

    ● Hier: 51 leere Felder (einfaches Sudoku)● 951 ≈ 10^48 Möglichkeiten● Annahme: 1 Milliarde Versuche pro Sekunde● 951 / 109s ¹ = 10⁻ 32 Jahre

    ● Zum Vergleich: Deep Thought (Hitchhiker's Guide to the Galaxy) brauchte 7.5 Mio. Jahre, um die Antwort auf alles zu berechnen: 42

  • || 18

    Backtracking: Beispiel Sudoku (Bruteforce)    1 1   1 1 1 1  1 1       1 1 11     1 1 1 1   1  1 1 1   1 1 1    1 1   1   1 1    1 1 1   1 1 1  1   1 1 1 1     11 1 1       1 1  1 1 1 1   1 1    

  • || 19

    Backtracking: Beispiel Sudoku (Bruteforce)    1 1   1 1 1 1  1 1       1 1 11     1 1 1 1   1  1 1 1   1 1 1    1 1   1   1 1    1 1 1   1 1 1  1   1 1 1 1     11 1 1       1 1  1 1 1 1   1 2    

  • || 20

    Backtracking: Beispiel Sudoku (Bruteforce)    1 1   1 1 1 1  1 1       1 1 11     1 1 1 1   1  1 1 1   1 1 1    1 1   1   1 1    1 1 1   1 1 1  1   1 1 1 1     11 1 1       1 1  1 1 1 1   1 3    

  • || 21

    Backtracking: Beispiel Sudoku (Ansatz 2)

    ● Sobald es „hoffnungslos“ ist, höre auf● Algorithmus

    Platziere die nächstmögliche Zahl im aktuellen FeldLösung bisher gültig?Ja:

    Gehe zu nächstem FeldNein:

    9 erreicht?Nein:

    Versuche nächste ZahlJa:

    Zurück zum letzten Feld

    BACKTRACKING!

  • || 22

    Backtracking: Beispiel Sudoku    1 2   4 8 9 ?

  • || 23

    Backtracking: Beispiel Sudoku    1 2   6 4 9 8  ...

  • || 24

    Das Ganze in Javapublic static boolean solve(Board b, Position p) {

    }

    Funktionsrumpf

  • || 25

    Das Ganze in Javapublic static boolean solve(Board b, Position p) {

    for(int value = 1; value < 10; ++value) {

    }

    }

    SBG„Suchen, bis gefunden“

  • || 26

    Das Ganze in Javapublic static boolean solve(Board b, Position p) {

    for(int value = 1; value < 10; ++value) {if(b.valid_insertion(p, value) == false) {

    continue;}//Set the found valueb.set(p, value);

    }

    }

    Nächster möglicherWert einfügen

  • || 27

    Das Ganze in Javapublic static boolean solve(Board b, Position p) {

    for(int value = 1; value < 10; ++value) {if(b.valid_insertion(p, value) == false) {

    continue;}//Set the found valueb.set(p, value);//Find the next empty positionPosition p2 = new Position(p);do {

    if(p2.next() == false) return true;} while(b.given(p2) == true);//Recursive call on next positionif(solve(b, p2) == true) {

    return true;}

    }

    }

    Bisher gültigMach weiter auf dernächsten Position

  • || 28

    Das Ganze in Javapublic static boolean solve(Board b, Position p) {

    for(int value = 1; value < 10; ++value) {if(b.valid_insertion(p, value) == false) {

    continue;}//Set the found valueb.set(p, value);//Find the next empty positionPosition p2 = new Position(p);do {

    if(p2.next() == false) return true;} while(b.given(p2) == true);//Recursive call on next positionif(solve(b, p2) == true) {

    return true;}

    }//Backtrackb.set(p, 0);return false;

    }

    Kein Erfolg-> BACKTRACK

  • ||

    Serie 8

    29

  • || 30

    Aufgabe 1: Maps / Unit

    ● Indizierte Daten● ID: AHV-Nummer, Dokumentenname

    ● Möglichkeit: Maps● 2 Element: Key, Value● Standard Library: interface Map

    ● TreeMap, HashMap

    ● Map m new HashMap();

    ● Hier: Unit

  • || 31

    Aufgabe 1: Binärsuche

    Implementierung● find(List haystack, Key needle)

    ● Hilfsfunktion mit begin- und end-Parameter● Begin zeigt an das erste Element im Intervall, end HINTER das

    letzte● setFactor(int factor)

    ● Verbesserungen für unbalancierte Bäume● GetNumberofCalls()

    ● Benchmarking (Teilaufgabe e)

  • || 32

    Aufgabe 1: Binärsuche

    ● Finde das Element mit Key 22

    ● begin: 0● end: 16● Middle: 16/2 = 8

    41403837343228272423221715943

    27

    1514131211109876543210

    22 < 27

  • || 33

    Aufgabe 1: Binärsuche

    ● Finde das Element mit Key 22

    ● begin: 0● end: 8● middle: 8/2 = 4

    41403837343228272423221715943

    27

    1514131211109876543210

    17

    22 > 17

  • || 34

    Aufgabe 1: Binärsuche

    ● Finde das Element mit Key 22

    ● begin: 5● end: 8● middle: 13/2 = 6

    41403837343228272423221715943

    27

    1514131211109876543210

    17

    22 < 2323

  • || 35

    Aufgabe 1: Binärsuche

    ● Finde das Element mit Key 22

    ● begin: 5● end: 6● middle: 13/2 = 5

    41403837343228272423221715943

    27

    1514131211109876543210

    17

    22 = 2223

    22

  • || 36

    Aufgabe 2: Rucksackproblem

    x4g4, w4

    x1g1, w1

    x2g2, w2 x3

    g3, w3

    x5g5, w5

  • || 37

    Aufgabe 2: Rucksackproblem

    ● Problem● k Gegenstände xi mit Wert wi und Gewicht gi● Gegebenes Maximalgewicht → Optimiere Wert

    ● Übung● (Einfache) Theorie● Brutforce● Backtracking● Vergleich

  • || 38

    Aufgabe 2: Rucksackproblem

    ● Mögliche Teilmengen● Jedes Item kann gewählt werden, oder auch nicht● 2n Möglichkeiten

    ● Backtracking:● Wenn die ersten zwei Elemente schon zu schwer sind,

    muss nicht weiter geprüft werden, welche Element noch eingepackt werden können

  • || 39

    Aufgabe 2: Rucksackproblem

    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 2else Berechnung fertig

    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 2else Berechnung fertig

  • || 40

    Aufgabe 2: Rucksackproblem

    ● Mögliche Teilmengen● Jedes Item kann gewählt werden, oder auch nicht● Darstellung als Binärzahl● Kann zu Dezimalzahl umgerechnet werden

    ● Klasse Selection● Ermöglicht (u.A.) direkte Auswahl per Integer

  • || 41

    Aufgabe 2: Rucksackproblem: Brute Force

    public Selection findBest(ArrayList values, ArrayList weights, int maxWeight){

    ...int last = java.Math.pow(2, values.size()); //Anzahl Teilmengenfor( int i = 0; i < last; i++ ){

    new Selection(values.size(), i); //Selection Bitfeld mit Wert i...

    }...

    }

  • || 42

    Aufgabe 2: Rucksackproblem: Backtracking

    ● FindResult: Enthält Selection und Value● Rekursive find-Funktion:

    FindResult fr = find(currSelection, currWeight, values, weights, maxWeight);

    ● Abbruchbedingung: Alle möglichen Element im Rucksackselection.size() == values.size(); // alle Werte im Rucksack

    ● Zwei Möglichkeiten, weiterzugehen//Gegenstand nicht mitnehmen…Selection without = new Selection(...); //um eins vergrössern, bit auf 0 setzen…//prüfen ob Gewicht passt, dann Gegenstand mitnehmen…Selection with = new Selection(...); //um eins vergrössern, bit auf 1 setzen...

  • || 43

    Aufgabe 2: Rucksackproblem: Backtracking

    ● Klasse Selection verstehen● Bei Vergrösserung der Konfiguration (neuen Gegenstand in

    den Sack legen) muss der neue Stellenwert initialisiert werden:

    new Selection(depth + 1, selection.bits());

    ● Die neue Selection ist nun um ein Element größer und enthält den Inhalt der alten Selection.

  • || 44

    Aufgabe 3: Reversi: Züge finden

    ● Für alle Felder● Feld muss frei sein● Für alle Richtungen

    ● Es dürfen nur gegnerische Steine auf einer Linie vorkommen, bis zu einem von unseren→ Folge der Linie

    ● Tipp: GameBoard.getOccupation(coord);wirft OutOfBoundsException, falls aus dem Feld(Abbruchbedingung)

    ● „Info II ist zu viel Aufwand“ → Lasst diese Aufgabe weg

    Hilfsfunktionboolean checkDirection(gameboard, player,

    beginpoint, dx, dy)

  • || 45

    Aufgabe 3: Reversi: GreedyPlayer

    ● Erste Bewertungsfunktion● Suchtiefe 1

    ● Idee: Welcher Zug gibt mir am meisten Punkte gegenüber dem Gegner?

    1)Board kopieren: gb.clone()2)Auf temporärem Board ausprobieren: Gameboard.checkMove()

    3)Methode eval() wählt besten Zug

    Slide 1AblaufSerie 1Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32Slide 33Slide 34Slide 35Slide 36Slide 37Slide 38Slide 39Slide 40Slide 41Slide 42Slide 43Slide 44Slide 45