PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA w KROŚNIE
|
|
- Tomasz Mazurkiewicz
- 8 lat temu
- Przeglądów:
Transkrypt
1 PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA w KROŚNIE INSTYTUT POLITECHNICZNY DZIENNE STUDIA INŻYNIERSKIE Sieciowe Systemy Informatyczne PRACA DYPLOMOWA Szelc Marcin Przegląd metod sztucznej inteligencji służących do projektowania i realizacji gier strategicznych na przykładzie wybranej gry strategicznej Ocena: Promotor: Dr inż. Mariusz Święcicki
2 KROSNO, 2006 Za pomoc przy realizacji pracy oraz udzielenie cennych wskazówek składam serdeczne podziękowania 2
3 Panu Dr inż. Mariuszowi Święcickiemu Spis treści Wstęp. 6 Cel pracy i założenia. 8 ROZDZIAŁ I Podstawy teoretyczne sztucznej inteligencji Definicja i charakterystyka sztucznej inteligencji Sztuczna inteligencja w grach strategicznych(logicznych). 13 ROZDZIAŁ II Metody przeszukiwania heurystycznego Pojęcie heurystyki Sposoby reprezentacji zadań oraz przestrzeń przeszukiwania Metody przeszukiwania drzew Porównanie algorytmów wgłąb i wrzesz Tworzenie algorytmów przeszukiwania w Java Metody rekurencyjne Metody iteracyjne. 29 ROZDZIAL III Charakterystyka programu kółko i krzyżyk Zasady i odmiany gry Założenia gry przyjęte na potrzeby pracy Opis interfejsu gry Rodzaj gry. 36 3
4 3.3.2 Jakość gracza-komputera Konfiguracja programu Zapisywanie i odtwarzanie rozgrywek Złożoność obliczeniowa i czas wykonywania. 38 ROZDZIAŁ IV Tworzenie gry kółko i krzyżyk Ogólnie o tworzeniu gry Schemat działania gry Sprawdzanie czy gra zakończona Generowanie ruchu wymuszonego Wybranie ruchów kandydujących Przeszukiwanie drzewa gry Funkcja oceniająca wartościowanie danych posunięć Zmienność algorytmu przeszukiwania oraz funkcji oceniającej Najbardziej znane algorytmy przeszukiwania drzewa gry Algorytm minimax Algorytm alfa-beta obcinanie Funkcje oceniające Charakterystyka 2 funkcji oceniających zastosowanych w programie Wyniki gier przy zastosowaniu różnych funkcji oceniających Czynniki funkcji oceniającej wpływające na szybkość działania programu Przeszukiwania drzewa gry w programie Algorytm alfa-beta, a minimax w grze Czas szukania najlepszego ruchu w grze. 64 4
5 ROZDZIAŁ V Sztuczna inteligencja w urządzeniach mobilnych Możliwość zastosowanie sztucznej inteligencji na urządzeniach mobilnych Przenoszenie aplikacji kółko i krzyżyk z aplikacji na midlet Zasady tworzenia midletu Wyświetlanie w aplikacji w porównaniem wyświetlania w midlecie Różnice bibliotek (klas) stosowanych w aplikacjach na PC - J2SE, a tych stosowanych na urządzenia mobilne - J2ME Redukcja obliczeń Testowanie Podsumowanie. 71 ROZDZIAŁ VI Podsumowanie Zakończenie Wnioski. 72 Bibliografia. 74 Spis rysunków. 75 Spis kodów źródłowych. 76 5
6 Wstęp W dobie współczesnej komputery są bardzo szybkie, a wzrost ich mocy obliczeniowej jest ciągle duży. Jednak w wielu zadaniach ta moc obliczeniowa jest niewystarczająca. Na pozór proste gry logiczne (np. kółko i krzyżyk, których tworzenie jest celem niniejszej pracy) potrzebują ogromnej mocy obliczeniowej jeśli chcemy mieć silny program, potrafiący wygrywać z bardzo dobrymi graczami. Jednak komputery są takie na jakie stać dzisiejszą technikę, natomiast duże możliwości przyspieszenia pewnych obliczeń tkwią w zastosowaniu odpowiednich algorytmów i użyciu odpowiednich technik programistycznych pozwalających na wzrost szybkości obliczeń. W pracy niniejszej do zaprogramowania gry kółko i krzyżyk użyty został język Java. Oczywiście jest to na dzień dzisiejszy niezbyt szybki język, jednak daje możliwość napisania bardzo przejrzystego kodu i zarazem utworzenia wieloplatformowego programu. Proces tworzenia różnych gier logicznych jest bardzo podobny. Różnice polegają na sposobie generacji ruchów (właściwych dla danej gry) oraz budowaniu funkcji oceniającej. Natomiast sama technika znajdywania optymalnego ruchu jest taka sama (stosowanie popularnych algorytmów przeszukiwania drzew gier, np. alfa-beta obcinanie). Tworzenie gry logicznej polega na przewidywaniu na kilka (kilkanaście) ruchów do przodu. Człowiek robi to bardzo szybko, gdyż potrafi wybrać tylko kilka sensownych ruchów z danej pozycji i przeanalizować kolejne (również tylko niektóre), uwzględniając fakt że przeciwnik również wykona dobry dla niego ruch. 6
7 Program komputerowy również analizuje tylko ruchy wpływające w znaczący sposób na stan gry, gdyż ocenianie wszystkich możliwych posunięć na kilka ruchów do przodu pochłonęłoby zbyt dużo czasu. Przykładowo dla gry kółko i krzyżyk o rozmiarach 15x15 i przewidywaniu 5 ruchów do przodu byłoby to prawie (15*15)^5, a więc około 576,650,390,000 możliwych ruchów. Zakładając, że wygenerowanie i przetestowanie 100 ruchów na komputerze trwałoby 1 milisekundę (na dobrym pececie trwa to znacznie dłużej(w programie będącej przedmiotem tej pracy ms),oczywiście w zależności od sposobu generowania ruchów i funkcji oceniającej, to sprawdzenie wszystkich posunięć na 5 ruchów do przodu trwałoby około 66 dni. Jak łatwo policzyć gdybyśmy w ten sposób chcieli sprawdzić wszystkie możliwe posunięcia 7 ruchów do przodu, to czas trwania przekroczyłby wielokrotnie czas życia człowieka. Dlatego wykorzystuje się wiele technik do skrócenia tego czasu, dzięki czemu programy komputerowe przewidują nawet na kilkanaście ruchów do przodu, co odpowiada poziomowi gry najlepszych graczy. Na dobrego gracza wystarczy kilka ruchów do przodu przy dobrej funkcji oceniającej, a na przeciętnego człowiek czasem wystarczy 1-3. W pracy przedstawione zostały metody przeszukiwanie heurystycznego wykorzystywane w tworzeniu gier strategicznych (logicznych). 7
8 Cel pracy Celem pracy jest przedstawienie metod sztucznej inteligencji służących do projektowania i realizacji gier strategicznych na przykładzie wybranej gry strategicznej ( kółko i krzyżyk ). Celem pracy nie jest stworzenie bardzo silnego programu do gry, lecz zaprezentowanie samych mechanizmów przeszukiwania heurystycznego, na przykładzie napisanej gry. Ważnym aspektem pracy jest porównywanie tych mechanizmów zarówno od strony teoretycznej jak i praktycznej (będącej wynikiem działania programu przy różnych ustawieniach). W pracy zostały także przedstawione i ocenione m.in. sposoby generowania ruchów, przeszukiwania drzewa gry, ocenianie danego ruchu. Pogram gry jak i przykłady przeszukiwania drzewa gry zrealizowane zostało w języku Java. Język Java nie jest najlepszy w szybkości działania, jednak przejrzystość kodu pisanego w tym języku programowania (stworzonego z myślą o programowaniu obiektowym) pozwala na lepsze zrozumienie niniejszej pracy. Poza tym programy napisane w języku Java działają na różnych platformach systemowych (systemy operacyjne np. Linux, Windows) jak i w różnych platformach sprzętowych (komputery PC, urządzenia mobilne - palmtopy, telefony komórkowe) oraz różne środowiska (np. aplikacyjne, www - aplety). Niniejszy program został zaimplementowany w formie aplikacji, apletu oraz midletu. W pracy został przedstawiony sposób realizacji skomplikowanych zadań sztucznej inteligencji na telefonach komórkowych, których możliwości obliczeniowe i zasoby pamięciowe są niewielkie. 8
9 W związku z tym, że obliczenia realizowane na drzewie gry doskonale nadają się do rozproszenia, pokrótce omówiony został problem stosowania rozpraszania obliczeń. Przeanalizowanie tej pracy jak również programów zrealizowanych w jej ramach mogą dać dobre podstawy do zrozumienia problematyki działania gier logicznych bazujących na sztucznej inteligencji, co jest głównym zamierzeniem tej pracy. Programy zrealizowane w ramach niniejszej pracy nie są w pełni zoptymalizowane pod względem szybkości działania, dlatego też nadają się do rozważań na temat możliwości zastosowania optymalizacji w różnych fragmentach ich działania. 9
10 Rozdział I Podstawy teoretyczne sztucznej inteligencji 1.1 Definicja i charakterystyka sztucznej inteligencji 1. Sztuczna inteligencja definicja. Definicja w odniesieniu do dziedziny informatyki. Sztuczna inteligencja (angielskie artificial intelligence, AI), dział informatyki zajmujący się konstruowaniem maszyn i algorytmów, których działanie posiada znamiona inteligencji. Rozumie się przez to zdolność do samorzutnego przystosowywania się do zmiennych warunków, podejmowania skomplikowanych decyzji, uczenia się, rozumowania abstrakcyjnego itp. Definicja w odniesieniu do człowieka. Inteligencja jest to zespół zdolności umysłowych umożliwiających jednostce sprawne korzystanie z nabytej wiedzy oraz skuteczne zachowanie się wobec nowych zadań i sytuacji (Encyklopedia Powszechna PWN z roku 1982). 2. O sztucznej inteligencji. Sztuczna inteligencja od czasów swego powstania jest nadzieją ludzkości ale zarazem budzi wiele wątpliwości oraz sprzecznych opinii. 10
11 Czy kiedykolwiek uda się zbudować maszynę naprawdę myślącą i czy to stwierdzenie nie jest naprawdę samo w sobie sprzeczne ( maszyna myśleć )? To pytanie pozostanie na długo, a może na zawsze bez jednoznacznej odpowiedzi. Czy wobec tego te próby mają sens? Oczywiście że tak, gdyż prowadzą do powstania wielu użytecznych systemów, urządzeń, które często nie były celem samym w sobie. Sztuczna inteligencja zatacza coraz szersze kręgi wkradając się, często niepostrzeżenie, w nasze codzienne życie, do naszych domów. Inną sprawą jest, że wiele z tych rzeczy ma niewiele wspólnego ze sztuczną inteligencją, a są to jedynie mniej lub bardziej zaawansowane automaty, które określamy mianem inteligentny. Pojęcie inteligencji było znane już w Starożytności. Najprawdopodobniej termin inteligencja zdefiniował jako pierwszy rzymski filozof Cyceron żyjący kilkadziesiąt lat przed naszą erą. Jego interpretacja niewiele różni się od współczesnego postrzegania inteligencji. Mianowicie inteligencja w jego mniemaniu oznaczała zdolności umysłowe człowieka. Później definicja ta została rozszerzona i obecnie termin ten oznacza zespół zdolności umożliwiających jednostce korzystanie z nabytej wiedzy oraz skuteczne zachowanie się wobec nowych zadań i warunków, czyli na znajdowaniu właściwych reakcji na otaczające ją sytuacje. Inteligencję możemy traktować jako zdolność uczenia się, zdolność do rozwiązywania zadań, zaś poziom (stopień) inteligencji możemy ocenić po stopniu trudności tych zadań, a co za tym idzie po stopniu trudności materiału, jaki dana jednostka może przyswoić. Aby rozwiązać dane zadanie trzeba posiadać i umieć powiązać ze sobą kilka cech, takich jak: rozumienie problemu, umiejętność wnioskowania, myślenie (często jest to myślenie abstrakcyjne), kojarzenie i odkrywanie faktów, pamięć, czasem także podświadomość i intuicja. Zatem pojęcie inteligencji jest dużo bardziej złożone niż by się mogło na początku wydawać i można ją traktować jako zespół określonych procesów powiązanych ze sobą. (Wielka Internetowa Encyklopedia Multimedialna). 11
12 W badaniach nad sztuczną inteligencją wyróżniamy wiele nurtów. Maksymalny program, jaki stawia przed sobą ta dziedzina to stworzenie maszyn o inteligencji dorównującej, a nawet przewyższającej ludzką. Program minimalny to stworzenie algorytmów lub maszyn przejawiających tylko jakiś wąski aspekt inteligencji, np. grających w szachy lub rozpoznających obrazy czy automatycznie tworzących streszczenie jakiegoś tekstu. (Wielka Internetowa Encyklopedia Multimedialna). Sztuczna inteligencja jest dziedziną bardzo kontrowersyjną, jednak chętnie badaną przez wiele firm. Badacze tej dziedziny natrafili na szereg problemów. Najpoważniejszym jest to, że komputer jest jedynie maszyną, nie potrafi niczego sam wymyślić, ponieważ nie myśli w ludzkim znaczeniu tego słowa. Nie posiada intuicji, podświadomości, stanów emocjonalnych (to akurat uważam za jedną z poważniejszych zalet komputerów). Komputer jednak ma szereg bardzo poważnych zalet dających mu przewagę nad człowiekiem. Jego podstawową zaletą jest szybkość dokonywanych obliczeń. W tym względzie człowiek nigdy nie doścignie maszyny. Jednak obliczenia te nie są twórcze, a jedynie przetwarzane z kodu programu, który został wprowadzony przez człowieka. Komputer musi więc się jakoś komunikować z człowiekiem. Dzieje się to za pomocą programu. Człowiek wprowadza dane, komputer analizuje je, wykonuje operacje i odpowiada. Można powiedzieć, że działa to na zasadzie dialogu, a więc powstaje wrażenie jakby obie strony przekazywały swoje myśli. Widzimy więc, że komputer sprawia wrażenie jakby myślał, miał inteligencję. W obrębie sztucznej inteligencji tworzy się programy obrazujące myśli człowieka. Programy te są tak skonstruowane, że nawet ich twórca nie może przewidzieć, do czego będą one wykorzystywane w przyszłości. Do sprawdzenia, czy dany system (program) posiada inteligencję (oczywiście sztuczną) wykorzystuje się test Turinga, zwany inaczej testem nie rozróżnialności (indistinguishability test). Polega on na tym, że maszynę uważa się za inteligentną, jeśli bezstronny obserwator zadając pytania systemowi nie będzie w stanie stwierdzić, czy odpowiedzi pochodzą od człowieka czy od maszyny. 12
13 Realizacją tego testu może być np. gra w szachy. Systemy sztucznej inteligencji określa się jako systemy oparte na wiedzy (knowledge based system), bowiem w metodach SI następuje przejście od przetwarzania danych do przetwarzania wiedzy. 1.2 Sztuczna inteligencja w grach strategicznych (logicznych). Gry strategiczne są od wielu lat inspiracją człowieka. Inspiracja ta pochodzi zapewne od tego, że nie mają one tak zwanego rozwiązania, czyli nie istnieje w obecnych czasach możliwość generacji sekwencji ruchów dających pewne zwycięstwo. Na przeszkodzie w znalezieniu sekwencji wygrywającej stoi bardzo duża liczba możliwych rozgrywek. Sztuczna inteligencja wykorzystywana jest w grach logicznych do odrzucania ruchów słabych poprzez wartościowanie danego układu planszy, w wyniku czego znacznie zmniejsza się przestrzeń przeszukiwania. Wykorzystywane są w tym celu ogólnie znane mechanizmy przeszukiwania heurystycznego oraz funkcja oceniająca dany układ planszy (dany ruch), która jest już właściwa dla danego programu i to od jej jakości w głównej mierze zależy jakość programu. 13
14 ROZDZIAŁ II Metody przeszukiwania heurystycznego 2.1 Pojęcie heurystyki Heurystyka oznacza sztukę znajdowania rozwiązań problemów metodami niealgorytmicznymi. Do rozwiązania wielu problemów, zadań, nie można użyć metod algorytmicznych ze względu na ogromną złożoność obliczeniową tych zadań. Dlatego stosuje się metody heurystyczne, które nie dają pewności uzyskania najlepszego rozwiązania, jednak ich skuteczność i ogromne zmniejszenie złożoności obliczeniowej wpływają na to, że są one często stosowane w rozwiązywaniu problemów sztucznej inteligencji. 2.2 Sposoby reprezentacji zadań oraz przestrzeń przeszukiwania Rozwiązywanie zadań sprowadza się do tworzenia obiektów oraz przeszukiwania. Często sprowadza się to do przeszukiwania wszystkich możliwych stanów, jednak taki sposób można zastosowań jedynie do mało złożonych zadań. Przy rozwiązywaniu zadań bardziej złożonych stosuje się metodę generowania i testowania obiektów lub przeszukiwania tylko wybranych obiektów ze zbioru. Według powyższego przestrzenie przeszukiwania można podzielić następująco: - przeszukiwanie całych zbiorów stosowana dla mało złożonych zadań. - przeszukiwanie wybranych obiektów z całego zbioru stosowane dla złożonych zadań. Wadą jest duże zużycie pamięci. 14
15 - generowanie i przeszukiwanie obiektów stosowane dla złożonych zadań. Zaletą jest mniejsze zużycie pamięci. Przy opisie zadania istotne jest uwzględnienie: - sposobu przedstawiania obiektów z przestrzeni przeszukiwania kod. - metody obliczeniowe pozwalające generować kolejne obiekty. - metody wyboru operatorów spośród operatorów możliwych do zastosowania strategie sterowania. (Leonard Bolc, Jerzy Cytowski, Metody przeszukiwania heurystycznego tom 2, Państwowe Wydawnictwo Naukowe,Warszawa, 1989). 2.3 Metody przeszukiwania drzew Algorytmy przeszukiwania drzew mają różne zastosowanie i jedynie znając zastosowanie możemy wskazać, który algorytm będzie lepszy (chociaż często nawet znając zastosowanie w szczególnych przypadkach użycie innego algorytmu dałoby lepsze rezultaty). Poniższe algorytmy przeszukiwania są najbardziej popularnymi algorytmami przeszukiwania: - systematyczne przeszukiwanie jest to podstawowy algorytm przeszukiwania grafów. Celem algorytmu jest sprawdzenie wszystkich węzłów grafu. W czasie przeszukiwania zbiór sprawdzonych węzłów jest stale powiększany. Algorytm kończy się gdy żaden węzeł nie ma nie przeszukanych krawędzi. - przeszukiwanie wgłąb metoda ta sprowadza się do przeszukiwania przypominającego przeszukiwanie stosu z góry na dół do najgłębszego węzła, przy czym rozwijany jest tylko jeden potomek danego węzła. 15
16 Rys 1. Kolejność przeszukiwania węzłów w algorytmie przeszukiwania wgłąb. - Przeszukiwanie z nawracaniem (ang. backtracking) zmodyfikowane przeszukiwania wgłąb. Ekspansja badanego węzła jest zastąpiona jego rozszerzaniem (generowaniem pojedynczego potomka) i jeśli ten nowy węzeł nie spełnia kryterium końcowego to jest dalej rozszerzany. Gdy po kolejnych rozszerzeniach dany otrzymany węzeł spełnia kryterium lub nie ma już dalszych potomków to następuje nawracanie do najbliższego dla danego węzła przodka, dla którego możliwe jest wygenerowanie potomków. - Przeszukiwanie wszerz każdy węzeł na wyższym poziomie jest przeszukiwany wcześniej niż węzeł na poziomie niższym. Możliwe jest przeszukiwanie zarówno do określonego poziomu jak i całego drzewa gry. 16
17 Rys 2. Kolejność przeszukiwania węzłów w algorytmie przeszukiwania wszerz. Istnieje znacznie więcej algorytmów przeszukiwania, jednak celem tej pracy jest zaprezentowanie tylko tych najbardziej popularnych i zastosowanych w programie. 2.4 Porównanie algorytmów wgłąb i wrzesz Rodzaj zastosowanego algorytmu ma wpływa na szybkość znalezienia oczekiwanego węzła. Jednak szybkość znalezienia danego węzła jest zależna od konkretnego drzewa. Doskonale obrazują to poniższe przykłady. 17
18 Przykład 1. Porównanie algorytmów przeszukiwania wgłąb i wszerz na przykładzie danego drzewa. Mamy dane drzewo i szukamy pierwszego elementu spełniającego dany warunek: wartość węzła >=100. Dla poniższego drzewa szybciej znajdziemy szukany węzeł przy wybraniu algorytmu przeszukiwania wszerz. Rys 3. Szukanie węzła drzewa spełniającego warunek: węzeł >=100 przy wykorzystaniu algorytmu przeszukiwania wgłąb. 18
19 Rys 4. Szukanie węzła drzewa spełniającego warunek: węzeł >=100 przy wykorzystaniu algorytmu przeszukiwania wrzesz. 19
20 Przykład 2. Porównanie algorytmów przeszukiwania wgłąb i wszerz na przykładzie danego drzewa. W przykładzie tym zmieniamy tylko 2 elementy drzewa w porównaniu z drzewem z przykładu 1 (przy innym ułożeniu wartości węzła wystarczyłoby zmienić tylko wartość jednego węzła). Zmiana ta powoduje, że tym razem lepszym rozwiązaniem okaże się wybranie algorytmu wgłąb. Rys 5. Szukanie węzła drzewa spełniającego warunek: węzeł >=100 przy wykorzystaniu algorytmu przeszukiwania wgłąb. 20
21 Rys 6. Szukanie węzła drzewa spełniającego warunek: węzeł >=100 przy wykorzystaniu algorytmu przeszukiwania wrzesz. Powyższe 2 przykłady pokazują jak niewielka zmiana może wpłynąć w znaczący sposób na szybkość przeszukiwania drzewa. W ten sposób udowodnione zostało, że kluczowe znaczenie dla procesu przeszukiwania ma ułożenie węzłów. Dlatego podczas generowania ruchów w grze należy zwrócić uwagę na kolejność generowania ruchów. Oczywiście w programie kółko i krzyżyk skrócenie obliczeń jest spowodowane w inny sposób (właściwości algorytmu alfa-beta obcinanie, który został opisany w dalszej części pracy), jednak w powyższych dwóch przykładach chodziło o pokazanie jak ważna jest kolejności przeszukiwania. 21
22 2.5 Tworzenie algorytmów przeszukiwania w Java Metody rekurencyjne Rekurencja polega na wywoływanie przez funkcję samej siebie. Algorytmy rekurencyjne są bardzo często wykorzystywane podczas przeszukiwania drzewa gry jednak mają one pewną wadę jaką jest możliwość przepełnienia stosu czy też sterty pamięci. Wady tej nie posiadają metody iteracyjne. Rekurencja jest naturalna do zastosowań przeszukiwania wgłąb, jednak można ją również stosować do przeszukiwania wrzesz. Zaimplementowana klasa ma na celu pokazanie w jaki sposób można tworzyć drzewa binarne w Java, nie jest natomiast wykorzystana w programie głównym. Przykład 3. Przykład programu przeszukującego drzewo binarne rekurencyjną metodą wgłąb. Główna klasa programu służąca do przeszukania drzewa binarnego posiada następujące właściwości: -zwraca wartość największego węzła w drzewie. -zwraca wartość najmniejszego węzła w drzewie. -zwraca wartość największego węzła w drzewie, który spełnia dany warunek. -zwraca wartość najmniejszego węzła w drzewie, który spełnia dany warunek. -zwraca wartość danego węzła. Klasa posiada 4 pola danych: -wskaźnik do lewego potomka. -wskaźnik do prawego potomka. -klucz (nazwa węzła). -wartość (wartość). 22
23 Na jej podstawie można budować klasy wykorzystujące strukturę drzewa binarnego. Kod źródłowy 1. Klasa Tree, której obiekty tworzą strukturę drzewa z możliwością operacji na tym drzewie (przeszukiwanie). import java.io.*; public class Tree { /*do wyswietlania na konsoli*/ PrintWriter pw=new PrintWriter(System.out,true); /*wskaznik do lewego potomka*/ Tree lewy; /*wskaznik do prawego potomka*/ Tree prawy; /*nazwa wezla*/ String key; /*wartosc wezla*/ int value; /*konstruktor - inicjuje nazwe i wartosc wezla*/ public Tree(String k,int v) { key=k; value=v; /*zwraca wartosc danego wezla*/ public int getvalue(){ return value; /*zwraca nazwe wezla*/ public String getkey(){ return key; /*wyszukuje wartosc dla wezla o zadanej nazwie*/ public int getvalue(string klucz){ /*wartosc znaleziona, -1 oznacza ze jeszcze nie znaleziono szukanego wezla*/ int w=-1; //pw.println(getkey()); -wyswietla kolejne przeszukiwane klucze /*jesli znaleziono szukany wezel to zwroc wynik do rodzica*/ if(getkey().equals(klucz)){ return getvalue(); else{ /*sprawdzenie czy istnieje lewy potomek*/ if(lewy instanceof Tree){ /*pobranie wartosci szukanego wezla (lub -1) od lewego potomka*/ 23
24 w=lewy.getvalue(klucz); /*jesli znaleziono wynik zwrocenie go do rodzica - jesli rodzic okaze sie korzeniem rekurencja zakonczy sie zwracajac wynik dla funkcji wywolujacej szukanie */ if(w!=-1) return w; /*sprawdzenie czy istnieje prawy potomek*/ if(prawy instanceof Tree){ /*pobranie wartosci szukanego wezla (lub -1) od prawego potomka*/ w=prawy.getvalue(klucz); /*jesli znaleziono wynik zwrocenie go do rodzica - jesli rodzic okaze sie korzeniem rekurencja zakonczy sie zwracajac wynik dla funkcji wywolujacej szukanie */ if(w!=-1) return w; //else return -1; public int getminimumvalue(int min){ /*do przechowywania tymczasowych wynikow*/ int temp; //pw.println(""+getkey()); /*-wyswietla kolejne przeszukiwane wezly*/ /*jesli minimum do tej pory znalezione jest wieksze od wartosci danego wezla(potomka) to ustanowienie minimum=wartosc aktualnego wezla*/ if(min>getvalue()) min=getvalue(); if(lewy instanceof Tree){ /*jesli wartosc lewego potomka tego wezla jest mniejsza od do tej pory znalezionego minimum to ustaw minimum=wartosc_lewego_potomka*/ temp=lewy.getminimumvalue(min); if(temp<min) min=temp; if(prawy instanceof Tree){ /*jesli wartosc prawego potomka tego wezla jest mniejsza od do tej pory znalezionego minimum to ustaw minimum=wartosc_prawego_potomka*/ temp=prawy.getminimumvalue(min); if(temp<min) min=temp; /*NAWRACANIE - zwrocenie aktualnego minimum do przodka - jesli przodek jest korzeniem to zwrocenie znalezionego minimum */ return min; 24
25 public int getmaximumvalue(int max){ /*do przechowywania tymczasowych wynikow*/ int temp; //pw.println(""+getkey()); /*-wyswietla kolejne przeszukiwane wezly*/ /*jesli maximum do tej pory znalezione jest mniejsz od wartosci danego wezla(potomka) to ustanowienie maximum=wartosc aktualnego wezla*/ if(max<getvalue()) max=getvalue(); if(lewy instanceof Tree){ /*jesli wartosc lewego potomka tego wezla jest wieksza od do tej pory znalezionego maximum to ustaw maximum=wartosc_lewego_potomka*/ temp=lewy.getmaximumvalue(max); if(temp>max) max=temp; if(prawy instanceof Tree){ /*jesli wartosc prawego potomka tego wezla jest wieksza od do tej pory znalezionego maximum to ustaw maximum=wartosc_prawego_potomka*/ temp=prawy.getmaximumvalue(max); if(temp>max) max=temp; /*NAWRACANIE - zwrocenie aktualnego maximum do przodka - jesli przodek jest korzeniem to zwrocenie znalezionego maximum jako wyniku*/ return max; public int getminimumvalue(){ /*do przechowywania tymczasowych wynikow*/ int temp; int min=999999;//tu powinna byc najmniejsza liczba typu int //pw.println(""+getkey()); /*-wyswietla kolejne przeszukiwane wezly*/ /*jesli minimum do tej pory znalezione jest wieksze od wartosci danego wezla(potomka) to ustanowienie minimum=wartosc aktualnego wezla*/ if(min>getvalue()) min=getvalue(); if(lewy instanceof Tree){ /*jesli wartosc lewego potomka tego wezla jest mniejsza od do tej pory znalezionego minimum to ustaw minimum=wartosc_lewego_potomka*/ temp=lewy.getminimumvalue(); if(temp<min) min=temp; 25
26 if(prawy instanceof Tree){ /*jesli wartosc prawego potomka tego wezla jest mniejsza od do tej pory znalezionego minimum to ustaw minimum=wartosc_prawego_potomka*/ temp=prawy.getminimumvalue(); if(temp<min) min=temp; /*NAWRACANIE - zwrocenie aktualnego minimum do przodka - jesli przodek jest korzeniem to zwrocenie znalezionego minimum*/ return min; public int getmaximumvalue(){ /*do przechowywania tymczasowych wynikow*/ int temp; int max= ; //tu powinna byc najmniejsza wartosc typu int //pw.println(""+getkey()); /*-wyswietla kolejne przeszukiwane wezly*/ /*jesli maximum do tej pory znalezione jest mniejsz od wartosci danego wezla(potomka) to ustanowienie maximum=wartosc aktualnego wezla*/ if(max<getvalue()) max=getvalue(); if(lewy instanceof Tree){ /*jesli wartosc lewego potomka tego wezla jest wieksza od do tej pory znalezionego maximum to ustaw maximum=wartosc_lewego_potomka*/ temp=lewy.getmaximumvalue(); if(temp>max) max=temp; if(prawy instanceof Tree){ /*jesli wartosc prawego potomka tego wezla jest wieksza od do tej pory znalezionego maximum to ustaw maximum=wartosc_prawego_potomka*/ temp=prawy.getmaximumvalue(); if(temp>max) max=temp; /*NAWRACANIE - zwrocenie aktualnego maximum do przodka - jesli przodek jest korzeniem to zwrocenie znalezionego maximum jako wyniku */ return max; 26
27 Kod źródłowy2 Klasa tworząca oraz przeszukująca drzewo binarne przy wykorzystaniu klasy Tree. import java.io.*; public class Application1 { /*do wyswietlania na konsoli*/ PrintWriter pw=new PrintWriter(System.out,true); /*konstruktor*/ public Application1() { createandsearch(); /*start programu*/ public static void main(string[] args) { new Application1(); /*tworzy drzewo i wyszukuje wybrane elementy*/ public void createandsearch(){ Tree korzen=new Tree("a",100); korzen.lewy=new Tree("b",105); korzen.prawy=new Tree("c",111); korzen.lewy.lewy=new Tree("d",55); korzen.lewy.prawy=new Tree("e",90); korzen.prawy.lewy=new Tree("f",190); korzen.prawy.prawy=new Tree("g",223); korzen.lewy.lewy.lewy=new Tree("h",105); korzen.lewy.lewy.prawy=new Tree("i",99); korzen.lewy.prawy.lewy=new Tree("j",36); korzen.lewy.prawy.prawy=new Tree("k",41); korzen.prawy.lewy.lewy=new Tree("l",29); korzen.prawy.lewy.prawy=new Tree("m",55); korzen.prawy.prawy.lewy=new Tree("n",28); korzen.prawy.prawy.prawy=new Tree("o",36); //SZUKANIE WARTOSCI WEZLA O NAZWIE "o" 27
28 int wynik=korzen.getvalue("o"); /*wartosc -1 oznacza ze element szukany nie został znaleziony - obiekty przyjmuja wartosci dodatnie */ if(wynik==-1) pw.println("szukany obiekt nie istnieje"); else pw.println("wartosc szukanego obiektu o="+wynik); //KONIEC /*SZUKANIE najwiekszej wartosci wezla w drzewie - dodatkowo maxymalna wartosc musi spelniac warunek max>-1 */ pw.println("najwieksza wartosc wezla w drzewie ktora dodatkowo>-1, ="+korzen.getmaximumvalue(- 1)); /*SZUKANIE najmniejszej wartosci wezla w drzewie - dodatkowo minimalna wartosc musi spelniac warunek min<99999 */ pw.println("najmniejsza wartosc wezla w drzewie ktora dodatkowo <99999, ="+korzen.getminimumvalue(99999)); /*SZUKANIE najwiekszej wartosci wezla w drzewie */ pw.println("najwieksza wartosc wezla w drzewie="+korzen.getmaximumvalue()); /*SZUKANIE najmniejszej wartosci wezla w drzewie*/ pw.println("najmniejsza wartosc wezla w drzewie="+korzen.getminimumvalue()); 28
29 2.5.2 Metody iteracyjne Iteracja (działanie w pętli) to technika algorytmiczna polegająca na wykonaniu tej samej instrukcji dla n zmiennych (np. liczb, wartości logicznych etc.) Iteracja oszczędza czas programisty, który ten musiałby spędzić wpisując instrukcję n razy, zależnie od liczby zmiennych. Liczba powtórzeń w iteracji jest z góry określona lub zależy od spełnienia określonego warunku. W realizacji algorytmów iteracyjnych ważne jest prawidłowe określenie sposobu zakończenia działań. Można to zrobić za pomocą licznika, który odlicza kolejne kroki iteracji (liczbę powtórzeń). Iteracja jest naturalna do zastosowań przeszukiwania wgłąb, jednak można również za jej pomocą zaimplementować przeszukiwanie wrzesz. W programie kółko i krzyżyk do przeszukiwania drzewa gry zastosowana została iteracja dzięki wykorzystaniu pętli while(true){, z warunkiem wychodzenia z pętli w przypadku braku możliwości wykonania następnego ruchu, bądź spełnieniu warunku wartość_węzła<alfa, wartość_węzła>beta. Zasada jej działania opiera się na odwiedzeniu wszystkich węzłów na danym poziomie (z danej listy) oraz zapisywania do drugiej listy ich potomków. Następnie listy te są zamieniane i następuje kolejna iteracja. Kod źródłowy3. Klasa umożliwiająca iteracyjne przeszukiwanie drzewa binarnego metodą wrzesz. Klasa ta ma takie same działanie jak klasa z przykładu. import java.io.*; import java.util.*; public class Tree { /*do wyswietlania na konsoli*/ PrintWriter pw=new PrintWriter(System.out,true); Vector w1=new Vector(); 29
30 Vector w2=new Vector(); /*wskaznik do lewego potomka*/ Tree lewy; /*wskaznik do prawego potomka*/ Tree prawy; /*nazwa wezla*/ String key; /*wartosc wezla*/ int value; /*konstruktor - inicjuje nazwe i wartosc wezla*/ public Tree(String k,int v) { key=k; value=v; /*zwraca wartosc danego wezla*/ public int getvalue(){ return value; /*zwraca nazwe wezla*/ public String getkey(){ return key; private void copyvector(vector source,vector destination){ destination.clear(); Enumeration enum= source.elements(); while(enum.hasmoreelements()){ Object o=enum.nextelement(); destination.add(o); source.clear(); /*wyszukuje iteracyjnie wartosc dla wezla o zadanej nazwie*/ public int getvalue(string klucz){ if(getkey().equals(klucz)){ return getvalue(); w1.add(lewy); w1.add(prawy); while(true){ int n=w1.size(); for(int i=0;i<n;i++){ 30
31 Tree ob=(tree)w1.get(i); if(ob.getkey().equals(klucz)) return ob.getvalue(); if(ob.lewy instanceof Tree) w2.add(ob.lewy); if(ob.prawy instanceof Tree) w2.add(ob.prawy); //for if(w1.isempty()) return -1; copyvector(w2,w1); public int getminimumvalue(){ w1.clear(); w2.clear(); /*do przechowywania tymczasowych wynikow*/ int temp; int min=999999;//tu powinna byc najwieksza liczba typu int /*jesli minimum korzenia mniejsze od min to ustanowienie minimum=wartosc aktualnego wezla*/ if(min>getvalue()) min=getvalue(); /*inicjacja listy potomkami korzenia - od czegos trzeba zaczac*/ w1.add(lewy); w1.add(prawy); /*dopoki nie koniec elementow*/ while(true){ int n=w1.size(); for(int i=0;i<n;i++){ Tree ob=(tree)w1.get(i); /*jesli wartosc badanego wezla jest mniejsza od do tej pory znalezionego minimum to ustaw minimum=wartosc_wezla*/ if(ob.getvalue()<min) min=ob.getvalue(); /*jesli istnieja potomki danego wezla to dodanie ich do drugiej listy*/ if(ob.lewy instanceof Tree) w2.add(ob.lewy); if(ob.prawy instanceof Tree) w2.add(ob.prawy); //for if(w2.isempty()) break; copyvector(w2,w1); 31
32 /*jesli to nie znaleziono min wartosci wezla mniejszego od */ if(min==999999) return -1; return min; public int getmaximumvalue(){ w1.clear(); w2.clear(); /*do przechowywania tymczasowych wynikow*/ int temp; int max= ;//tu powinna byc najwieksza liczba typu int //pw.println(""+getkey()); /*-wyswietla kolejne przeszukiwane wezly*/ /*jesli maximum korzenia wieksze od min to ustanowienie maximum=wartosc aktualnego wezla*/ if(max<getvalue()) max=getvalue(); /*inicjacja listy potomkami korzenia - od czegos trzeba zaczac*/ w1.add(lewy); w1.add(prawy); /*dopoki nie koniec elementow*/ while(true){ int n=w1.size(); for(int i=0;i<n;i++){ Tree ob=(tree)w1.get(i); /*jesli wartosc badanego wezla jest wieksza od do tej pory znalezionego maximum to ustaw maximum=wartosc_wezla*/ if(ob.getvalue()>max) max=ob.getvalue(); /*Dodanie ewentualnych potomkow danego wezla do listy2*/ if(ob.lewy instanceof Tree) w2.add(ob.lewy); if(ob.prawy instanceof Tree) w2.add(ob.prawy); //for /*jesli brak wezlow to koniec szukania*/ if(w2.isempty()) break; /*zamiana list*/ copyvector(w2,w1); /*nie znaleziono max wartosci wezla wiekszej od */ if(max== ) return -1; return max; 32
33 Zaprezentowane powyżej sposoby przeszukiwania drzewa mają wspólną wadę i w zasadzie w takiej postaci nie są stosowane w algorytmach przeszukiwania drzewa gry. Wada ta przejawia się w tym, że całe drzewo jest przechowywane w pamięci. 33
34 ROZDZIAL III Charakterystyka programu kółko i krzyżyk 3.1 Zasady i odmiany gry Gra kółko i krzyżyk (Gomoku). Gra rozgrywana jest na planszy 19x19 pól. W grze mogą brać udział dwie osoby. Jedna ma krzyżyki, a druga kółka. Celem gry jest ułożenie na planszy pięciu kamieni (w niektórych programach do gry można ułożyć więcej - nazywa się to overline) swojego koloru w ciągłej linii, poziomo, pionowo, bądź na ukos. Pierwszy gracz, który tego dokona, zostaje zwycięzcą; jeśli nie uda się to nikomu (plansza zostanie zapełniona), następuje remis. Jeśli rozgrywany jest mecz na czas, przegrywa ta osoba, której skończy się on pierwszy. Pro Gomoku. Istnieje odmiana gry określana jako Pro Gomoku, w której występują następujące wymagania dotyczące początkowych ruchów na planszy: pierwszy ruch czarnych musi być na środku planszy. Pierwszy ruch białych może być gdziekolwiek. Drugi ruch czarnych musi być poza centralnym kwadratem 5x5, a pozostałe ruchy, zarówno czarnych jak i białych mogą być gdziekolwiek. Gomoku znane jest także jako kółko i krzyżyk do pięciu rozgrywane na kartce papieru w kratkę. Gomoku SWAP. Gomoku SWAP to najbardziej wyrównana opcja rozgrywki. Gracz 34
35 rozpoczynający wykonuje aż trzy ruchy - 2 czarnymi, 1 białymi, następnie drugi gracz wybiera kolor, którym chce grać. Kamienie można stawiać w dowolnym miejscu planszy. (Wielka Internetowa Encyklopedia Multimedialna). 3.2 Założenia gry przyjęte na potrzeby pracy Jak wynika z powyższego punktu istnieje wiele odmian Gomoku, z większymi bądź mniejszymi różnicami. Dlatego też dla celów tej pracy przyjęte zostały pewne założenia co do zasad gry. Celem gry jest ułożenie co najmniej pięciu znaków(kółka lub krzyżyka) w pionie, poziomie lub skosie. Gracz, który tego dokona zostaje zwycięzcą. Nie ma żadnych ograniczeń co do wykonywanych ruchów, poza tą że gracze wykonują posunięcia na przemian. 3.3 Opis interfejsu gry Program posiada interfejs, który poza możliwością samej gry, umożliwia liczne ustawienia, określające rodzaj graczy, zaczynającego, typ gracza(komputera), jak i możliwość zapisywania rozgrywek ich odtwarzania (z możliwością użycia czasu rzeczywistego), ustawienie zegarów limitujących czas gry dla każdego z graczy, jak i liczne ustawienia widoków gry. Program posiada także możliwość wyświetlania wartościowania ruchów po wykonaniu przeszukiwania drzewa gry dla danych ruchów lub po wstępnej analizie (wyborze ruchów kandydujących, które są brane pod uwagę przy przeszukiwaniu drzewa gry), jeśli wystąpi tzw. ruch wymuszony. 35
36 3.3.1 Rodzaj gry Menu AI zawiera możliwość definiowania rodzaju gry: -człowiek-człowiek. -człowiek-komputer. -komputer-człowiek. -komputer-komputer Jakość gracza-komputera Gra umożliwia zmianę konfiguracji gracza-komputera uzależnione od trzech czynników: a) poziom przeszukiwania drzewa gry - przeszukiwanie 1 poziomowe. - przeszukiwanie 5 poziomowe. - przeszukiwanie 6 poziomowe. Przeszukiwanie 5 i 6 poziomowe posiada ten sam mechanizm przeszukiwania, a różnica polega tylko na głębokości przeszukiwania. Przeszukiwanie 1 poziomowe polega na ocenie ruchu przez funkcję oceniająca. b) rodzaj funkcji oceniającej - silna funkcja oceniająca. - słabsza funkcja oceniająca. Podstawową różnicą między funkcjami jest lepsze wartościowanie w przypadku wystąpienia ruchów wymuszonych (dla słabszej funkcji w celu uniknięcia pomyłek należy wcześniej użyć sprawdzania ruchów wymuszonych). Wynika to z tego, że silna funkcja oceniająca przyznaje więcej punktów za znaki gracza w jednej linii, dzięki czemu unikany jest 36
37 również tzw. błąd krańca planszy, który objawia się często zaniżonym wynikiem dla pól znajdujących się blisko krawędzi planszy). Kolejna różnica przejawia się większym zróżnicowaniem punktacji ruchów dzięki czemu algorytm alfa-beta obcinanie dokonuje większej ilości cięć. c) siła ataku i obrony - bardzo silny atak. - silny atak. - atak mocniejszy od obrony. - Zrównoważony. - obrona mocniejsza od ataku. - silna obrona. - silny atak. - losowy zmienny. - losowy niezmienny. Gracz jest nastawiony na atak, na obronę lub jest zrównoważony. Dokonując wyboru ustawiamy typ gracza na całą grę. Gra umożliwia jednak stworzenie gracza, który będzie się zmieniał w sposób losowy w kolejnych ruchach, bądź gracza nie zmieniającego strategii, który będzie w sposób losowy ustalany na początku gry początku gry. Bez względu na typ gracza komputera, wbudowany jest niezależny system losowy, dzięki któremu komputer gra w różny sposób w różnych rozgrywkach. Dzięki temu gracz komputer zachowuje się w bardziej ludzki sposób. 37
38 3.3.3 Konfiguracja programu Poprzez konfigurację programu rozumiana jest tutaj możliwość ustawienia różnych rozmiarów(liczba wierszy i kolumn) planszy, wyglądu znaków (kółka i krzyżyk) jak i samej planszy (kolorystyki i rozmiarów: szerokości i wysokości planszy) Zapisywanie i odtwarzanie rozgrywek Program daje możliwość zapamiętania rozgrywek w formie: - kolejnych posunięć łącznie z nazwami graczy i rodzajów tych graczy (komputer lub człowiek). - zapamiętanie czasu wykonywanie poszczególnych ruchów. Dzięki zapisaniu rozgrywek możliwe jest ich odtworzenie w następujących formach: - podglądu sekwencji ruchów. - odtworzenia planszy gry. - odtworzenia w czasie rzeczywistym przebiegu gry. Mechanizm zapamiętywania daje możliwość analizy rozgrywek, a więc może posłużyć do nauki gry w kółko i krzyżyk, szczególnie dzięki obserwacji posunięć gracza wygrywającego. 3.4 Złożoność obliczeniowa i czas wykonywania Program umożliwia grę na różnych poziomach. Im więcej ruchów do przodu przewiduje tym więcej obliczeń musi wykonać w związku z czym wydłuża się czas potrzebny na wykonanie ruchu. 38
39 Poniższy wykres przedstawia dwie funkcje czasu wykonania ruchu w dwóch kolejnych grach z człowiekiem. Konfiguracja gry programu: - przewidywanie: 6 poziomów. - liczba pól w analizie drzewa gry: Czas (ms) czas1 czas Numer ruchu Rys 7. Wykresy funkcji czasu generowania rychów (dla 6 poziomów przeszukiwania i 11 pól branych pod uwagę w przeszukiwaniu). Czas wykonywania początkowych ruchów jest bardzo stabilny, natomiast w dalszej części widzimy już spore różnice czasu generowania ruchu. 39
40 Czas (ms) Liczba ruchów Numer ruchu Czas (ms) Liczba operacji Rys 8. Wykres funkcji czasu generowanie najlepszego ruchu i funkcji liczby obliczeń wykonanych do wygenerowania tego ruchu, w kolejnych ruchach. Dzięki zastosowaniu odmiennych wartości y można zauważyć że ilość obliczeń jest wprost proporcjonalna do czasu ich wykonywania. Dlatego bardzo ważne jest aby program był stabilny i wykonywał zawsze zbliżone ilości obliczeń, gdyż w przeciwnym razie może to powodować niedopuszczalny czas szukania najlepszego ruchu. Przy przewidywaniu wielu ruchów do przodu, wybranie do ostatecznego generowania ruchów o zaledwie kilka ruchów więcej może spowodować znaczny spadek szybkości wykonywania ruchów. 40
41 ROZDZIAŁ IV Tworzenie gry kółko i krzyżyk Poniższy rysunek przedstawia ukończony program kółko i krzyżyk będący celem tej pracy. Lewe okno zawiera wartościowanie ruchów. Na dole tego okna znajduje się czas szukania najlepszego ruchu oraz liczba węzłów przeszukanych na ostatnim poziomie drzewa. Czas generowania ostatniego ruchu wynosi 0, gdyż wystąpił ruch wymuszony, a ruchy takie zostają znalezione podczas wstępnego wartościowania. Liczba sprawdzonych węzłów wynosi 9, gdyż tyle ruchów wziętych zostałoby do analizy drzewa przeszukiwania. Napisz Ruch wymuszony określa w jaki sposób został znaleziony najlepszy ruch. Drugim możliwym komunikatem jest Alfa-beta obcinanie który oznacza, że do znalezienia najlepszego ruchu został wykorzystany algorytm stosowany do przeszukiwania drzewa - alfa-beta obcinanie. Rys 9. Wygląd programu kółko i krzyżyk w wersji na komputer PC. 41
42 4.1 Ogólnie o tworzenie gry. Tworzenie gry zostało podzielone na kilka etapów. a) zaplanowanie interfejsu gry (możliwych funkcji). Interfejs ten ulegał zmianom podczas tworzenia programu, jednak główne jego założenia pozostały takie same. b) przygotowanie interfejsu planszy i sposobu wyświetlania ( przyjęcie wartości na tablicy planszy dla gracza, przeciwnika i pustego pola). Na początku przyjęte zostały następujące wartości: -1 puste pole, 0 pole przeciwnika,1 pole gracza. W wyniku tworzenia gry okazało się, że zdecydowanie lepszym rozwiązaniem będzie przyjęcie takich wartości: 0 puste pole,-1 pole przeciwnika,1 pole gracza. Dzięki temu wartościowaniu łatwiej jest oceniać stan planszy i przyznawać premie. Dzieje się tak dlatego, że w drugim przypadku wartość pola jest tym większa im większa jest wartość danego pola dla gracza. Najlepsze pole dla gracza to jego znak za co ma 1 punkt, później pole puste 0, a najgorsze pole jest ze znakiem przeciwnika za co jest przyznawana wartość 1. Można w ten sposób uniknąć stosowanie konstrukcji: if(wartoscpola==znakgracza){ punkty+=1; else if(wartoscpola==znakprzeciwnika){ punkty -=1; Zamiast powyższego sprawdzania można zastosować: punkty+=znakgracza. Daje to wyraźne zmniejszenie ilości obliczeń. 42
43 Oczywiście w przypadku pierwszego sposobu można użyć powrotów np. gdy znak jest przeciwnika i zwrócenie wartości do tej pory uzyskanej (lub innej w zależności od założeń). Można również go ulepszyć przez zmianę sposobu sprawdzania pól w zależności od etapu gry. W pierwszym etapie gry będzie najwięcej pól pustych więc od ich sprawdzania należy rozpocząć. Jednak w dalszej części gry należy to zmienić, gdyż pól pustych zostaje coraz mniej. Jak zostało przedstawione powyżej czasem teoretycznie gorszy sposób może być bardziej wydajny, w zależności od kontekstu jego użycia. Gra powinna mieć elastyczny sposób zmiany jej rozmiaru. Należy od początku przewidzieć możliwość zmiany rozmiaru gry. Nie zrobienie tego spowoduje później duże trudności, szczególnie w zaawansowanej fazie tworzenia gry, gdy już zaimplementujemy algorytmy sztucznej inteligencji i generatory ruchów. Należy utworzyć mechanizm, który pozwoli automatycznie dokonywać zmian wszelkich wartości w tworzonych obiektach w zależności od rozmiarów planszy. Rodzaje gry ( rodzaje graczy ). Gra powinna umożliwiać wszystkie typy gry. a) człowiek - człowiek b) człowiek - komputer c) komputer - człowiek d) komputer - komputer b) napisanie mechanizmu umożliwiającego grę z komputerem (np. poprzez losowe generowanie ruchów przez komputer). c) napisanie funkcji oceniającej pozwalającej na grę komputera 43
44 z analizowaniem jednego ruchu. e) napisanie generacji możliwych kombinacji posunięć na kilka ruchów do przodu f) zastosowanie algorytmu alfa-beta obcinanie do punktu e i funkcji oceniającej pozwalającej na grę komputera z przewidywaniem kilku ruchów do przodu. g) Metody testowania gry - z człowiekiem - z drugim graczem-komputerem w trybie gry komputer-komputer przy różnych ustawieniach gry. - z innym programem, gdzie człowiek pełni funkcję pośrednika. - ustawianie kilku ruchów początkowych w kodzie źródłowym gry i sprawdzanie reakcji komputera na daną sytuację. Daje to duże możliwości w modelowaniu zachowań komputera, przez zmianę zmiennych(stałych) wartościujących lub przez zmianę algorytmu oceniającego. 4.2 Schemat działania gry Schemat tworzenie gry logicznej wykorzystującej sztuczną inteligencję przebiega według określonych schematów. Do schematów tych, opisanych w poniższych punktach należy: - sprawdzenie czy jest ruch wygrywającego - sprawdzenie czy przeciwnik ma ruch wygrywający - wybranie ruchów kandydujących - generacja ruchów gry i przeszukiwanie heurystyczne - zastosowanie funkcji oceniającej dany ruch 44
45 - wybranie najlepszego ruchu - sprawdzenie warunków kończących Powyższe punktu zostały rozwinięte poniżej Sprawdzanie czy gra zakończona Po każdym ruchu należy dokonać sprawdzenia czy któryś z graczy nie ustawił piątki, a tym samym czy jest zwycięzcą gry. W przypadku gdy gracz ułożył piątke gra jest zakończona i zostaje wyświetlony komunikat informujący o zwycięzcy gry a także zaznaczenie znaków, które doprowadziły do zwycięstwa Generowanie ruchu wymuszonego Ruch wymuszony następuje w dwóch sytuacjach: - wykonanie ruchu spowoduje zwycięstwo po tych ruchu lub jest pewne zwycięstwo w ruchu następnym - jeśli nie wykonamy danego ruchu przeciwnik wygra w następnym, bądź w 2 posunięciach Przed przeszukiwaniem drzewa gry należy przeszukać planszę w celu znalezienie przedstawionych powyżej sytuacji. Jeśli wystąpi dana sytuacja należy wykonać ruch w celu osiągnięcia zwycięstwa lub uniknięciu porażki. W czasie gry takich ruchów jest dość dużo. Dlatego stosowanie takiej metody jest konieczne z 2 powodów: - unika ewentualnych błędów (na skutek niedoskonałości metody przeszukiwanie drzewa gry i funkcji oceniającej) - skraca czas wykonania ruchu 45
46 4.2.3 Wybranie ruchów kandydujących Bardzo ważną rzeczą jest wybór ruchów kandydujących do przeszukiwanie drzewa gry. Wybranie wszystkich możliwych posunięć nie jest dobrym rozwiązaniem gdyż wpłynie to na wydłużenie czasu przeszukiwanie drzewa gry do czasów niedopuszczalnych przy odpowiednio głębokim przeszukiwaniu oraz dla dużej planszy. Dlatego należy stosować dobór ruchów do analizy. W programie będącym tematem tej pracy zastosowano dwu-stopniowy mechanizm doboru ruchów: - wybranie możliwych do wykonania ruchów w obrębie których w odległości co najwyżej dwóch pól znajduje się jakiś znak (kółko lub krzyżyk). Zastosowana została do tego tablica do której po wykonaniu każdego ruchu dodawani są sąsiedzi w odległości co najwyżej 2 pól, jeśli oczywiście już w tej tablicy się nie znajdują. Pole, które zostało zajęte przez ruch jest natomiast usuwane z listy ruchów do wstępnie przyjętych do analizy. - Ocenienie wszystkich pól z listy pól przyjętych w powyższym punkcie i ocenienie ich za pomocą funkcji heurystycznej (w tym programie funkcja oceniająca zastosowana do doboru pól kandydujących jest zarazem funkcją oceniającą zastosowaną przy przeszukiwaniu drzewa gry). Działanie tej funkcji heurystycznej zostanie opisane poniżej Przeszukiwania drzewa gry Przeszukiwanie drzewa gry stosuje się do znalezienia optymalnego ruchu. W programie zastosowany został algorytm alfa-beta obcinanie, który jest ulepszoną wersją algorytmu minimax. Alfa-beta obcinanie nie sprawdza węzłów 46
47 (stosując tak zwane obcięcia), które nie mają wpływu na końcowy wynik minimaxowania. Oczywiście nie zawsze uzyskany zostaje najlepszy ruch (szczególnie, że nawet dwaj bardzo dobrzy gracze często nie wykonali by tego samego ruchu w danej sytuacji, więc trudno jest wskazać, który ruch w danej sytuacji jest rzeczywiście najlepszy i czy w ogóle jest taka możliwość). Przeszukiwanie drzewa polega na generacji ruchów i ich wartościowaniu przez funkcje oceniającą. Następnie zastosowany jest algorytm alfa-beta obcinanie do uzyskania wyników na najwyższym poziomie drzewa gry i w ten sposób wybrany zostaje najlepszy ruch. Kolejność sprawdzania ruchu ma bardzo duże znaczenie na szybkość przeszukiwania, nie ma natomiast wpływu na sam wynik (chyba, że stosuje się mechanizm ograniczenia czasowego, który przerywa przeszukiwanie w momencie przekroczenia limitu czasowego) Funkcja oceniająca wartościowanie danych posunięć Działanie funkcji oceniającej polega na przydzieleniu wartości liczbowej badanemu ruchowi. Jej znaczenie ma decydujący wpływ na siłę programu. W zasadzie pisanie gier logicznych bazujących na sztucznej inteligencji różni się właśnie funkcją oceniającą (także generacją ruchów właściwą dla danej gry). W prezentowanym programie zastosowane została dwie funkcje oceniające zarówno do wyboru pól do przeszukiwania, jak i do oceny ruchów przy przeszukiwaniu Zmienność algorytmu przeszukiwania oraz funkcji oceniającej Ważną cechą programu grającego jest jego zmienność. Gdyby tego nie było program zawsze grałby tak samo dla danych ustawień planszy co jest 47
48 efektem niepożądanym. Dlatego stosuje się techniki pozwalające uzyskać różne posunięcia gracza komputera dla danych układów planszy (oczywiście ruchy muszą być dobre). Metody zastosowane w programie do zmienności gry są: - zmiana wartościowanie w funkcji oceniającej. - zmiana wartości mnożnika na poszczególnych poziomach drzewa gry. Zmiany wartości mogą następować na różne sposoby: - losowy. - cyklicznie zmiany wprowadzone np. za pomocą parametrów. Ciekawą rzeczą jest, że przy ustawieniach przy których program bardzo dobrze radził sobie z użytym do testów Carbon Gomoku na poziomie 6 (zwycięstwo), grał przeciętnie z Carbon na poziomie Najbardziej znane algorytmy przeszukiwania drzewa gry Zbiory podczas przeszukiwań są najczęściej reprezentowane w postaci listy, stosu lub kolejki. Jeżeli lista jest stosem, to strategia przeszukiwania nazywana jest wgłąb. Nazwa podkreśla kolejność przeszukiwanych węzłów. Pojedyncza droga badana jest tak długo, aż jej ostatni element nie zostanie określony jako węzeł celu lub końcowy. Przeszukiwanie prowadzone jest zawsze od ostatnio sprawdzanego węzła, który ma niewykorzystane krawędzie. Strategia wgłąb może być nieskuteczna, gdy zostanie zastosowana dla dużych grafów, a szczególnie dla grafów o nieskończonej głębokości. W tym przypadku wybieranie grafów o coraz większej głębokości może być nieskuteczne, nawet w przypadku gdy węzeł celu miał skończoną głębokość. Z tego powodu omawiana strategia jest stosowana ze stosowaniem kontroli głębokości. Gdy głębokość spełnia własność końcową, w strategii w wgłąb następuje powrót. 48
Marcel Stankowski Wrocław, 23 czerwca 2009 INFORMATYKA SYSTEMÓW AUTONOMICZNYCH
Marcel Stankowski Wrocław, 23 czerwca 2009 INFORMATYKA SYSTEMÓW AUTONOMICZNYCH Przeszukiwanie przestrzeni rozwiązań, szukanie na ślepo, wszerz, w głąb. Spis treści: 1. Wprowadzenie 3. str. 1.1 Krótki Wstęp
Bardziej szczegółowoPodstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno
Instrukcja laboratoryjna 5 Podstawy programowania 2 Temat: Drzewa binarne Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny Drzewa są jedną z częściej wykorzystywanych struktur danych. Reprezentują
Bardziej szczegółowoInformatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Bardziej szczegółowoZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.
POLITECHNIKA WARSZAWSKA Instytut Automatyki i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 204/205 Język programowania: Środowisko programistyczne: C/C++ Qt Wykład 2 : Drzewa BST c.d., równoważenie
Bardziej szczegółowoWstęp do Sztucznej Inteligencji
Wstęp do Sztucznej Inteligencji Rozwiązywanie problemów-i Joanna Kołodziej Politechnika Krakowska Wydział Fizyki, Matematyki i Informatyki Rozwiązywanie problemów Podstawowe fazy: Sformułowanie celu -
Bardziej szczegółowoRozwiązywanie problemów metodą przeszukiwania
Rozwiązywanie problemów metodą przeszukiwania Dariusz Banasiak Katedra Informatyki Technicznej W4/K9 Politechnika Wrocławska Reprezentacja problemu w przestrzeni stanów Jedną z ważniejszych metod sztucznej
Bardziej szczegółowoUniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Sterowania i Systemów Informatycznych ELEMENTY SZTUCZNEJ INTELIGENCJI Laboratorium nr 9 PRZESZUKIWANIE GRAFÓW Z
Bardziej szczegółowoRozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Bardziej szczegółowoOSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA
OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) 20.11.2002 Algorytmy i Struktury Danych PIŁA ZŁOŻONE STRUKTURY DANYCH C za s tw or ze nia s tr uk tur y (m s ) TWORZENIE ZŁOŻONYCH STRUKTUR DANYCH: 00 0
Bardziej szczegółowoBadania operacyjne: Wykład Zastosowanie kolorowania grafów w planowaniu produkcji typu no-idle
Badania operacyjne: Wykład Zastosowanie kolorowania grafów w planowaniu produkcji typu no-idle Paweł Szołtysek 12 czerwca 2008 Streszczenie Planowanie produkcji jest jednym z problemów optymalizacji dyskretnej,
Bardziej szczegółowo3. MINIMAX. Rysunek 1: Drzewo obrazujące przebieg gry.
3. MINIMAX. Bardzo wygodną strukturą danych pozwalającą reprezentować stan i przebieg gry (szczególnie gier dwuosobowych) jest drzewo. Węzły drzewa reprezentują stan gry po wykonaniu ruchu przez jednego
Bardziej szczegółowoW powyższym kodzie utworzono wyliczenie dni tygodnia.
Typ wyliczeniowy (zwane również enumeration lub enum) jest to typ danych składający się z zestawu nazwanych wartości. Do zmiennej, która została zadeklarowana jako typ wyliczeniowy może być przypisane
Bardziej szczegółowoAlgorytmy sztucznej inteligencji
www.math.uni.lodz.pl/ radmat Przeszukiwanie z ograniczeniami Zagadnienie przeszukiwania z ograniczeniami stanowi grupę problemów przeszukiwania w przestrzeni stanów, które składa się ze: 1 skończonego
Bardziej szczegółowoHeurystyki. Strategie poszukiwań
Sztuczna inteligencja Heurystyki. Strategie poszukiwań Jacek Bartman Zakład Elektrotechniki i Informatyki Instytut Techniki Uniwersytet Rzeszowski DLACZEGO METODY PRZESZUKIWANIA? Sztuczna Inteligencja
Bardziej szczegółowoZasady programowania Dokumentacja
Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika
Bardziej szczegółowoAlgorytmy z powrotami. Algorytm minimax
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
Bardziej szczegółowoAplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 Klasa zbiór pól i metod Obiekt
Bardziej szczegółowoSZTUCZNA INTELIGENCJA
SZTUCZNA INTELIGENCJA WYKŁAD 12. PRZESZUKIWANIE Częstochowa 2014 Dr hab. inż. Grzegorz Dudek Wydział Elektryczny Politechnika Częstochowska ROZWIĄZYWANIE PROBLEMÓW JAKO PRZESZUKIWANIE Istotną rolę podczas
Bardziej szczegółowoPodstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia
Podstawy informatyki Elektrotechnika I rok Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Katedra Energoelektroniki i Automatyki Systemów Przetwarzania Energii AGH Kraków 2017 Tematyka
Bardziej szczegółowoProgramowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Bardziej szczegółowoMaciej Piotr Jankowski
Reduced Adder Graph Implementacja algorytmu RAG Maciej Piotr Jankowski 2005.12.22 Maciej Piotr Jankowski 1 Plan prezentacji 1. Wstęp 2. Implementacja 3. Usprawnienia optymalizacyjne 3.1. Tablica ekspansji
Bardziej szczegółowolekcja 8a Gry komputerowe MasterMind
lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych
Bardziej szczegółowoKonstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.
Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class
Bardziej szczegółowoTeraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres rozszerzony. Część 1.
Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres rozszerzony. Część 1. Grażyna Koba MIGRA 2019 Spis treści (propozycja na 2*32 = 64 godziny lekcyjne) Moduł A. Wokół komputera i sieci komputerowych
Bardziej szczegółowoPodstawy programowania, Poniedziałek , 8-10 Projekt, część 1
Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem
Bardziej szczegółowoXQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery
http://xqtav.sourceforge.net XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery dr hab. Jerzy Tyszkiewicz dr Andrzej Kierzek mgr Jacek Sroka Grzegorz Kaczor praca mgr pod
Bardziej szczegółowoPodstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno
Instrukcja laboratoryjna 6 Podstawy programowania 2 Temat: Funkcje i procedury rekurencyjne Przygotował: mgr inż. Tomasz Michno Wstęp teoretyczny Rekurencja (inaczej nazywana rekursją, ang. recursion)
Bardziej szczegółowoProgramowanie genetyczne, gra SNAKE
STUDENCKA PRACOWNIA ALGORYTMÓW EWOLUCYJNYCH Tomasz Kupczyk, Tomasz Urbański Programowanie genetyczne, gra SNAKE II UWr Wrocław 2009 Spis treści 1. Wstęp 3 1.1. Ogólny opis.....................................
Bardziej szczegółowoJęzyk JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy Wykład 3, część 3 1 Język JAVA podstawy Plan wykładu: 1. Konstrukcja kodu programów w Javie 2. Identyfikatory, zmienne 3. Typy danych 4. Operatory, instrukcje sterujące instrukcja warunkowe,
Bardziej szczegółowoTeraz bajty. Informatyka dla szkoły podstawowej. Klasa VI
1 Teraz bajty. Informatyka dla szkoły podstawowej. Klasa VI 1. Obliczenia w arkuszu kalkulacyjnym Rozwiązywanie problemów z wykorzystaniem aplikacji komputerowych obliczenia w arkuszu kalkulacyjnym wykonuje
Bardziej szczegółowoZłożoność obliczeniowa zadania, zestaw 2
Złożoność obliczeniowa zadania, zestaw 2 Określanie złożoności obliczeniowej algorytmów, obliczanie pesymistycznej i oczekiwanej złożoności obliczeniowej 1. Dana jest tablica jednowymiarowa A o rozmiarze
Bardziej szczegółowoWyznaczanie strategii w grach
Wyznaczanie strategii w grach Dariusz Banasiak Katedra Informatyki Technicznej W4/K9 Politechnika Wrocławska Definicja gry Teoria gier i konstruowane na jej podstawie programy stanowią jeden z głównych
Bardziej szczegółowoAlgorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski
Algorytmy i struktury danych Wykład 5: Drzewa Dr inż. Paweł Kasprowski pawel@kasprowski.pl Drzewa Struktury przechowywania danych podobne do list ale z innymi zasadami wskazywania następników Szczególny
Bardziej szczegółowoProgramowanie i techniki algorytmiczne
Temat 2. Programowanie i techniki algorytmiczne Realizacja podstawy programowej 1) wyjaśnia pojęcie algorytmu, podaje odpowiednie przykłady algorytmów rozwiązywania różnych 2) formułuje ścisły opis prostej
Bardziej szczegółowoProgramowanie obiektowe
Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.
Bardziej szczegółowoAlgorytmy sortujące i wyszukujące
Algorytmy sortujące i wyszukujące Zadaniem algorytmów sortujących jest ułożenie elementów danego zbioru w ściśle określonej kolejności. Najczęściej wykorzystywany jest porządek numeryczny lub leksykograficzny.
Bardziej szczegółowoAlgorytm genetyczny (genetic algorithm)-
Optymalizacja W praktyce inżynierskiej często zachodzi potrzeba znalezienia parametrów, dla których system/urządzenie będzie działać w sposób optymalny. Klasyczne podejście do optymalizacji: sformułowanie
Bardziej szczegółowooperacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.
Problem porządkowania zwanego również sortowaniem jest jednym z najważniejszych i najpopularniejszych zagadnień informatycznych. Dane: Liczba naturalna n i ciąg n liczb x 1, x 2,, x n. Wynik: Uporządkowanie
Bardziej szczegółowoZłożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to
Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to wprowadzili J. Hartmanis i R. Stearns. Najczęściej przez zasób rozumie się czas oraz pamięć dlatego
Bardziej szczegółowoStrategia "dziel i zwyciężaj"
Strategia "dziel i zwyciężaj" W tej metodzie problem dzielony jest na kilka mniejszych podproblemów podobnych do początkowego problemu. Problemy te rozwiązywane są rekurencyjnie, a następnie rozwiązania
Bardziej szczegółowoWyszukiwanie binarne
Wyszukiwanie binarne Wyszukiwanie binarne to technika pozwalająca na przeszukanie jakiegoś posortowanego zbioru danych w czasie logarytmicznie zależnym od jego wielkości (co to dokładnie znaczy dowiecie
Bardziej szczegółowoPodstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
Bardziej szczegółowoSortowanie - wybrane algorytmy
Sortowanie - wybrane algorytmy Aleksandra Wilkowska Wydział Matematyki - Katedra Matematyki Stosowanej Politechika Wrocławska 2 maja 2018 1 / 39 Plan prezentacji Złożoność obliczeniowa Sortowanie bąbelkowe
Bardziej szczegółowoDodatkowo planowane jest przeprowadzenie oceny algorytmów w praktycznym wykorzystaniu przez kilku niezależnych użytkowników ukończonej aplikacji.
Spis Treści 1. Wprowadzenie... 2 1.1 Wstęp... 2 1.2 Cel pracy... 2 1.3 Zakres pracy... 2 1.4 Użyte technologie... 2 1.4.1 Unity 3D... 3 2. Sztuczna inteligencja w grach komputerowych... 4 2.1 Zadanie sztucznej
Bardziej szczegółowoScenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW-4014-87/99
Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW-4014-87/99 Techniki algorytmiczne realizowane przy pomocy grafiki żółwia w programie ELI 2,0. Przedmiot: Informatyka
Bardziej szczegółowoAlgorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne
Algorytmy i struktury danych Drzewa: BST, kopce Letnie Warsztaty Matematyczno-Informatyczne Drzewa: BST, kopce Definicja drzewa Drzewo (ang. tree) to nieskierowany, acykliczny, spójny graf. Drzewo może
Bardziej szczegółowoZadanie 1: Piętnastka
Informatyka, studia dzienne, inż. I st. semestr VI Sztuczna Inteligencja i Systemy Ekspertowe 2010/2011 Prowadzący: mgr Michał Pryczek piątek, 12:00 Data oddania: Ocena: Grzegorz Graczyk 150875 Marek Rogalski
Bardziej szczegółowo2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych
2. Tablice Tablica to struktura danych przechowująca elementy jednego typu (jednorodna). Dostęp do poszczególnych elementów składowych jest możliwy za pomocą indeksów. Rozróżniamy następujące typy tablic:
Bardziej szczegółowoInstrukcje dla zawodników
Instrukcje dla zawodników Nie otwieraj arkusza z zadaniami dopóki nie zostaniesz o to poproszony. Instrukcje poniżej zostaną ci odczytane i wyjaśnione. 1. Arkusz składa się z 3 zadań. 2. Każde zadanie
Bardziej szczegółowoTworzenie gier na urządzenia mobilne
Katedra Inżynierii Wiedzy Teoria podejmowania decyzji w grze Gry w postaci ekstensywnej Inaczej gry w postaci drzewiastej, gry w postaci rozwiniętej; formalny opis wszystkich możliwych przebiegów gry z
Bardziej szczegółowoAlgorytmy dla gier dwuosobowych
Algorytmy dla gier dwuosobowych Wojciech Dudek Seminarium Nowości Komputerowe 5 czerwca 2008 Plan prezentacji Pojęcia wstępne (gry dwuosobowe, stan gry, drzewo gry) Algorytm MiniMax Funkcje oceniające
Bardziej szczegółowoNiezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.
Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą
Bardziej szczegółowoINFORMATYKA POZIOM ROZSZERZONY
EGZAMIN MATURALNY W ROKU SZKOLNYM 2016/2017 FORMUŁA OD 2015 ( NOWA MATURA ) INFORMATYKA POZIOM ROZSZERZONY ZASADY OCENIANIA ROZWIĄZAŃ ZADAŃ ARKUSZ MIN-R1, R2 MAJ 2017 Uwaga: Akceptowane są wszystkie odpowiedzi
Bardziej szczegółowo1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.
1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb. Algorytmy przeszukiwania w głąb i wszerz są najczęściej stosowanymi algorytmami przeszukiwania. Wykorzystuje się je do zbadania istnienia połączenie
Bardziej szczegółowoMetody Metody, parametry, zwracanie wartości
Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca
Bardziej szczegółowoECDL Podstawy programowania Sylabus - wersja 1.0
ECDL Podstawy programowania Sylabus - wersja 1.0 Przeznaczenie Sylabusa Dokument ten zawiera szczegółowy Sylabus dla modułu Podstawy programowania. Sylabus opisuje, poprzez efekty uczenia się, zakres wiedzy
Bardziej szczegółowoUkłady VLSI Bramki 1.0
Spis treści: 1. Wstęp... 2 2. Opis edytora schematów... 2 2.1 Dodawanie bramek do schematu:... 3 2.2 Łączenie bramek... 3 2.3 Usuwanie bramek... 3 2.4 Usuwanie pojedynczych połączeń... 4 2.5 Dodawanie
Bardziej szczegółowoJAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.
JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod
Bardziej szczegółowoZadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85
Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych Klasa Średnia 8a 3,54 8b 5,25 8c 4,21 8d 4,85 Do wstawienia wykresu w edytorze tekstu nie potrzebujemy mieć wykonanej tabeli jest ona tylko
Bardziej szczegółowoZaawansowane algorytmy i struktury danych
Zaawansowane algorytmy i struktury danych u dr Barbary Marszał-Paszek Opracowanie pytań praktycznych z egzaminów. Strona 1 z 12 Pytania praktyczne z kolokwium zaliczeniowego z 19 czerwca 2014 (studia dzienne)
Bardziej szczegółowoProgramowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Lemay, Naughton R. Cadenhead Java Podręcznik 2 dla kaŝdego Języka Programowania Java Linki Krzysztof Boone oprogramowania
Bardziej szczegółowoREFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania
REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania Autor: Anna Nowak Promotor: dr inż. Jan Kowalski Kategorie: gra logiczna Słowa kluczowe: Sudoku, generowanie plansz, algorytmy,
Bardziej szczegółowoMetoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.
Plan Procedura decyzyjna Reguły α i β - algorytm Plan Procedura decyzyjna Reguły α i β - algorytm Logika obliczeniowa Instytut Informatyki 1 Procedura decyzyjna Logiczna konsekwencja Teoria aksjomatyzowalna
Bardziej szczegółowoInnowacja pedagogiczna na zajęciach komputerowych w klasach 4e, 4f, 4g. Nazwa innowacji Programowy Zawrót Głowy
Szkoła Podstawowa nr 13 im. Arkadego Fiedlera w Gorzowie Wlkp. rok szkolny 2016-2017 Innowacja pedagogiczna na zajęciach komputerowych w klasach 4e, 4f, 4g Nazwa innowacji Programowy Zawrót Głowy Autor
Bardziej szczegółowoZapisywanie algorytmów w języku programowania
Temat C5 Zapisywanie algorytmów w języku programowania Cele edukacyjne Zrozumienie, na czym polega programowanie. Poznanie sposobu zapisu algorytmu w postaci programu komputerowego. Zrozumienie, na czym
Bardziej szczegółowoPartition Search i gry z niezupełną informacją
MIMUW 21 stycznia 2010 1 Co to jest gra? Proste algorytmy 2 Pomysł Algorytm Przykład użycia 3 Monte Carlo Inne spojrzenie Definicja Co to jest gra? Proste algorytmy Grą o wartościach w przedziale [0, 1]
Bardziej szczegółowoĆwiczenie 1 Planowanie trasy robota mobilnego w siatce kwadratów pól - Algorytm A
Ćwiczenie 1 Planowanie trasy robota mobilnego w siatce kwadratów pól - Algorytm A Zadanie do wykonania 1) Utwórz na pulpicie katalog w formacie Imię nazwisko, w którym umieść wszystkie pliki związane z
Bardziej szczegółowoStruktury Danych i Złożoność Obliczeniowa
Struktury Danych i Złożoność Obliczeniowa Zajęcia 3 Struktury drzewiaste drzewo binarne szczególny przypadek drzewa, które jest szczególnym przypadkiem grafu skierowanego, stopień każdego wierzchołka jest
Bardziej szczegółowoAlgorytmika i pseudoprogramowanie
Przedmiotowy system oceniania Zawód: Technik Informatyk Nr programu: 312[ 01] /T,SP/MENiS/ 2004.06.14 Przedmiot: Programowanie Strukturalne i Obiektowe Klasa: druga Dział Dopuszczający Dostateczny Dobry
Bardziej szczegółowoDefinicje. Algorytm to:
Algorytmy Definicje Algorytm to: skończony ciąg operacji na obiektach, ze ściśle ustalonym porządkiem wykonania, dający możliwość realizacji zadania określonej klasy pewien ciąg czynności, który prowadzi
Bardziej szczegółowoSpacery losowe generowanie realizacji procesu losowego
Spacery losowe generowanie realizacji procesu losowego Michał Krzemiński Streszczenie Omówimy metodę generowania trajektorii spacerów losowych (błądzenia losowego), tj. szczególnych procesów Markowa z
Bardziej szczegółowoJęzyk ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Bardziej szczegółowoWymagania na poszczególne oceny szkolne dla klasy VI. (na podstawie Grażyny Koba, Teraz bajty. Informatyka dla szkoły podstawowej.
1 Wymagania na poszczególne oceny szkolne dla klasy VI (na podstawie Grażyny Koba, Teraz bajty. Informatyka dla szkoły podstawowej. Klasa VI ) 2 1. Obliczenia w arkuszu kalkulacyjnym słucha poleceń nauczyciela
Bardziej szczegółowoProgramowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 03 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas abstrakcyjnych i interfejsów. Wprowadzenie
Bardziej szczegółowoSortowanie zewnętrzne
Algorytmy i struktury danych Instytut Sterowania i Systemów Informatycznych Wydział Elektrotechniki, Informatyki i Telekomunikacji Uniwersytet Zielonogórski Sortowanie zewnętrzne 1 Wstęp Bardzo często
Bardziej szczegółowoAlgorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny
Algorytm to przepis; zestawienie kolejnych kroków prowadzących do wykonania określonego zadania; to uporządkowany sposób postępowania przy rozwiązywaniu zadania, problemu, z uwzględnieniem opisu danych
Bardziej szczegółowoJęzyk JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy wykład 2, część 1 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa w klasie! 2 Język
Bardziej szczegółowoJak napisać program obliczający pola powierzchni różnych figur płaskich?
Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy
Bardziej szczegółowoTuring i jego maszyny
Turing Magdalena Lewandowska Politechnika Śląska, wydział MS, semestr VI 20 kwietnia 2016 1 Kim był Alan Turing? Biografia 2 3 Mrówka Langtona Bomba Turinga 4 Biografia Kim był Alan Turing? Biografia Alan
Bardziej szczegółowo5.4. Tworzymy formularze
5.4. Tworzymy formularze Zastosowanie formularzy Formularz to obiekt bazy danych, który daje możliwość tworzenia i modyfikacji danych w tabeli lub kwerendzie. Jego wielką zaletą jest umiejętność zautomatyzowania
Bardziej szczegółowoAlgorytmy i struktury danych. Wykład 4
Wykład 4 Różne algorytmy - obliczenia 1. Obliczanie wartości wielomianu 2. Szybkie potęgowanie 3. Algorytm Euklidesa, liczby pierwsze, faktoryzacja liczby naturalnej 2017-11-24 Algorytmy i struktury danych
Bardziej szczegółowoTemat 20. Techniki algorytmiczne
Realizacja podstawy programowej 5. 1) wyjaśnia pojęcie algorytmu, podaje odpowiednie przykłady algorytmów rozwiązywania różnych problemów; 2) formułuje ścisły opis prostej sytuacji problemowej, analizuje
Bardziej szczegółowoZadanie 1. Suma silni (11 pkt)
2 Egzamin maturalny z informatyki Zadanie 1. Suma silni (11 pkt) Pojęcie silni dla liczb naturalnych większych od zera definiuje się następująco: 1 dla n = 1 n! = ( n 1! ) n dla n> 1 Rozpatrzmy funkcję
Bardziej szczegółowoTworzenie prezentacji w MS PowerPoint
Tworzenie prezentacji w MS PowerPoint Program PowerPoint dostarczany jest w pakiecie Office i daje nam możliwość stworzenia prezentacji oraz uatrakcyjnienia materiału, który chcemy przedstawić. Prezentacje
Bardziej szczegółowoRekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.
Rekurencja Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów. Zgodnie ze znaczeniem informatycznym algorytm rekurencyjny to taki który korzysta z samego
Bardziej szczegółowoPropozycje tematów zadań
Propozycje tematów zadań 1. WARCABY Opracować program do gry w warcaby dla dwu graczy. Program ma umożliwiać przesuwanie kursora na zmianę po polach białych lub czarnych, wskazywanie początku końca ruchu.
Bardziej szczegółowoPlanowanie drogi robota, algorytm A*
Planowanie drogi robota, algorytm A* Karol Sydor 13 maja 2008 Założenia Uproszczenie przestrzeni Założenia Problem planowania trasy jest bardzo złożony i trudny. W celu uproszczenia problemu przyjmujemy
Bardziej szczegółowoAbstrakcyjne struktury danych - stos, lista, drzewo
Sprawozdanie Podstawy Informatyki Laboratoria Abstrakcyjne struktury danych - stos, lista, drzewo Maciej Tarkowski maciek@akom.pl grupa VII 1/8 1. Stos Stos (ang. Stack) jest podstawową liniową strukturą
Bardziej szczegółowoALGORYTMY I STRUKTURY DANYCH
LGORTM I STRUKTUR DNH Temat 6: Drzewa ST, VL Wykładowca: dr inż. bigniew TRPT e-mail: bigniew.tarapata@isi.wat.edu.pl http://www.tarapata.strefa.pl/p_algorytmy_i_struktury_danych/ Współautorami wykładu
Bardziej szczegółowoWyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna
Podstawy Programowania 2 Drzewa bst - część druga Arkadiusz Chrobot Zakład Informatyki 12 maja 2016 1 / 8 Plan Wstęp Wyszukiwanie w BST Minimalny i maksymalny klucz Wskazany klucz Zmiany w funkcji main()
Bardziej szczegółowoTechnologia informacyjna Algorytm Janusz Uriasz
Technologia informacyjna Algorytm Janusz Uriasz Algorytm Algorytm - (łac. algorithmus); ścisły przepis realizacji działań w określonym porządku, system operacji, reguła komponowania operacji, sposób postępowania.
Bardziej szczegółowoPTI S1 Tabele. Tabele. Tabele
Tabele Tabele 43 1.3. Tabele Jako że bazy danych składają się z tabel, musimy nauczyć się jak je zaprojektować, a następnie stworzyć i zarządzać nimi w programie Microsoft Access 2013. Zajmiemy się również
Bardziej szczegółowoPracownia internetowa w każdej szkole (edycja Jesień 2007)
Instrukcja numer D1/05_03/Z Pracownia internetowa w każdej szkole (edycja Jesień 2007) Opiekun pracowni internetowej cz. 1 Ręczne zakładanie kont użytkowników (D1) Jak ręcznie założyć konto w systemie
Bardziej szczegółowoWykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Bardziej szczegółowoAlgorytm. Krótka historia algorytmów
Algorytm znaczenie cybernetyczne Jest to dokładny przepis wykonania w określonym porządku skończonej liczby operacji, pozwalający na rozwiązanie zbliżonych do siebie klas problemów. znaczenie matematyczne
Bardziej szczegółowoAlgorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek
Algorytmy i str ruktury danych Metody algorytmiczne Bartman Jacek jbartman@univ.rzeszow.pl Metody algorytmiczne - wprowadzenia Znamy strukturę algorytmów Trudność tkwi natomiast w podaniu metod służących
Bardziej szczegółowoProgramowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
Bardziej szczegółowoZa pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).
Algorytmy definicja, cechy, złożoność. Algorytmy napotykamy wszędzie, gdziekolwiek się zwrócimy. Rządzą one wieloma codziennymi czynnościami, jak np. wymiana przedziurawionej dętki, montowanie szafy z
Bardziej szczegółowoDokumentacja projektu Makao karciana gra sieciowa
Dokumentacja projektu Makao karciana gra sieciowa 1 Spis treści Specyfikacja wymagań...3 Diagram przypadków użycia...4 Scenariusze...5 Diagramy sekwencji...6 Diagram modelu domeny...8 Projekt graficznego
Bardziej szczegółowo