Algorytmy z powrotami. Algorytm minimax

Podobne dokumenty
Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Wybrane algorytmy tablicowe

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Projektowanie algorytmów rekurencyjnych

Programowanie obiektowe

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

W powyższym kodzie utworzono wyliczenie dni tygodnia.

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Programowanie, algorytmy i struktury danych

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Zaawansowane aplikacje WWW - laboratorium

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Ogólne wiadomości o grafach

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Java: interfejsy i klasy wewnętrzne

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Materiały pomocnicze do wykładu 3 - Elementy języka Java

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie - instrukcje sterujące

Aplikacje w środowisku Java

Programowanie obiektowe

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Wykład 5: Więcej o Klasach i Metodach

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Programowanie w Javie Lista nr 1. Wybieramy kategorię Java, a wśród Projektów Java Application i [NEXT]

Wykład 7: Pakiety i Interfejsy

Liczby pseudolosowe. Math. Różne sposoby generowania liczb pseudolosowych. Wybrane metody klasy Math

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Wykład 2: Podstawy Języka

Java Programowanie Obiektowe Ćwiczenie 1- wprowadzenie

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wykład 4: Klasy i Metody

1. Co można powiedzieć o poniższym kodzie?

Projektowanie algorytmów z blokami decyzyjnymi

STRUMIENIE DANYCH, SERIALIZACJA OBIEKTÓW

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Języki i metody programowania Java Lab2 podejście obiektowe

Programowanie obiektowe

Podejście obiektowe. Tablice (1) obiektów

Wprowadzenie do języka Java

Materiały pomocnicze do wykładu 3 - Elementy języka Java

PODSTAWOWE ELEMENTY JĘZYKA JAVA INSTRUKCJE 1. Pętle

Podstawy programowania w lejos

Materiały do zajęć III

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Programowanie obiektowe i zdarzeniowe

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Przykłady interfejsu TCP i UDP w Javie

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Metody Metody, parametry, zwracanie wartości

Kurs programowania. Wykład 9. Wojciech Macyna

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Programowanie obiektowe

Algorytmy dla gier dwuosobowych

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Podstawy i języki programowania

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

Programowanie obiektowe

Język JAVA podstawy. Wykład 6, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Laboratorium 8 Diagramy aktywności

STRUMIENIE TEKSTOWE WEJŚCIOWE WPROWADZANIE DANYCH STRUMIENIE BAJTOWE, STRUMIENIE TEKSTOWE

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.


Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Języki i metody programowania Java Obsługa zdarzeń - przykłady

Wykład 12. Programowanie serwera MS SQL 2005 w C#

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Język ludzki kod maszynowy

Język Java wątki (streszczenie)


Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Funkcje. Wprowadzenie. Mirosław Ochodek

Systemy Rozproszone - Ćwiczenie 6

Elementy języka Java

Java. Programowanie Obiektowe Mateusz Cicheński

5.9 Modyfikacja gry Kółko i krzyżyk

Jakarta POI. POIFS obsługa dokumentów OLE 2, HSSF dokumenty w formacie Excel'a, HWPF proste dokumenty w formacie Word 97,

Platformy Programistyczne Podstawy języka Java

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Bezpieczne uruchamianie apletów wg

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Wykorzystywanie parsera DOM w programach Java i PL/SQL

ZASTOSOWANIE OBLICZEŃ ROZPROSZONYCH W JAVIE NA PRZYKŁADZIE ALGORYTMU WYZNACZAJĄCEGO LICZBY DOSKONAŁE

Transkrypt:

Algorytmy z powrotami. Algorytm minimax Algorytmy i struktury danych. Wykład 7. Rok akademicki: 2010/2011 Algorytm z powrotami rozwiązanie problemu budowane jest w kolejnych krokach, po stwierdzeniu (w trakcie realizacji i-tego kroku), że rozwiązanie problemu nie jest możliwe do osiągnięcia następuje powrót do kroku wcześniejszego i badana jest możliwośd wykonania innego kroku zapoczątkowującego inną ścieżkę poszukiwao; sposób wyznaczania rozwiązania można przedstawid jako wędrówkę po drzewie. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 2 1

Algorytm z powrotami schemat działania Stan początkowy Poziom 1 Wariant 1 Poziom 1 Wariant 3 Poziom 2 Wariant 1.1 Poziom 2 Wariant 1.2 Poziom 2 Wariant 3.1 Poziom 2 Wariant 3.2 Poziom 2 Wariant 3.3 Poziom 3 Wariant 1.2.1. Poziom 3 Wariant 1.2.2. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 3 Problem ośmiu hetmanów Ułożyd na szachownicy osiem hetmanów tak, aby się wzajemnie nie szachowały. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 4 2

