Informatik II (D-ITET)
Transcrição
Informatik II (D-ITET)
Informatik II (D-ITET) Übungsstunde 9, 05.05.2016 Hossein Shafagh, [email protected] Distributed Systems Group, ETH Zürich Ablauf § Besprechung von Übung 8 § Hinweise für Übung 9 (Spielbäume, Reversi) Lösung U8.A1a,b – Binäre Suche 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 3 7 17 25 33 47 56 62 65 66 68 70 78 89 92 li mi re mi = (re-li)/2 + li; Informatik II - Übung 9 3 Lösung U8.A1c – Binäre Suche (mit Faktor 3) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 3 7 17 25 33 47 56 62 65 66 68 70 78 89 92 li re mi mi = (re-li)/3 + li; Fazit: wenn ich nach kleiner Zahlen suche, die im Array vorhanden sind, ist diese Methode schneller, im allgemeinen Fall aber schlechter (tiefer Baum) Informatik II - Übung 9 4 Lösung U8.A1d – BinarySearch § Sub-arrays immer zu kopieren ist keine gute Idee à lieber eine eigene Methode erstellen, die zusätzlich zwei int-Werte, begin und end als Parameter nimmt: public Value find(ArrayList<Unit<Key, Value>> haystack, Key needle) { return findRecursive(haystack, needle, 0, haystack.size()); } private Value findRecursive( ArrayList<Unit<Key, Value>> haystack, Key needle, int begin, int end) { ... } Eclipse DEMO Informatik II - Übung 9 5 Lösung U8.A2 – Tic-Tac-Toe Strategie von MAX MAX MIN MAX MIN Informatik II - Übung 9 6 Lösung U8.A3a – checkMove: how to ungültig!! gültig? Informatik II - Übung 9 7 Lösung U8.A3a – checkMove § boolean checkMove(GameBoard …,Coordinates c) § Feld muss frei sein! § Überprüfen alle Richtungen § Solange nicht mindestens eine Richtung „gültig“ ist… for( int i = -1; i <= 1; ++i ) for( int j = -1; j <= 1; ++j ) if( i != 0 || j != 0 ) if( checkDirection(gb, player, c, new Coordinates(i, j) ) return true; //wäre ein möglicher Zug return false; //kein möglicher Zug § trace( gb, player, pos, dir ) § sum := #Steine von Gegner(player) in Richtung dir § Rückgabe := sum > 0 && letzter Stein gehört player § letzter Stein befindet sich an Koordinaten (pos.x+sum*dir.x, pos.y+sum*dir.y) Informatik II - Übung 9 Ähnliche Lösung: Eclipse DEMO 8 Lösung U8.A3a – Reversi Tipps & Tricks § checkMove ist in reversi.GameBoard deklariert § boolean reversi.GameBoard.checkMove(int, Coordinates) § Weitere nützliche Methoden § boolean reversi.GameBoard.isMoveAvailable(int) § boolean reversi.GameBoard.validCoordinates(Coordinates) § int reversi.GameBoard.countStones(int) § int reversi.Utils.other(int) § … § Fazit: JavaDoc ist cool… § wenn andere sie geschrieben haben Informatik II - Übung 9 9 Lösung U8.A3b – GreedyPlayer § Player-AI § für alle möglichen Züge § Simuliere Zug auf Kopie des aktuellen Boards § Bewerte die resultierende Situation § Speichere Zug und Bewertung in einer Liste § Sortiere die Liste / Such das/die Maximum/Maxima § Wähle den/zufällig einen maximalen Zug § Bewertungsfunktion (bisher) § Verhältnis eigene Steine vs. Gegnersteine § Datenstrukturen § MoveInfo: speichert ausgewertete Zuginformationen § Coordinates und Bewertung § List<MoveInfo> (z.B. eine ArrayList) § effizienter als ein Vector § praktischer als ein Array Informatik II - Übung 9 Ähnliche Lösung ohne Liste: Eclipse DEMO 10 L8.A4a – Einfache Diebstrategie § Liefert die einfache Diebstrategie immer das optimale Ergebnis? § Ja, weil man alle Konfigurationen durchgeht § Gibt es immer genau eine optimale Lösung? § Nein, weil es mehrere optimale Lösungen geben kann § Beweis durch Gegenbeispiel: § Gegenstände <Gewicht, Wert> [ <1,1>, <2,1>, <3,2> ] § Gmax = 3 § Lösung 1 = [true, true, false] § Lösung 2 = [false, false, true] Informatik II - Übung 9 11 L8.A4b – BruteForce.java public Selection findBest( ArrayList<Integer> values, ArrayList<Integer> weights, int maxWeight) { int last = (int) Math.pow(2, values.size()); int bestsum = 0; Selection bestsel = new Selection(values.size()); Selection sel = new Selection(values.size()); for(int i = 0; i < last; i++) { sel.setBits(i); if( sel.sum(weights) <= maxWeight ){ if( sel.sum(values) > bestsum ){ bestsum = sel.sum(values); bestsel.setBits(i); } } } return bestsel; } Informatik II - Übung 9 12 L8.A4c – Backtracking.java public Selection findBest(ArrayList<Integer> values, ArrayList<Integer> weights, int maxWeight) { if (values.size() != weights.size()) throw new IllegalArgumentException("sizes of values and weights vectors are not equal"); // give initial selection and weight 0 Selection result = find(new Selection(0), 0, values, weights, maxWeight); return result; } Informatik II - Übung 9 13 L8.A4c – Backtracking.java // find(new Selection(0), 0, values, weights, maxWeight); private Selection find(Selection selection, int weight, ArrayList<Integer> values, ArrayList<Integer> weights, int maxWeight) { final int depth = selection.size(); if (depth == values.size()) { return selection; } Selection without = new Selection(depth + 1, selection.bits()); without.set(depth, false); Selection resultWithout = find(without, weight, values, weights, maxWeight); if (weight + weights.get(depth) <= maxWeight) { Selection with = new Selection(depth + 1, selection.bits()); with.set(depth, true); Selection resultWith = find(with, weight + weights.get(depth),values,weights, maxWeight); if (resultWith.sum(values) > resultWithout.sum(values)) { return resultWith; } } return resultWithout; } Backtracking Informatik II - Übung 9 14 L8.A4d – Zeitaufwand § Messung (2GHz Intel) § Brute Force: ~4.0s § Backtracking: ~0.08s § Backtracking benötigt ca. 2% der Zeit von Brute Force § G beträgt ca. 5x das Durchschnittsgewicht aus weights § Im Schnitt werden nur 5 Gegenstände aus 20 ausgewählt (25%) § Viele vorzeitige Abbrüche Informatik II - Übung 9 15 Ablauf § Besprechung von Übung 8 § Hinweise für Übung 9 (Spielbäume, Reversi) Hinweise zu U9.A1 Spieltheorie/Spielbaumauswertung a) Bisschen Theorie b) Minimax-Algorithmus c) Optimale Strategie für MAX-Spieler d) Alpha/Beta-Algorithmus Informatik II - Übung 9 17 U9.A1 – Spieltheorie § Bestanteile eines Spielbaums § § § § Wurzel Knoten Kante Blatt à à à à Aktuellen Spielstellung Spielzustand Spielzug Endzustand, (Spiel zu Ende) Informatik II - Übung 9 18 U9.A1b – Minimax-Algorithmus § Algorithmus zur Ermittlung der optimalen Spielstrategie für Nullsummenspiele § Sichert höchstmöglichen Gewinn bei optimaler Spielweise des Gegners § Bei Nicht-Nullsummenspielen können andere Algorithmen besser sein Informatik II - Übung 9 19 U9.A1b – Minimax-Algorithmus ? 0 0 0 +1 +1 0 0 -1 +1 -1 -1 Informatik II - Übung 9 +1 0 0 20 U9.A1c – Strategie für Max § Strategie § Eine Strategie (für Max) sei ein Graph, der aus dem Spielbaum entsteht, indem man alle Kanten streicht und nur für jeden MaxKnoten eine einzige ausgehende Kante übrig lässt Also i.A. eine Menge von Knoten/ Kanten, nicht nur ein Pfad!! Informatik II - Übung 9 21 U9.A1d – Der α-β-Algorithmus § Der α-β-Algorithmus § Reduziert den Spielbaum durch Schnitte, aber liefert den gleichen MinmaxWert der Wurzel wie der eigentliche MinMax-Algorithmus § Der MinMax-Algorithmus bewertet den vollständigen Suchbaum. Dabei werden aber auch Knoten betrachtet, die in das Ergebnis (die Wahl des Zweiges an der Wurzel) nicht einfliessen. Die Alpha-Beta-Suche ignoriert eben genau diese Knoten § α grösster bisher bekannter Wert aller MAX-Vorfahren des MIN-Knotens § Ist relevant für Auswertung von Min-Knoten (Evaluierung der weiteren Nachfolgern kann abgebrochen werden, sobald der berechnete Rückgabewert kleinergleich α ist) § β kleinster bisher bekannter Wert aller MIN-Vorfahren des MAX-Knotens § Ist relevant für Auswertung von Max-Knoten (Evaluierung der weiteren Nachfolgern kann abgebrochen werden, sobald der berechnete Rückgabewert grössergleich β ist) Informatik II - Übung 9 22 U9.A1d – Der Baum § Berechnen Sie den Wert der Wurzel des folgenden Spielbaums mit Hilfe der α-β-Methode β-cut: MIN hat schon einen Knoten mit β < 7 → Vorzeitiger Abbruch! Informatik II - Übung 9 23 U9.A2d – Der α-β-Algorithmus Online Beispiel durchgerechnet: § § http://www.vs.inf.ethz.ch/edu/I2/slides/Info2-ITET-AlphaBeta.pdf http://www.emunix.emich.edu/~evett/AI/AlphaBeta_movie/sld001.htm Online JAVA Applet: http://www.ocf.berkeley.edu/~yosenl/extras/alphabeta/alphabeta.html Informatik II - Übung 9 24 Hinweise zu U9.A2 – Reversi (Teil 3) HumanPlayer RandomPlayer GreedyPlayer nextMove() nextMove() nextMove() wartet auf Eingabe von der Kommandozeile wählt ein zufälligen (aber gültigen!) nächsten Zug wählt nächsten Zug anhand einer einfachen, nicht-rekursiven Bewertungsfunktion Download Übung 7 Übung 8 Informatik II - Übung 9 MinMaxPlayer nextMove() wählt nächsten Zug anhand Min-MaxAnalyse mit neuer Bewertungsfunktion Übung 9 25 U9.A2a – Reversi (Teil 3) § Auswertung von Spielbäumen § Implementieren Sie eine Methode, die den Spielbaum mit MinMax (oder NegaMax) maximal bis zur Tiefe d auswertet (abwechselnd Max und Min) § Suchtiefe konfigurierbar § Rekursiver Ansatz § Spielbaum rekursiv aufbauen § Situation auf Tiefe d bewerten § Minmax auf erhaltene Wertung ergibt die Strategie § Alle Spezialfälle berücksichtigen (z.B. passen)! § Noch keine Zeitbegrenzung Informatik II - Übung 9 26 U9.A2b – timeLimit § Zeitbegrenzung pro Zug: § Vor Ablauf von timeLimit Millisekunden soll ihre Methode nextMove() einen gültigen Zug zurückgeben § Seht einen kleinen Zeitbuffer vor (Grössenordnung einige 10ms), das Abbrechen und Resultat-zurückliefern passiert nicht sofort! § Möglicher Ansatz: eine out-of-time-exception werfen Informatik II - Übung 9 27 U9.A2c – Bewertungsfunktion (I) § Als „Inspirationsquelle“ könnt Ihr u.A. folgenden Artikel benutzen: § „The Development of a World Class Othello Program“, Kai-Fu Lee and Sanjoy Mahajan, 1990 § Artificial Intelligence: A Modern Approach § Stuart Russell and Peter Norvig (2nd Edition, 2003) Informatik II - Übung 9 28 U9.A2c – Bewertungsfunktion (II) § Mögliche „Bewertungsfunktionen“ § Wie viele Steine werden umgedreht? § Wo liegen die umgedrehte Steine (innen/Rand)? § .... § Hinsichtlich dem Tournier empfiehlt sich § die Idee für die Bewertungsfunktion erst einmal mittels Pseudocode festzuhalten § den Pseudocode weiter zu entwickeln § der Pseudocode gibt erste Hinweise darauf, was für Informationen für jeden Zug berechnet werden müssen § aus den verschiedenen Versionen des Pseudocodes nach und nach den Tournierspieler implementieren Informatik II - Übung 9 29