Informatik II - Übung 11 Christian Beckel beckel@inf.ethz.ch 15.05.2014 Blatt 10 1) Merge sort 2) Türme von Hanoi 3) Reversi: alpha-beta-suche Außerdem: Sortierverfahren und ihre Komplexität Christian Beckel 15/05/14 2
U10.A1: Merge sort (manuell) 21 15 9 63 45 44 8 88 98 67 45 6 62 21 15 63 9 45 44 88 8 98 67 45 6 62 63 21 15 9 88 45 44 8 98 67 45 6 62 88 63 45 44 21 15 9 8 98 67 62 45 6 98 88 67 63 62 45 45 44 21 15 9 8 6 Christian Beckel 15/05/14 3 U10.A1: Merge sort (Pseudo-Code: sort) ArrayList sort (ArrayList unsorted, int begin, int end ) if ( end - begin == 0 ) return new ArrayList ( 0 ) if ( end - begin == 1 ) ArrayList result = new ArrayList ( 1 ) result.add ( unsorted[begin] ) return result // divide.. ArrayList lhs = sort ( unsorted, begin, (begin+end) / 2 ) ArrayList rhs = sort ( unsorted, (begin+end) / 2, end ) //..et impera return merge ( lhs, rhs ) Christian Beckel 15/05/14 4
U10.A1: Merge sort (Pseudo-Code: merge) ArrayList merge (ArrayList lhs, ArrayList rhs ) int left = 0, right = 0 ArrayList result = new ArrayList ( lhs.size + rhs.size ) loop if ( left == lhs.size ) result.addall ( rhs.sublist ( right, rhs.size ) ) break if ( right == rhs.size ) result.addall ( lhs.sublist ( left, lhs.size ) ) break result.add ( lhs[left]>rhs[right]? lhs[left++] : rhs[right++] ) return result Christian Beckel 15/05/14 5 U10.A1: Merge sort (Measure) ms Elemente Christian Beckel 15/05/14 6
U10.A2: Türme von Hanoi Nicht benutzt wird: 3 2 1 Zusammenfassung: Anzahl der Scheiben (n): 4 Anzahl der Schritte (2 n-1 ): 15 Nicht benutzt werden: 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 Christian Beckel 15/05/14 7 U10.A2: Türme von Hanoi (n Scheiben) Zusammenfassung: 5 Scheiben (31 Schritte): 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 4 Scheiben (15 Schritte): 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 Scheiben (7 Schritte): 2 3 1 2 3 1 2 Christian Beckel 15/05/14 8
U10.A2: Türme von Hanoi (Pseudocode) moves = 2^n-1; counter = 0; if n even then while (counter < moves) make possible move between tower 1 and tower 2 make possible move between tower 1 and tower 3 make possible move between tower 2 and tower 3 increment counter by 3 units else [n is odd] while (counter < moves-1) make possible move between tower 1 and tower 3 make possible move between tower 1 and tower 2 make possible move between tower 3 and tower 2 increment counter by 3 units make available move between tower 1 and tower 3 make possible move! es gibt immer nur eine Möglichkeit (die kleinere Scheibe, oder die einzige Scheibe) Christian Beckel 15/05/14 9 U10.A3: Reversi (Alpha-Beta-Spieler) " Realisieren Sie eine Bewertungsfunktion, die nach dem α-β-verfahren arbeitet, ansonsten jedoch das gleiche leistet wie die reine Minmax-Methode des letzten Übungsserie. " Am Einfachsten: " 2 Funktionen: min und max, die sich abwechselnd aufrufen. " Die eine ändert die Beta-Schranke, die andere die Alpha-Schranke Christian Beckel 15/05/14 10
U10.A3: Reversi (Alpha-Beta-Spieler) BestMove max (int maxdepth, long timeout, GameBoard gb, int depth, int alpha, int beta) throws Timeout if (System.currentTimeMillis() > timeout) throw new Timeout(); if (depth==maxdepth) return new BestMove(eval(gb),null,true); ArrayList<Coordinates> availablemoves = new ArrayList<Coordinates>(gb.getSize()* gb.getsize()); for (int x = 1; x <= gb.getsize(); x++) for (int y = 1; y <= gb.getsize(); y++) { Coordinates coord = new Coordinates(x, y); if (gb.checkmove(mycolor, coord)) availablemoves.add(coord); } if (availablemoves.isempty()) if (gb.ismoveavailable(othercolor)) { BestMove result = min(maxdepth, timeout, gb, depth+1, alpha, beta); return new BestMove(result.value, null, false); } else return new BestMove(finalResult(gb), null, false); [...] Christian Beckel 15/05/14 11 U10.A3: Reversi (Alpha-Beta-Spieler) BestMove max (int maxdepth, long timeout, GameBoard gb, int depth, int alpha, int beta) throws Timeout [...] boolean cut = false; Coordinates bestcoord = null; for (Coordinates coord : availablemoves) { GameBoard hypothetical = gb.clone(); hypothetical.checkmove(mycolor, coord); hypothetical.makemove(mycolor, coord); BestMove result = min(maxdepth, timeout, hypothetical, depth+1, alpha, beta); } if (result.value > alpha) { alpha = result.value; bestcoord = coord; } if (alpha >= beta) { return new BestMove(alpha, null, false); } cut = cut result.cut; return new BestMove(alpha, bestcoord, cut); Christian Beckel 15/05/14 12
Reversi-Turnier! " Mittwoch, den 28.05.2014 um 14:15 Uhr, Stuz 2 http://www.vs.inf.ethz.ch/edu/fs2014/i2/ reversi/ " Abgabe " Bis Mittwoch, den 21.05.2013 bis 23:59 (Zürich Time) " An Leyna Sadamori (leyna.sadamori@inf.ethz.ch) " Alleine, in Zweiergruppen, oder in Dreiergruppen (Aber: die Preise sind für Zweiergruppen ausgelegt!) Christian Beckel 15/05/14 13 Blatt 11 1) Sortieren mit Suchbäumen 2) Komplexitätsanalyse und O-Notation 3) Komplexität 4) Ein Springer auf dem Schachfeld Christian Beckel 15/05/14 14
Aufwand von Algorithmen " Problemumfang: n " Oft: Anzahl der Eingabewerte " Komplexität eines Problems " Geringstmöglicher Aufwand, der mit einem Lösungsalgorithmus erreicht werden kann " Aufwand " Oft ist der Aufwand eines Algorithmus nicht nur von der Problemgrösse n, sondern von den konkreten Eingabewerten bzw. deren Reihenfolge abhängig. " Dann unterscheidet man i.a. folgende Fälle: " Günstigster Aufwand ( best case ) " Mittlerer Aufwand ( average case ) " Ungünstigster Aufwand ( worst case ) Christian Beckel 15/05/14 15 Zeitkomplexität " Landau-Symbole " Abschätzung durch Analyse " wächst... als " O-Notation " Obere Schranke " Omega-Notation " Untere Schranke Notation f Ο( g) f ο( g) f Ω( g) f ω( g) f Θ( g) Anschauliche Bedeutung f wächst nicht wesentlich schneller als g f wächst langsamer als g f wächst nicht wesentlich langsamer als g f wächst schneller als g f wächst genau so schnell wie g http://de.wikipedia.org/wiki/landau-symbole Christian Beckel 15/05/14 16
Aufwand von Sortierverfahren Quelle: wikipedia.org Christian Beckel 15/05/14 17 U11.A1 Sortieren mit Suchbäumen " 3 Theoretische Fragen Christian Beckel 15/05/14 18
U11.A2: Komplexitätsanalyse // Fragment 1 for (int i=0; i<n; i++) a++; // Fragment 2 for (int i=0; i<2n; i++) a++; for (int j=0; j<n; j++) a++; // Fragment 4 for (int i=0; i<n; i++) for (int j=0; j<i; j++) a++; // Fragment 5 while(n >=1 ) n = n/2; // Fragment 3 for (int i=0; i<n; i++) for (int j=0; j<n; j++) a++; // Fragment 6 for (int i=0; i<n; i++) for (int j=0; j<n*n; j++) for (int k=0; k<j; k++) a++; Christian Beckel 15/05/14 19 U11.A2 - Beispiel // Fragment 1 for (int i=0; i<n; i++) a++; c 0 c 1 *n + = c 0 + c 1 n Christian Beckel 15/05/14 20
U11.A3: Komplexität Zeit pro Operation Grösse der Eingabe Totale Laufzeit Christian Beckel 15/05/14 21 U11.A3: Komplexität Christian Beckel 15/05/14 22
U11.A4: Ein Springer auf dem Schachbrett Christian Beckel 15/05/14 23 U11.A4 a) Erreichbare Felder " Finde Menge von Feldern: " Erreichbar mit n Zügen " Gegeben: startposition Christian Beckel 15/05/14 24
U11.A4 a) Erreichbare Felder " Klasse Position " p = new Position(0,0); " Position next = p.add(new Position(offX, offy)); " Implementiert compareto, equals, etc. " Methode getreachableset " ArrayList<Position> getreachableset(position p, int n) " p: Startposition " n: Anzahl Hops " returns: Knoten in der Menge Christian Beckel 15/05/14 25 U11.A4 b) Backtracking " Finde einen Weg, der... "... alle Felder besucht "... Jedes Feld nur 1x besucht " Frühzeitiger Abbruch " Falls erreichbare Felder alle besucht " Backtracking: löschen der letzten Züge bis Abbruchbedingung nicht mehr erfüllt Christian Beckel 15/05/14 26
viel Spass! Christian Beckel 15/05/14 27