Opis algorytmu problem ośmiu hetmanów Figury ustawiane są w kolejnych kolumnach (począwszy od pierwszej od lewe strony), Jeśli ustawienie hetmana w danej kolumnie nie jest możliwe, to następuje powrót do kolumny wcześniejszej i dokonywana jest próba zmiany położenia znajdującego się tam hetmana; po jej dokonaniu poszukiwania są kontynuowane. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 5 Problem ośmiu hetmanów class PierwszeUstawienie boolean [][] szachownica = new boolean[8][8]; int ileustawiono = 0; void usunwszystko() for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) szachownica[i][j] = false; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 6 3

Problem ośmiu hetmanów void drukujszachownice() for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) if (szachownica[i][j] == true) System.out.print('*'); else System.out.print('.'); System.out.println(); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 7 Problem ośmiu hetmanów boolean czypoprawne(int x, int y) int i, j; //czy jest w tym samym wierszu? for (j = 0; j < 8; j++) if (szachownica[x][j] == true) return false; //czy jest w tej samej kolumnie? for (i = 0; i < 8; i++) if (szachownica[i][y] == true) return false; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 8 4

Problem ośmiu hetmanów //czy jest na przekatnej prawo-gora? for (i = x, j = y; (i >= 0) && (j < 8); i --, j++) if ((i!= x) && (j!= y) && (szachownica[i][j] == true)) return false; //czy jest na przekatnej prawo-dol? for (i = x, j = y; (i < 8) && (j < 8); i++, j++) if ((i!= x) && (j!= y) && (szachownica[i][j] == true)) return false; //czy jest na przekatnej lewo-gora? for (i = x, j = y; (i >= 0) && (j >= 0); i--, j--) if ((i!= x) && (j!= y) && (szachownica[i][j] == true)) return false; //czy jest na przekatnej lewo-dol? for (i = x, j = y; (i < 8) && (j >= 0); i++, j--) if ((i!= x) && (j!= y) && (szachownica[i][j] == true)) return false; return true; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 9 Problem ośmiu hetmanów boolean ustaw(int kolumna) int wiersz = 0; do if (czypoprawne(wiersz,kolumna)) szachownica[wiersz][kolumna] = true; ileustawiono++; if (kolumna + 1 < 8) if (ustaw(kolumna + 1)) return true; else szachownica[wiersz][kolumna] = false; ileustawiono--; wiersz++; while ((ileustawiono < 8) && (wiersz < 8)); if (ileustawiono == 8) return true; else return false; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 10 5

Problem ośmiu hetmanów void rozwiazzadanie() usunwszystko(); if (ustaw(0)) drukujszachownice(); else System.out.println("Brak rozwiazaia!!!"); public class OsiemHetmanow01 public static void main(string [] args) PierwszeUstawienie u = new PierwszeUstawienie(); u.rozwiazzadanie(); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 11 Problem ośmiu hetmanów Rezultat uruchomienia programu: *......*....*......*.*......*......*....*... Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 12 6

Algorytm minimax Algorytm minimax jest podstawowym algorytmem wykorzystywanym przy tworzeniu gier dwuosobowych rozgrywanych w układzie: człowiek - komputer. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 13 Kółko i krzyżyk jako przykład gry dwuosobowej Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 14 7

class KK01 static final int NIKT = 0; static final int KOMPUTER = 1; static final int CZLOWIEK = 2; int n; int [][] plansza; KK01(int n) this.n = n; plansza = new int[n][n]; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 15 char symbolgracza(int zawodnik) switch(zawodnik) case CZLOWIEK: return 'X'; case KOMPUTER: return 'O'; case NIKT: return '.'; return '?'; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 16 8

void wyswietl() for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) System.out.print(symbolGracza(plansza[i][j])); System.out.println(); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 17 void ruchgracza() int wiersz = 0, kolumna = 0; System.out.println("RUCH GRACZA:\n"); wyswietl(); System.out.println(); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 18 9

try BufferedReader klawiatura = new BufferedReader(new InputStreamReader(System.in)); do System.out.print("Podaj numer wiersza (1," + (n) + "): "); wiersz = Integer.parseInt(klawiatura.readLine()); System.out.print("Podaj numer kolumny (1," + (n) + "): "); kolumna = Integer.parseInt(klawiatura.readLine()); while (plansza[wiersz-1][kolumna-1]!= NIKT); plansza[wiersz-1][kolumna-1] = CZLOWIEK; System.out.println(); catch (Exception e) System.out.println(e.getMessage()); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 19 boolean czywygral(int zawodnik) int suma; //czy jest wiersz for (int i = 0; i < n; i++) suma = 0; for (int j = 0; j < n; j++) if (plansza[i][j] == zawodnik) suma++; if (suma == n) return true; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 20 10

//czy jest kolumna for (int j = 0; j < n; j++) suma = 0; for (int i = 0; i < n; i++) if (plansza[i][j] == zawodnik) suma++; if (suma == n) return true; //pierwsza przekatna suma = 0; for (int i = 0; i < n; i++) if (plansza[i][i] == zawodnik) suma++; if (suma == n) return true; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 21 //druga przekatna suma = 0; for (int i = 0; i < n; i++) if (plansza[i][n-1-i] == zawodnik) suma++; if (suma == n) return true; return false; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 22 11

int ocenasytuacji(int ktowykonalruch) return czywygral(ktowykonalruch)? 1000 : 0; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 23 int wybierznajlepszyruch() int sytuacja = -9999; int ruch = -1; int ocena; for (int i = 0; i < n * n; i++) if (plansza[i/n][i%n] == NIKT) plansza[i/n][i%n] = KOMPUTER; if ((ocena = ocenasytuacji(komputer)) > sytuacja) sytuacja = ocena; ruch = i; plansza[i/n][i%n] = NIKT; return ruch; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 24 12

void ruchkomputera() System.out.println("RUCH KOMPUTERA...\n"); int pozycja = wybierznajlepszyruch(); plansza[pozycja/n][pozycja%n] = KOMPUTER; wyswietl(); System.out.println(); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 25 boolean czysapuste() int suma = 0; for (int i = 0; i < n * n; i++) if (plansza[i/n][i%n] == NIKT) suma++; return (suma > 0? true: false); int nastepny(int zawodnik) return 3 - zawodnik; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 26 13

void rozgrywka() int nastepnyzawodnik = CZLOWIEK, zawodnik; do zawodnik = nastepnyzawodnik; switch (zawodnik) case CZLOWIEK: ruchgracza(); break; case KOMPUTER: ruchkomputera(); break; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 27 nastepnyzawodnik = nastepny(zawodnik); while (!czywygral(zawodnik) && czysapuste()); System.out.println("\n\nKoniec gry!!!\n"); wyswietl(); System.out.println("\n"); if (czywygral(czlowiek)) System.out.println("Wygrales z komputerem!!!"); else if (czywygral(komputer)) System.out.println("Wygral KOMPUTER!!!"); else System.out.println("REMIS!!!"); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 28 14

class KolkoKrzyzyk02 public static void main(string [] args) KK01 kk = new KK01(3); kk.rozgrywka(); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 29 RUCH GRACZA:......... Podaj numer wiersza (1,3): 1 Podaj numer kolumny (1,3): 1 RUCH KOMPUTERA... XO....... RUCH GRACZA: XO....... Podaj numer wiersza (1,3): 2 Podaj numer kolumny (1,3): 1 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 30 15

RUCH KOMPUTERA... XOO X..... RUCH GRACZA: XOO X..... Podaj numer wiersza (1,3): 3 Podaj numer kolumny (1,3): 1 Koniec gry!!! XOO X.. X.. Wygrales z komputerem!!! Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 31 Wniosek Zastosowany sposób gry nie jest prawidłowy - gdyż realizuje ruch tylko na podstawie oceny bieżącej sytuacji. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 32 16

Algorytm minimax Algorytm minimax służy do tworzenia gier dwuosobowych. Wybiera optymalny ruch na podstawie analizy drzewa gry (opisującego wszystkie możliwe do zrealizowania ruchy). Do oceny sytuacji stosowana jest funkcja płatności oceniająca sytuację z punktu widzenia komputera - im wyższa jest jej wartośd, tym lepsza jest pozycja komputera. Podstawowa zasada algorytmu: przy wyborze ruchu komputer maksymalizuje wartośd funkcji płatności, zaś człowiek wykonuje ruch minimalizujący jej wartośd. Drzewo gry analizowane jest od dołu. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 33 Schemat działania algorytmu minimax Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 34 17

I class KK02 extends KK01 KK02(int n) super(n); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 35 I int ocenasytuacji(int ktowykonalruch) int wartoscprogowa = 0; switch(ktowykonalruch) case KOMPUTER: if (czywygral(komputer)) return 1000; if (czysapuste()) wartoscprogowa = 9999; for (int i = 0; i < n * n; i++) if (plansza[i/n][i%n] == NIKT) plansza[i/n][i%n] = CZLOWIEK; wartoscprogowa = Math.min(wartoscProgowa, ocenasytuacji(czlowiek)); plansza[i/n][i%n] = NIKT; else return 0; break; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 36 18

I case CZLOWIEK: if (czywygral(czlowiek)) return -1000; if (czysapuste()) wartoscprogowa = -9999; for (int i = 0; i < n * n; i++) if (plansza[i/n][i%n] == NIKT) plansza[i/n][i%n] = KOMPUTER; wartoscprogowa = Math.max(wartoscProgowa, ocenasytuacji(komputer)); plansza[i/n][i%n] = NIKT; else return 0; // koniec switch return wartoscprogowa; // koniec ocenasytuacji // koniec definicji klasy Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 37 19