Środowisko programowe do nauki podstawowych algorytmów sztucznej inteligencji

Podobne dokumenty
Heurystyki. Strategie poszukiwań

Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Sterowania i Systemów Informatycznych

Wstęp do Sztucznej Inteligencji

ĆWICZENIE 1: Przeszukiwanie grafów cz. 1 strategie ślepe

Maciej Piotr Jankowski

Rozwiązywanie problemów metodą przeszukiwania

SZTUCZNA INTELIGENCJA

Marcel Stankowski Wrocław, 23 czerwca 2009 INFORMATYKA SYSTEMÓW AUTONOMICZNYCH

Heurystyczne metody przeszukiwania

Działanie algorytmu oparte jest na minimalizacji funkcji celu jako suma funkcji kosztu ( ) oraz funkcji heurystycznej ( ).

Badania operacyjne: Wykład Zastosowanie kolorowania grafów w planowaniu produkcji typu no-idle

Podręcznik użytkownika Obieg dokumentów

AiSD zadanie trzecie

a) 7 b) 19 c) 21 d) 34

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Ćwiczenie 1 Planowanie trasy robota mobilnego w siatce kwadratów pól - Algorytm A

Podsumowanie wyników ankiety

Backend Administratora

Zadanie 1: Piętnastka

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

TEORETYCZNE PODSTAWY INFORMATYKI

1. Synteza automatów Moore a i Mealy realizujących zadane przekształcenie 2. Transformacja automatu Moore a w automat Mealy i odwrotnie

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32

Zad. 3: Układ równań liniowych

PRZEWODNIK PO PRZEDMIOCIE

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Automatyczne tworzenie trójwymiarowego planu pomieszczenia z zastosowaniem metod stereowizyjnych

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

Opis. Wymagania wstępne (tzw. sekwencyjny system zajęć i egzaminów) Liczba godzin zajęć dydaktycznych z podziałem na formy prowadzenia zajęć

Instrukcja wprowadzania graficznych harmonogramów pracy w SZOI Wg stanu na r.

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Algorytm genetyczny (genetic algorithm)-

Kurs programowania. Wykład 12. Wojciech Macyna. 7 czerwca 2017

Algorytmy sztucznej inteligencji

Metody przeszukiwania

Zapisywanie algorytmów w języku programowania

Budowa argumentacji bezpieczeństwa z użyciem NOR-STA Instrukcja krok po kroku

Aplikacja (oprogramowanie) będzie umożliwiać przygotowanie, przeprowadzenie badania oraz analizę wyników według określonej metody.

Porównanie algorytmów wyszukiwania najkrótszych ścieżek międz. grafu. Daniel Golubiewski. 22 listopada Instytut Informatyki

Zad. 6: Sterowanie robotem mobilnym

Nauczanie na odległość

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW /99

Elementy kognitywistyki II: Sztuczna inteligencja. WYKŁAD V: Agent wciąż szuka rozwiązania (choć już nie na ślepo)

Uniwersytet w Białymstoku Wydział Ekonomiczno-Informatyczny w Wilnie SYLLABUS na rok akademicki 2012/2013

Zastosowanie CP-grafów do generacji siatek

Technologie informacyjne - wykład 12 -

SCENARIUSZ LEKCJI. Streszczenie. Czas realizacji. Podstawa programowa

Konkurs z przedmiotu eksploracja i analiza danych: problem regresji i klasyfikacji

Sortowanie przez wstawianie Insertion Sort

PRZEWODNIK PO PRZEDMIOCIE

Zad. 5: Sterowanie robotem mobilnym

Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej.

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Przewodnik użytkownika (instrukcja) AutoMagicTest

Plan. Raport. Tworzenie raportu z kreatora (1/3)

KATEDRA INFORMATYKI TECHNICZNEJ. Ćwiczenia laboratoryjne z Logiki Układów Cyfrowych. ćwiczenie 204

5c. Sieci i przepływy

9.9 Algorytmy przeglądu

Metody eksploracji danych w odkrywaniu wiedzy (MED) projekt, dokumentacja końcowa

Algorytmy mrówkowe. H. Bednarz. Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny w Szczecinie Inteligentne systemy informatyczne

PRZEWODNIK PO PRZEDMIOCIE

Złożoność obliczeniowa zadania, zestaw 2

Teoria grafów dla małolatów. Andrzej Przemysław Urbański Instytut Informatyki Politechnika Poznańska

Algorytm. a programowanie -

Elementy kognitywistyki II: Sztuczna inteligencja. WYKŁAD III: Problemy agenta

Programowanie i techniki algorytmiczne

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

Przykłady grafów. Graf prosty, to graf bez pętli i bez krawędzi wielokrotnych.

Dodawanie grafiki i obiektów

mgr inż. Magdalena Deckert Poznań, r. Metody przyrostowego uczenia się ze strumieni danych.

zna metody matematyczne w zakresie niezbędnym do formalnego i ilościowego opisu, zrozumienia i modelowania problemów z różnych

REFERAT PRACY DYPLOMOWEJ

Automatyczna klasyfikacja zespołów QRS

O badaniach nad SZTUCZNĄ INTELIGENCJĄ

Algorytmy genetyczne

KARTA PRZEDMIOTU. 1. Informacje ogólne. 2. Ogólna charakterystyka przedmiotu. Algorytmy i struktury danych, C3

LABORATORIUM 2: Przeszukiwanie grafów cz. 2 strategie heurystyczne

KARTA MODUŁU KSZTAŁCENIA

Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language)

Programowanie dynamiczne i algorytmy zachłanne

Program EWIDENCJA ODZIEŻY ROBOCZEJ INSTRUKCJA UŻYTKOWNIKA Przejdź do strony producenta programu

Przeszukiwanie z nawrotami. Wykład 8. Przeszukiwanie z nawrotami. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 238 / 279

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

OPTYMALIZACJA HARMONOGRAMOWANIA MONTAŻU SAMOCHODÓW Z ZASTOSOWANIEM PROGRAMOWANIA W LOGICE Z OGRANICZENIAMI

PROLOG WSTĘP DO INFORMATYKI. Akademia Górniczo-Hutnicza. Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej.

KARTA PRZEDMIOTU. Algorytmy i struktury danych, C4

Zad. 3: Rotacje 2D. Demonstracja przykładu problemu skończonej reprezentacji binarnej liczb

PRZEWODNIK PO PRZEDMIOCIE

Ćwiczenia nr 7. TEMATYKA: Krzywe Bézier a

EFEKTY UCZENIA SIĘ DLA KIERUNKU INŻYNIERIA DANYCH W ODNIESIENIU DO EFEKTÓW UCZENIA SIĘ PRK POZIOM 6

Zadanie 1: rozproszona wiedza SKJ (2016)

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Wykorzystanie algorytmów mrówkowych w dynamicznym problem

Nazwa przedmiotu: MODELOWANIE I ANALIZA SYSTEMÓW INFORMATYCZNYCH. Modeling and analysis of computer systems Forma studiów: Stacjonarne

Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres rozszerzony. Część 1.

problem w określonym kontekście siły istotę jego rozwiązania

Metody Kompilacji Wykład 3

Transkrypt:

Politechnika Warszawska Wydział Elektroniki i Technik Informacyjnych Instytut Informatyki Rok akademicki 2011/2012 PRACA DYPLOMOWA INŻYNIERSKA Tomasz Szalast Środowisko programowe do nauki podstawowych algorytmów sztucznej inteligencji Opiekun pracy mgr inż. Piotr Parewicz Ocena:... Podpis Przewodniczącego Komisji Egzaminu Dyplomowego

Specjalność: Inżynieria Systemów Informatycznych Data urodzenia: 1988.11.15 Data rozpoczęcia studiów: 2007.10.01 Życiorys Urodziłem się 15 listopada 1988 r. w Radzyniu Podlaskim w rodzinie nauczycielskiej. Uczęszczałem do szkoły podstawowej nr 1, następnie gimnazjum nr 1, po czym uzyskałem wykształcenie średnie, kończąc w 2007 roku liceum nr 1 w Radzyniu Podlaskim w klasie o profilu matematyczno-fizyczno-informatycznym. W październiku 2007 rozpocząłem studia o kierunku Informatyka na Politechnice Warszawskiej na wydziale Elektroniki i Technik Informacyjnych, rozwijając tym samym swoje zainteresowania z dziedziny technik komputerowych i programowania. EGZAMIN DYPLOMOWY... Podpis studenta Złożył egzamin dyplomowy w dniu... 20 r z wynikiem... Ogólny wynik studiów:... Dodatkowe wnioski i uwagi Komisji:......

STRESZCZENIE Celem niniejszej pracy dyplomowej było utworzenie zestawu narzędzi oraz opartego na nich zbioru ćwiczeń wspierających naukę i zrozumienie podstawowych metod sztucznej inteligencji. W ramach tego zadania zostały zaimplementowane wybrane algorytmy sztucznej inteligencji oraz odpowiedni interfejs graficzny. Aplikacja udostępnia możliwość testowania algorytmów, eksperymentowania na nich, śledzenie ich wykonywania, a także graficznej wizualizacji przebiegu na wybranych przykładach często poruszanych w tej dziedzinie. Przeznaczeniem pracy jest dostarczenie materiału dydaktycznego stanowiącego wstęp do tematyki sztucznej inteligencji. Słowa kluczowe: sztuczna inteligencja, środowisko do ćwiczeń, algorytmy, ćwiczenia, testowanie, wizualizacja graficzna, śledzenie przebiegu, materiały dydaktyczne THESIS TITLE IN ENGLISH The purpose of this thesis was to create a set of tools and a list of exercises that support training and understanding of basic artificial intelligence methods. The program required to implement common artificial intelligence algorithms and an appropriate graphical interface. The application provides a possibility to test algorithms, experiment over them, trace their execution and demonstrate graphical visualization basing on the most popular examples within this area. The destination of the thesis is to provide didactic materials that are an introduction to the thematic of artificial intelligence. Keywords: artificial intelligence, training environment, algorithms, exercises, testing, graphical visualization, tracing of execution, didactic materials

Spis treści 1 Wstęp... 7 1.1 Cel i zakres pracy... 7 1.2 Wymagania funkcjonalne... 8 2 Część pierwsza Wybrane algorytmy sztucznej inteligencji... 11 2.1 Wprowadzenie... 11 2.2 Sztuczna inteligencja słaba i mocna... 12 2.3 Przeszukiwanie Przestrzeni Stanów... 13 2.4 Algorytmy niepoinformowane ( ślepe )... 14 2.4.1 Algorytm Przeszukiwania W głąb ( Depth-First )... 14 2.4.2 Algorytm Przeszukiwania Wszerz ( Breadth-First )... 14 2.4.3 Algorytm Błądzenia Losowego ( Random-Walk )... 15 2.5 Algorytmy poinformowane... 16 2.5.1 Algorytm Best-First... 16 2.5.2 Algorytm A*... 16 2.5.3 Algorytm Wspinaczkowy ( Hill-Climbing )... 16 2.6 Planowanie sekwencji akcji... 18 2.6.1 Zastosowanie algorytmów przeszukiwania przestrzeni stanów... 20 2.6.2 Algorytm Means-Ends ( Cele-Środki )... 21 3 Część druga Środowisko dydaktyczne... 23 3.1 Przegląd funkcjonalności środowiska... 23 3.2 Ćwiczenia... 27 3.2.1 Ćwiczenie pierwsze... 29 3.2.2 Ćwiczenie drugie... 31 3.2.3 Ćwiczenie trzecie... 33 3.2.4 Ćwiczenie czwarte... 35 3.2.5 Ćwiczenie piąte... 37 3.2.6 Ćwiczenie szóste... 38 4 Część trzecia - Implementacja... 40 4.1 Implementacja algorytmów... 40 4.1.1 Przeszukiwanie w głąb... 40 4.1.2 Przeszukiwanie Wszerz... 40

4.1.3 Błądzenie Losowe... 42 4.1.4 Best-First strategia zachłanna... 43 4.1.5 A*... 45 4.1.6 Hill-Climbing... 47 4.2 Opis Implementacji Algorytmu Means-Ends w różnych wersjach... 48 4.2.1 Algorytm Means-Ends : Wersja klasyczna... 48 4.2.2 Algorytm Means-Ends : Wersja z regresją celów... 49 4.2.3 Algorytm Means-Ends : Wersja z nieukonkretnionymi celami... 49 4.3 Ogólny zarys implementacji aplikacji... 51 4.3.1 Ogólna architektura aplikacji... 52 4.3.2 Struktura skryptów języka Prolog w programie... 53 4.3.3 Uruchamianie algorytmów... 53 4.3.4 Interakcje między Javą a Prologiem w trakcie działania algorytmu... 54 5 Zakończenie... 56 6 Materiały pomocnicze... 57 7 Dodatki... 58 7.1 Instrukcja obsługi... 58 7.1.1 Definiowanie własnej przestrzeni stanów... 58 7.1.2 Definiowanie własnej heurystyki... 59 7.1.3 Definiowanie stanów początkowego i docelowego... 60 7.1.4 Definiowanie stanu docelowego... 60 7.1.5 Uruchomienie algorytmu... 60 7.1.6 Podmiana heurystyki... 61 7.1.7 Podgląd drzewa poszukiwań... 61 7.1.8 Graf... 61 7.1.9 Planer... 62 7.1.10 Puzzle 3x3... 63 7.1.11 Dodatkowe narzędzia... 63 7.2 Instrukcja do ćwiczeń... 65 7.2.1 Ćwiczenie pierwsze... 65 7.2.2 Ćwiczenie drugie... 66 7.2.3 Ćwiczenie trzecie... 67 7.2.4 Ćwiczenie czwarte... 68 7.2.5 Ćwiczenie piąte... 68

7.2.6 Ćwiczenie szóste... 68 7.3 Ręczne dostosowanie aplikacji... 70 7.3.1 Dodanie języka... 70 7.3.2 Dodanie algorytmu... 70 7.3.3 Dodanie funkcji... 70 7.3.4 Dodanie tekstu... 71 7.3.5 Dodanie ćwiczenia... 71 7.3.6 Dodanie własnoręcznie napisanej heurystyki... 72 7.3.7 Dodanie własnoręcznie napisanej przestrzeni stanów... 72 7.3.8 Dodanie własnoręcznie napisanego zadania... 72

1 Wstęp 1.1 Cel i zakres pracy Celem niniejszej pracy dyplomowej było utworzenie zestawu narzędzi oraz opartego na nich zbioru ćwiczeń wspierających naukę i zrozumienie podstawowych metod sztucznej inteligencji. Zakres dydaktyczny zestawu ćwiczeń obejmuje algorytmy implementujące klasyczne, ogólne metody przeszukiwania przestrzeni stanów oraz, jako przykład metod wyspecjalizowanych, algorytmy stosowane do zadania planowania sekwencji akcji. Ćwiczenia są zorganizowane w sekwencję według kryterium wzrastającego stopnia trudności pojęciowej. Ćwiczenia polegają na: zademonstrowaniu przebiegu działania algorytmów na przykładowych wejściowych opisach problemu, ze zwróceniem uwagi (objaśnienia) na główne właściwości przedstawianych algorytmów, obserwacji wpływu rozmiaru dziedziny problemu na efektywność i przebieg algorytmów, porównaniu efektywności różnych algorytmów implementujących określoną metodę, obserwacji przebiegu działania algorytmów dla problemów sformułowanych przez użytkownika. Do każdego algorytmu dobrano sposób wizualizacji przebiegu dostosowany do jego specyfiki. Zapewnienie takiego wsparcia dla dydaktycznych założeń programu ćwiczeń wymagało opracowania interfejsu graficznego dobrze sprzężonego z implementacją algorytmów, cechującego się przejrzystym obrazowaniem poszczególnych kroków działania algorytmów i ich wyników, umożliwiającego łatwą nawigację w środowisku oraz dostosowywanie go do własnych potrzeb. Implementacje algorytmów używane w ćwiczeniach są częściowo zaczerpnięte na poziomie kodu źródłowego z literatury, a częściowo opracowane przez autora pracy z przystosowaniem do zamierzonych celów dydaktycznych.

1.2 Wymagania funkcjonalne 1.2.1.1 Uruchamianie algorytmów Niezbędną funkcjonalnością aplikacji jest dostarczenie możliwości uruchamiania różnych algorytmów sztucznej inteligencji. Na wejściu każdego algorytmu powinno być możliwe zdefiniowanie: przestrzeni stanów/problematyki, warunków początkowych oraz celu zadania, a także ewentualnej heurystyki (o ile uruchamiany algorytm tego wymaga). Wynikiem wykonania przebiegu algorytmu powinien być komunikat podający rozwiązanie, bądź też komunikat o jego braku lub błędzie w wykonywaniu (np. w przypadku braku wystarczających zasobów). Pożądane jest włączenie do aplikacji dwóch lub więcej różnych implementacji tego samego algorytmu, w celu umożliwienia użytkownikowi porównania ich skuteczności. 1.2.1.2 Wizualizacja drzewa poszukiwań Wizualizacja przebiegu działania powinna mieć najogólniej postać drzewa, którego korzeniem jest stan początkowy na wejściu algorytmu, a pozostałe węzły reprezentują kolejno rozpatrywane stany, przy czym powinno być możliwe odczytanie informacji zawartych w danym węźle. Krawędzie drzewa powinny zawierać informację o kolejności jego ekspansji. Wyznaczone przez algorytm rozwiązanie powinno zostać naniesione na powstałe drzewo. 1.2.1.3 Wizualizacja drzewa celów W przypadku metody cele-środki aplikacja powinna posiadać możliwość podejrzenia drzewa celów dla przebiegu działania różnych implementacji algorytmów, które operują na celach planera. Węzły powinny reprezentować zbiór celów, które zostały przekazane na wejście danego kroku algorytmu. Jeśli w danym stanie cele zostały spełnione, powinno to zostać naniesione na graf, poprzez zmianę koloru węzła. 1.2.1.4 Śledzenie przebiegu algorytmu W celu lepszego zrozumienia przebiegu algorytmu ważną funkcjonalnością, którą aplikacja powinna dostarczać, jest możliwość śledzenia przebiegu algorytmu. Implementacja algorytmu powinna zawierać możliwość wstrzymania wykonywania przed rozpoczęciem kolejnego kroku algorytmu i kontynuacji po sygnale od użytkownika. 1.2.1.5 Pomiar parametrów drzewa poszukiwań/celów Wygenerowane drzewo poszukiwań/celów powinno zostać opisane za pomocą następujących parametrów: szerokość drzewa, głębokość oraz ilość węzłów. W przypadku śledzenia algorytmu parametry powinny opisywać stan drzewa odpowiedni do stanu aktualnej wizualizacji. 1.2.1.6 Pomiar czasu wykonania całego algorytmu Istotnym parametrem przy porównywaniu efektywności różnych algorytmów jest czas wykonania dla zadanego przykładu. Aplikacja powinna dostarczać możliwość prezentacji tej wartości po każdym wykonaniu algorytmu. 1.2.1.7 Pomiar czasu wykonania pojedynczego kroku algorytmu W przypadku, gdy algorytm został uruchomiony w trybie śledzenia, pomiar czasu powinien być wykonany dla każdego kroku.

1.2.1.8 Zmiana heurystyki w trakcie działania algorytmu W przypadku algorytmów heurystycznych użytkownik powinien mieć wpływ na przebieg algorytmu poprzez udostępnienie mu możliwości zastąpienia aktualnie wykorzystywanej heurystyki przez inną, wybraną przez niego funkcję oceny dla przestrzeni stanów, na której aktualnie operuje algorytm. 1.2.1.9 Demonstracja działania algorytmów na grafie w układzie współrzędnych Dobrym przykładem do demonstracji algorytmów przeszukiwania przestrzeni stanów jest graf naniesiony na układ współrzędnych. Przestrzeń stanów reprezentowana jest tym samym przez węzły reprezentujące stany, których parametrami są współrzędne wierzchołka, zaś krawędzie symbolizują możliwe przejścia między stanami, a co za tym idzie określają, które stany są następnikami. Koszt przejścia między stanami jest równy odległości między reprezentowanymi przez nich wierzchołkami. Oprócz wizualizacji grafu powinna istnieć możliwość wskazania dwóch wierzchołków, między którymi zostanie wyznaczona ścieżka według wskazanego algorytmu. Rozwiązanie zostanie odpowiednio zaznaczone na grafie. 1.2.1.10 Tworzenie własnych przestrzeni stanów Użytkownikowi powinna zostać zapewniona możliwość definiowania własnej problematyki w postaci przestrzeni stanów. Nowa przestrzeń stanów powinna być określona przez unikalną nazwę oraz parametry najprostszych typów (liczba rzeczywista, słowo, lista) identyfikowanych po unikalnej w skali definicji stanu nazwie. Oprócz formatu samej struktury, przestrzeń stanów powinna również zawierać definicje następników, które muszą być dyskretnym zbiorem bez narzutu na ograniczenie. 1.2.1.11 Definiowanie własnych heurystyk Użytkownikowi powinien być udostępniony zestaw narzędzi służący do definiowania nowych heurystyk dla zadanej przestrzeni stanów. Oprócz wskazania odpowiedniej nazwy przestrzeni stanów, dla której ma zostać utworzona heurystyka, powinna istnieć możliwość zdefiniowania różnych wartości wynikowych dla poszczególnych stanów. Do definiowania wartości powinny móc posłużyć wbudowane procedury i opisy stanu początkowego i docelowego. 1.2.1.12 Definiowanie własnych danych na wejście algorytmu Testowanie algorytmów powinno przebiegać dla różnych zadań do rozwiązania, dlatego też użytkownikowi powinna zostać zapewniona możliwość definiowania własnych przykładów w postaci par stan początkowy cel, które stanowiłyby dane wejściowe dla algorytmu, na podstawie których zostałoby wyznaczone rozwiązanie (o ile istnieje). Definiowanie tych parametrów powinno bazować na wybranej użytkownika przestrzeni stanów/problematyce i nie powinno wybiegać poza tę dziedzinę. 1.2.1.13 Tworzenie danych wejściowych algorytmów dla puzzli 3x3 Ze względu na częste wykorzystanie w przykładach sztucznej inteligencji problemu puzzli 3x3, aplikacja powinna zawierać wsparcie graficzne dla tworzenia takich przykładów w postaci odpowiedniej wizualizacji, w której użytkownik mógłby utworzyć stany początkowy i końcowy poprzez odpowiednie umiejscowienie puzzli na planszy, bez dodatkowego definiowania sytuacji za pomocą tekstu. 1.2.1.14 Wizualizacja graficzna problematyki puzzli 3x3 Do wsparcia graficznego przypadku puzzli 3x3 powinna również zaliczać się możliwość wizualizacji wyznaczonego rozwiązania dla tego przykładu. Demonstracja powinna odbywać się na zasadzie

przesuwania klocków w obrębie kwadratu podzielonego na 9 równych części, przy czym każdy ruch powinien być wykonany zgodnie z kolejnością wyznaczoną w rozwiązaniu uprzednio uruchomionego algorytmu dla tej tematyki. 1.2.1.15 Wizualizacja wykonania planu W ramach problematyki planowania sekwencji akcji w świecie klocków aplikacja powinna dostarczać możliwość wizualizacji przebiegu wyznaczonego planu. Kluczowe w tej demonstracji jest zachowanie kolejności wyznaczonej w rozwiązaniu algorytmu planowania sekwencji akcji. 1.2.1.16 Gramatyka wyrażeń przy definiowaniu wartości Przy definiowaniu wyrażeń wykorzystywanych do definiowania własnych przykładów oraz definicji powinna być zapewniona możliwość wykorzystania intuicyjnego zapisu wyrażenia. Tzn. jako argumenty funkcji można przekazywać wynik działania innej funkcji bez konieczności wyliczania zmiennych pośrednich, itp. 1.2.1.17 Udostępnienie materiałów dydaktycznych w aplikacji Materiały dydaktyczne do ćwiczeń z zakresu podstawowych metod sztucznej inteligencji powinny być dostępne z poziomu aplikacji w formie tekstu wzbogaconego o grafikę, przy czym pisemna zawartość materiałów powinna w miarę potrzeby charakteryzować się czcionką różnych rozmiarów, koloru i stylu. 1.2.1.18 Wybór języka aplikacji Aplikacja jest przeznaczona dla jak największej liczby użytkowników, dlatego też jednym z założeń jest, aby problem bariery językowej nie stanowił na dłuższą metę większej przeszkody. Zatem program powinien udostępniać możliwość zmiany języka tekstu interfejsu graficznego oraz udostępniać możliwość tworzenia ewentualnych modyfikacji mających na celu dodanie nowego języka, bądź też uzupełnienia w brakującego tekstu w danej mowie. 1.2.1.19 Dostosowywanie aplikacji do potrzeb użytkownika Przyjęta struktura plików konfiguracyjnych środowiska oraz ich zawartości powinna umożliwiać dostosowywanie aplikacji do potrzeb użytkownika poprzez ręczne dodawanie lub modyfikację danych statycznych (niezmiennych w trakcie działania programu) bez dodatkowej ingerencji w kod źródłowy aplikacji. W skład możliwej do modyfikacji zawartości aplikacji powinny wchodzić teksty wyświetlane w programie, język interfejsu graficznego oraz materiały dydaktyczne. 1.2.1.20 Rozbudowa kluczowych funkcjonalności aplikacji Środowisko powinno udostępniać możliwość poszerzania zbioru kluczowych funkcjonalności programu (takich jak algorytmy lub funkcje) z poziomu systemu operacyjnego, np. poprzez dodanie lub modyfikację odpowiednich plików. Celem tej funkcjonalności jest umożliwienie rozbudowy środowiska o kolejne przykłady. 1.2.1.21 Przenośność aplikacji między systemami operacyjnymi Jednym z kryteriów wyboru technologii, na których będzie bazować środowisko, powinna być przenośność kodu wykonawczego programu między systemami operacyjnymi. Wykorzystane technologie mogą wymagać osobnej instalacji i konfiguracji ich środowisk wykonawczych.

2 Część pierwsza Wybrane algorytmy sztucznej inteligencji 2.1 Wprowadzenie Podstawowymi zagadnieniami dla metod sztucznej inteligencji są: reprezentacja wiedzy o dziedzinie problemu, poszukiwanie rozwiązań w dziedzinie problemu. Zakres dydaktyczny opracowanego w ramach tej pracy środowiska do ćwiczeń został zawężony do tak zwanych symbolicznych metod sztucznej inteligencji. Specyfika tej kategorii metod polega na reprezentacji wiedzy o obiektach i związkach z dziedziny problemu w postaci struktur danych symbolicznych. W konsekwencji metody poszukiwania rozwiązań na poziomie implementacyjnym polegają na przetwarzaniu struktur symboli. Bardzo istotną z punktu widzenia użytkowego cechą podstawowych metod poszukiwania rozwiązań jest w pewnym uproszczeniu zastąpienie intuicji opartej na wiedzy z dziedziny problemu, jaką stosuje człowiek, masywnym przeszukiwaniem przestrzeni potencjalnych rozwiązań. Konsekwencją zastosowania takiego podejścia jest zasadniczy dla tych metod problem eksplozji kombinatorycznej.

2.2 Sztuczna inteligencja słaba i mocna Głównym problemem, z jakim napotyka się każda próba wdrożenia metod sztucznej inteligencji jest zapotrzebowanie na zasoby, które wraz ze złożonością dziedziny problemu podlegającego analizie, rosną do niebotycznych rozmiarów, a każda dodatkowa komplikacja dziedziny problemu może znacząco pogorszyć efektywność używanych algorytmów. Dlatego główną motywacją dla poszukiwania nowych metod i modyfikowania już znanych jest często przeciwdziałanie eksplozji kombinatorycznej, a w konsekwencji nadmiernej złożoności pamięciowej i czasochłonności. Przyjął się podział metod na słabe i mocne, przy czym pod tymi pojęciami kryje się dość ogólna klasyfikacja ze względu na efektywność algorytmu. W myśl zasady co jest od wszystkiego, to jest do niczego, jednym z czynników obniżających efektywność algorytmów jest ich uniwersalność. Zatem możliwym sposobem uzyskania metody o lepszej wydajności bywa często wyspecjalizowanie jej do konkretnej problematyki. Pojęcie mocnych metod sztucznej inteligencji obejmuje algorytmy ukierunkowane na konkretną dziedzinę problemu ich działanie raczej nie nadaje się do poszukiwania rozwiązania w dziedzinie spoza wejściowej tematyki. Owocem takiego podejścia są na przykład algorytmy oparte na metodzie celeśrodki, który znajdują zastosowanie przy planowaniu sekwencji akcji, gdzie koncepcja poszukiwania rozwiązania jest dostosowana do charakterystycznych dla planowania operacji. Natomiast pojęcie metod słabych obejmuje klasyczne ogólne metody przeszukiwania przestrzeni rozwiązań niezależne od dziedziny problemu. W konsekwencji przyjętych założeń wykreowała się również bardziej filozoficzna interpretacja niniejszego podziału, w której to punktem odniesienia stała się inteligencja w pierwotnym tego słowa znaczeniu. Pod pojęciem mocnych algorytmów sztucznej inteligencji, zaczęto rozumieć te metody, których działanie w większym stopniu było zbliżone do funkcjonowania ludzkiego mózgu, natomiast jako słaba sztuczna inteligencja była rozumiana koncepcja wyznaczania rozwiązania metodami ogólnie mówiąc siłowymi (brute force).

2.3 Przeszukiwanie Przestrzeni Stanów W obszarze słabych metod sztucznej inteligencji jednym z kluczowych zagadnień jest problematyka przeszukiwania przestrzeni stanów. Jako że otaczający nas świat rzeczywisty jest swego rodzaju zbiorem stanów, które pod wpływem zjawisk naturalnych, działania człowieka a także innych czynników ulega ciągłym zmianom, tak też sztuczna inteligencja często musi rozpatrywać swoją dziedzinę jako swoistą przestrzeń stanów, które również ulegają wpływowi zarówno czynników zewnętrznych, jak też na skutek akcji wykonywanych przez agenta wyposażonego w tę sztuczną inteligencję. Zadaną przestrzeń stanów wyznaczają fakty, stany, możliwości operacji na stanach oraz opisy sytuacji. Relacja następnika, występująca między stanami, określa w przestrzeni stanów strukturę typu graf. W grafie tym węzłami są poszczególne stany, a krawędzie reprezentują poszczególne pary należące do relacji następnika. Jako że przejście między stanami wymaga wykonania pewnej akcji, krawędź może mieć przypisany pewien koszt. Idea przeszukiwania przestrzeni stanów polega na znalezieniu drogi między wskazanym stanem początkowym a stanem, w którym będą spełnione zadane cele. W ten sposób wyznaczone zostają operacje, jakie należy przedsięwziąć, by z danej sytuacji wejściowej osiągnąć cele. Jako że algorytm bierze swój początek w pojedynczym stanie, a przeszukiwanie opiera się na jego potomkach, w efekcie rozpatrzone stany można powiązać w drzewo o korzeniu znajdującym się w stanie startowym. Opracowano różne strategie przeszukiwania przestrzeni stanów, których efektywność ocenia się przede wszystkim według następujących kryteriów: zupełność czy dany algorytm gwarantuje znalezienie rozwiązania, o ile ono istnieje, złożoność czasowa jak czas wykonania algorytmu zależy od rozmiaru przeszukiwanej przestrzeni stanów, złożoność pamięciowa jak duża przestrzeń pamięci potrzebna jest do wyznaczenia rozwiązania, tzn. jak wiele węzłów algorytm musi magazynować w trakcie swojego działania, optymalność czy pierwsze wyznaczone rozwiązanie jest najlepsze z możliwych np. pod kątem kosztu osiągnięcia celu. Złożoności czasową i pamięciową można zdefiniować za pomocą następujących parametrów: b maksymalne rozgałęzienie drzewa przeszukiwania przestrzeni stanów, d głębokość rozwiązania o najmniejszym koszcie, m maksymalna głębokość/wysokość drzewa. Główną klasyfikacją strategii przeszukiwania przestrzeni stanów jest podział na algorytmy niepoinformowane ( ślepe ) oraz poinformowane (heurystyczne).

2.4 Algorytmy niepoinformowane ( ślepe ) Tytułowe niepoinformowanie polega na tym, że algorytmy te nie dysponują żadną wiedzą, która w osiągniętym w danym kroku stanie pozwalałaby przewidzieć, która z możliwych ścieżek wychodzących z tego stanu doprowadzi do optymalnego rozwiązania. W związku z tym algorytmy niepoinformowane nie posiadają żadnych wskazówek skracających czas wykonania zadania. 2.4.1 Algorytm Przeszukiwania W głąb ( Depth-First ) Algorytm przeszukiwania w głąb realizuje dość prostą koncepcję przeszukiwania przestrzeni stanów. Próba odnalezienia rozwiązania polega na stopniowym schodzeniu w dół drzewa poszukiwań, rozpatrując na każdym etapie drzewa pojedynczy węzeł. W razie braku możliwości przedłużenia ścieżki z danego węzła (brak następników), bądź w przypadku osiągnięcia zadanej maksymalnej głębokości, algorytm wykonuje nawrót do wcześniejszego węzła, kontynuując swoje działanie z tego poziomu dla kolejnego następnika tego węzła. Rysunek 1 - Kolejność ekspansji drzewa poszukiwań dla algorytmu depth-first Przeszukiwanie w głąb nie gwarantuje odnalezienia optymalnego rozwiązania. Strategia ta staje się dość efektywna w momencie, gdy w przestrzeni stanów rozwiązania są gęsto rozlokowane, a sama przestrzeń jest ograniczona. Algorytm nie nadaje się do przeszukiwania nieskończonych przestrzeni stanów, ponieważ gdy na budowanej ścieżce nie ma rozwiązania, algorytm nie zakończy swojego działania. W takich sytuacjach dobrą praktyką jest nadanie ograniczenia na maksymalną głębokość poszukiwań, jednakże ryzykuje się przy tym, że rozwiązanie nie zostanie znalezione. 2.4.2 Algorytm Przeszukiwania Wszerz ( Breadth-First ) Algorytm przeszukiwania wszerz jest jedną z najprostszych metod przeszukiwania przestrzeni stanów. Strategia ta umożliwia odnalezienie najkrótszej drogi ze stanu startowego do stanu docelowego pod względem ilości stanów pośrednich, jednak odbywa się to kosztem złożoności obliczeniowej i pamięciowej. Dodatkową wadą algorytmu jest to, że w przypadku, gdy przejścia między stanami charakteryzują się różnymi kosztami, wyznaczona ścieżka wcale nie musi oznaczać najtańszej. W pierwszym kroku graf, składający się tylko ze stanu początkowego jest poszerzany o wszystkie stany będące jego następnikami, tworząc w ten sposób pierwszy poziom. W następnym kroku wszystkie stany z pierwszego poziomu są sprawdzane pod kątem warunków zakończenia algorytmu, innymi słowy czy wśród nich znajduje się stan docelowy. Jeśli żaden ze stanów na tym poziomie nie

spełnia wymogów, algorytm tworzy kolejny poziom, składający się z następników wszystkich stanów z poprzedniego poziomu. Procedura ta jest powtarzana dla każdego nowopowstałego stopnia (d) grafu, dopóki algorytm nie natrafi na stan spełniający wymogi zakończenia algorytmu, przy czym każdy kolejny stopień (d+1) składa się z następników wszystkich węzłów poprzedniego poziomu (d). Rysunek 2 - Kolejność ekspansji drzewa poszukiwań dla algorytmu breadth-first 2.4.3 Algorytm Błądzenia Losowego ( Random-Walk ) Algorytm błądzenia losowego działa w myśl zasady: spróbujmy szczęścia, by szybciej osiągnąć cel. Cechą charakterystyczną tej metody jest losowy wybór stanu do sprawdzenia w danym kroku działania, przy czym decyzja podejmowana jest nad zbiorem następników dotychczas sprawdzonych stanów. Zastosowanie losowości w algorytmie wprowadza niezerową szansę na wyznaczenie optymalnego rozwiązania w stosunkowo krótkim czasie, jednakże w ten sposób istnieje pewne prawdopodobieństwo, że otrzymane rozwiązanie nie będzie optymalne. Podobnie jak w poprzednich algorytmach ekspansja drzewa poszukiwań przebiega w oparciu o następniki sprawdzanego stanu. W przypadku metody błądzenia losowego do weryfikacji i ewentualnej rozbudowy zostaje wybrany losowo jeden węzeł będący liściem aktualnego drzewa poszukiwań.

2.5 Algorytmy poinformowane Opisane dotychczas metody przeszukiwania przestrzeni stanów dla dużych przestrzeni są mało efektywne. Lepsze wyniki można osiągnąć w poinformowanych algorytmach przeszukiwania przestrzeni stanów, których koncepcja jest oparta na przypisaniu węzłom drzewa poszukiwań wartości oceniającej szacowaną jakość rozwiązania. W ten sposób w trakcie przeszukiwania przestrzeni stanów, do każdego węzła jest dołączona podpowiedź dla algorytmu. 2.5.1 Algorytm Best-First Algorytm best-first można określić jako rozszerzenie metody breadth-first (przeszukiwania wszerz). Obie metody przetwarzają zbiór węzłów kandydujących do rozbudowy drzewa. Podstawową cechą algorytmu best-first, która odróżnia go od przeszukiwania wszerz, jest to, że kolejność rozpatrywania stanów ze zbioru kandydatów, jak też ich ekspansji uwarunkowane są przez funkcję oceny stanu, zwaną inaczej heurystyką. W prostej wersji tej metody funkcja oceny stanu może być oparta na przewidywanym dalszym koszcie rozwiązania. W przypadku breadth-first każdy stan z listy kandydatów jest kolejno rozpatrywany i ekspandowany, przez co rozpatrywane są stany o dotychczasowej najkrótszej ścieżce pod względem ilości stanów pośrednich. W przypadku algorytmu best-first uzyskane rozwiązanie może być optymalne tylko przy zastosowaniu odpowiedniej heurystyki: jeśli funkcja oceny została źle dobrana, rozwiązanie może okazać się dalekie od perfekcji. Tym samym w każdym kolejnym kroku, drzewo poszukiwań jest rozbudowywane od najbardziej obiecującego w danym momencie węzła z listy kandydatów tzn. realizuje się podejście najpierw najlepszy ( best-first ). 2.5.2 Algorytm A* Algorytm A* stanowi specyficzną, a zarazem bardzo praktyczną, wersję metody best-first. Podstawową jego cechą jest to, że funkcja oceny jest oparta nie tylko na koszcie dotychczasowej ścieżki, lecz również na przewidywanym dalszym koszcie osiągnięcia celu. W algorytmie A* to właśnie ten sumaryczny koszt jest wyznacznikiem, który kolejny stan ma zostać rozpatrzony. Wartość przewidywanego całkowitego kosztu dla stanu X wynosi więc: 2.5.2.1.1.1.1.1 F(X) = G(X) + H(X) F(X) przewidywana wartość całkowitego kosztu odnalezienia stanu docelowego, w momencie rozpatrywania stanu X G(X) koszt, jaki został poniesiony, by ze stanu początkowego znaleźć się w stanie X H(X) wartość heurystyki, czyli szacowanego dalszego kosztu, dla stanu X Jednym z zastosowań algorytmu A* jest problem komiwojażera. W tym przypadku, miasta reprezentowane są jako stany algorytmu, zaś kosztami przejść między stanami są odległości między poszczególnymi miastami. Wtedy najczęściej stosowaną heurystyką jest funkcja wyznaczająca najbliższą fizyczną odległość między miastem, w którym podróżnik znajduje się w danym momencie, a docelową miejscowością. W podobny sposób intuicyjnie człowiek wybiera sobie drogę do celu na mapie poprzez rozpatrywanie kolejnych punktów będących coraz bliżej celu. 2.5.3 Algorytm Wspinaczkowy ( Hill-Climbing ) Zadaniem algorytmu wspinaczkowego jest wyznaczenie ścieżki ze stanu początkowego do docelowego poprzez badanie kolejnych najbardziej obiecujących sąsiadów. Algorytm hill-climbing stanowi tym samym poinformowaną wersję metody błądzenia losowego. Należy zaznaczyć, że

algorytm nie wykonuje nawrotów w razie niepowodzenia, lecz wyznacza najbliższe lokalne maksimum funkcji oceny, które określa jak bardzo dany stan jest obiecujący. W ten sposób algorytm nie gwarantuje uzyskania optymalnej ścieżki, ani nawet wyznaczenia rozwiązania, nawet jeśli ono istnieje, jednakże odpowiednio dobrana heurystyka może znacząco poprawić efektywność metody poprzez dokładniejsze naprowadzenie działania algorytmu w kierunku zadanego celu. h(x) Wyznaczone rozwiązanie Właściwe rozwiązanie Xn+1 = s(xn) X1 X2 X3 X4 X5 X6 X7 X Rysunek 3 - Problem lokalnych maksimów dla algorytmu wspinaczkowego s(x) następnik stanu X; H(X) wartość heurystyki dla stanu X

2.6 Planowanie sekwencji akcji Jedną z dziedzin sztucznej inteligencji jest planowanie sekwencji akcji. Planowanie samo w sobie polega na wyznaczeniu uporządkowanej sekwencji czynności, których wykonanie pozwoli osiągnąć zadane cele, wyznaczając ewentualne cele pośrednie, których realizacja jest niezbędna do pozytywnego wykonania algorytmu. Podstawowym problemem planowania jest złożoność obliczeniowa, spowodowana obszernym zbiorem akcji, które mogą zostać wykonane w danym stanie. Pozornie proste zadanie, jak np. ustawienie kilku klocków w odpowiednich miejscach może dostarczać tysięcy sytuacji do rozpatrzenia, chociaż w rzeczywistości na skutek lat doświadczenia, ludzki mózg jest w stanie sobie poradzić z takim problemem bez większych przeszkód. W celu zawężenia przestrzeni poszukiwań niezbędne było stworzenie odpowiednich algorytmów, których dziedzina nie będzie opierać się wyłącznie na rozpatrywaniu kolejnych stanów. W celu wyraźniejszego przedstawienia zagadnienia planowania sekwencji akcji, będzie ono w tej pracy oparte o problematykę świata klocków, którego dziedziną są nieruchome podstawy, na których stoją klocki, które również mogą być postawione na sobie nawzajem, zaś akcje są reprezentowane, jako przeniesienia pojedynczych klocków z jednego miejsca na drugie. Zadanie w takiej sytuacji polega na ustaleniu kolejności konkretnych ruchów, które należy wykonać, aby począwszy od zadanego stanu startowego poprzestawiać klocki do takiego stanu, w którym zadany zbiór celów jest spełniony, tzn. każdy pojedynczy cel został osiągnięty. Każdy stan świata klocków można opisać za pomocą dwóch predykatów: Clear(x) oznacza, że na obiekcie x nic nie stoi, x może być w tym przypadku zarówno klockiem jak i miejscem na podłożu, On(x, y) oznacza, że klocek x znajduje się na obiekcie y, którym może być zarówno inny klocek jak i podłoże Natomiast każdą akcję można opisać odwołując się do predykatu Move (akcja określa przeniesienie pojedynczego klocka): przenieś klocek x z miejsca y na miejsce z Aby akcja mogła zostać wykonana, muszą być spełnione następujące warunki: Innymi słowy aby móc przenieść klocek x z miejsca y na pozycję z, musi on w danym stanie znajdować się na miejscu y oraz nic innego nie może na nim stać, podczas gdy miejsce docelowe z musi być puste. Wszystkie obiekty x, y oraz z muszą być od siebie różne. Jako że po przeniesieniu klocka, nie tylko miejsce docelowe staje się zapełnione, ale także zwolni się pozycja, na której przedmiot uprzednio się znajdował, po wykonaniu akcji Move(x, y, z) w konkretnym stanie świata klocków, przestanie on być opisywany przez fakty On(x, y) oraz Clear(z), a do jego opisu zostaną dodane jeszcze dwa nowe fakty: On(x, z) oraz Clear(y). Clear(X) dalej pozostanie częścią definiującą nowy stan. Dla każdego klocka, na którym nic nie stoi, można wykonać tyle akcji, ile jest miejsc, na które można go postawić (czyli liczba podstaw minus jeden, jako że ten klocek w danym stanie już na czymś stoi).

Zatem w świecie składającym się z n klocków i m podstaw liczba następników dla jednego stanu może mieć wartość z przedziału. Przedział ten bierze się z dwóch skrajnych sytuacji: pierwsza w danym stanie można przenieść tylko jeden klocek (wszystkie stoją w jednej kolumnie), druga każdy klocek może zostać przemieszczony (, wszystkie klocki stoją na podstawkach). Ogólną łączną liczbę możliwych stanów (zakładając, że sytuacja początkowa umożliwia osiągnięcie wszystkich możliwych kombinacji) można opisać wzorem: W ten sposób gołym okiem widać, że wraz ze wzrostem wartości n i m przestrzeń stanów rozrasta się do niebotycznych rozmiarów. Można zatem twierdzić, że główną przeszkodą, z jaką spotyka się problematyka planowania jest rozmiar przestrzeni poszukiwań.

2.6.1 Zastosowanie algorytmów przeszukiwania przestrzeni stanów Jako że planowanie polega również na ustaleniu uporządkowanej listy stanów pośrednich między stanem początkowym a końcowym, czyli de facto jest zagadnieniem z dziedziny przeszukiwania przestrzeni stanów, można pokusić się o stawienia czoła temu problemowi stosując dotychczas poznane, klasyczne algorytmy przeszukiwania przestrzeni stanów. Planowanie sekwencji akcji wymaga ustalenia sposobu wyznaczania następników konkretnego stanu, co jest nieodłączną cechą przeszukiwania przestrzeni stanów. Aby pozyskać zbiór stanów następujących po jednym konkretnym stanie, należy wyznaczyć wszystkie możliwe akcje, które mogą zostać w nim wykonane. 4. Przykładowe następniki dla stanu składającego się z trzech miejsc na podłożu oraz trzech klocków Jednym z zabezpieczeń przed eksplozją kombinatoryczną i/lub złożonością pamięciową jest wykorzystanie odpowiedniej heurystyki dla algorytmów poinformowanych. Jednak nie posiadając odpowiedniej funkcji oceny - przy czym wyznaczenie uniwersalnej heurystyki nie jest prostym zadaniem - zastosowanie klasycznych algorytmów przeszukiwania przestrzeni stanów jest nieopłacalne dla świata klocków większych rozmiarów.

2.6.2 Algorytm Means-Ends ( Cele-Środki ) Próbą zawężenia przestrzeni poszukiwań jest algorytm means-ends. Metoda Cele-Środki działa w nieco inny sposób, niż dotychczas przedstawione algorytmy, które poszukiwania rozpoczynają w zadanym stanie początkowym a wyznaczając kolejne akcje usiłują dotrzeć do celu. W tym przypadku algorytm rozpoczyna działanie od zadanego zbioru celów. Obserwując, jak człowiek próbuje zaplanować swoje czynności, by osiągnąć jakiś wyznaczony przez siebie cel, zapewne stwierdzimy, że w większości przypadków podejmowane decyzje w pierwszej kolejności bazowały na planach znajdujących się bliżej celu. Zatem algorytm means-ends, jako metoda koncentrująca się na celach i dobierająca do nich stan, z którego te cele są łatwo osiągalne, wydaje się być bardziej intuicyjna niż dotychczas poznane metody biorące początek w stanie inicjalnym. Jako że cel jest osiągany w wyniku pewnych akcji wykonanych nad jakimś stanem, algorytm w każdym kroku swojego działania usiłuje wyznaczyć pojedynczą akcję realizującą cel. Niekiedy może się również zdarzyć, że jedna akcja może zrealizować kilka celów. Jednakże żeby jakaś operacja mogła zostać wykonana, zawsze muszą zostać spełnione określone warunki, więc po wyznaczeniu akcji realizującej cel, pierwotny zbiór celów do zrealizowania zostaje zastąpiony przez nowe cele. Ze zbioru celów jednocześnie ubywają te, które są realizowane przez daną akcję. O ile ciągłe modyfikacje zbioru celów mogą wydawać się zniechęcające, to przy przeanalizowaniu określonej liczby akcji wstecz, powinno dojść do sytuacji, w której wszystkie aktualne cele zostały spełnione w stanie początkowym. Algorytm w ten sposób kontynuuje działanie dla pozostałych niespełnionych celów ze zbioru, wyznaczając nowe akcje a w konsekwencji też warunki przeprowadzenia tych czynności. Algorytm kończy działanie w momencie, gdy wszystkie wyznaczone cele są spełnione w zadanym stanie wejściowym rozwiązaniem jest uporządkowana lista wyznaczonych dotąd akcji.

- kierunek modyfikacji zbioru celów - wyznaczona sekwencja akcji Y Z Y Z E - element składowy aktualnego stanu A Z A - cel wybrany do realizacji - cel jeszcze nie rozpatrzony X X Z E - wyznaczenie nowych celów B C A B E A Z C Z B C A B E A D C D Wyznaczone cele są spełnione w zadanym stanie wejściowym Rysunek 5 - Przykładowa wizualizacja koncepcji cele-środki

3 Część druga Środowisko dydaktyczne 3.1 Przegląd funkcjonalności środowiska Uruchamianie algorytmów Program udostępnia możliwość uruchomienia algorytmu z parametrami wskazanymi przez użytkownika. W gestii osoby korzystającej z programu pozostaje wskazanie algorytmu, który ma zostać wykonany, dziedziny problemu/ przestrzeni stanów, parametrów wejściowych (stanu początkowego i celu) oraz ewentualnie heurystyki, która jest wymagana tylko w przypadku algorytmów poinformowanych. Po uruchomieniu algorytmu przebieg jest demonstrowany w postaci drzewa poszukiwań. Wybór algorytmu warunkuje możliwości wyboru dziedziny problemu (np. algorytm cele-środki może zostać uruchomiony tylko dla świata klocków), a ta z kolei uzależnia od siebie dostępne zadania i heurystyki zależności te zostały uwzględnione poprzez zastosowanie filtrów wyboru. Śledzenie przebiegu algorytmów Aplikacja umożliwia uruchomienie algorytmu z funkcją oczekiwania na reakcję użytkownika. Algorytm przebiega zgodnie ze swoją strategią, jednak po każdym kroku, następuje wizualizacja dotychczasowego przejścia, a także, o ile nie zostało właśnie wyznaczone rozwiązanie, wykonanie algorytmu przechodzi w stan oczekiwania, przy czym zostaje podany czas, w jakim dany krok został wykonany. Wizualizacja działania algorytmu aktualizowana jest na bieżąco wraz z przebiegiem algorytmu. Generowanie drzewa poszukiwań dla przebiegu algorytmu Aplikacja umożliwia demonstrację przebiegu algorytmu w postaci drzewa poszukiwań. Drzewo jest kreślone za pomocą węzłów koloru żółtego oznaczających stany sprawdzone oraz krawędzi ponumerowanych zgodnie z kolejnością ekspansji drzewa. Zawartość każdego węzła można podejrzeć przez wskazanie na niego myszką - ukazują się wtedy wartości parametrów danego stanu. Oprócz samej wizualizacji drzewa interfejs graficzny przedstawia również jego parametry: szerokość, wysokość oraz ilość węzłów. Rozwiązanie algorytmu (o ile zostało wyznaczone) zostaje naniesione na rysunek drzewa przez zaznaczenie kolorem zielonym węzłów wchodzących w skład rozwiązania. Ze względu na niską czytelność w przypadku, gdy na skutek działania algorytmu zostało wygenerowane drzewo poszukiwań dużych rozmiarów (szerokość lub wysokość są większe od 70), wizualizowana jest tylko ścieżka prowadzącą do rozwiązania. Oznacza to, że drzewo składa się wyłącznie z węzłów uprzednio zaznaczonych kolorem zielonym, ale krawędzie zachowują swoje etykiety zawierające numer w kolejności wyznaczenia stanu, do którego prowadzą. Podobna sytuacja ma miejsce dla algorytmów typu means-ends, dla których drzewo poszukiwań sprowadza się jedynie do nakreślenia samego rozwiązania, które jest sekwencją stanów otrzymanej przez wykonanie wybranej sekwencji akcji na stanie początkowym.

Generowanie drzewa celów dla algorytmów typu means-ends Przebieg algorytmu means-ends jest napędzany kolejnymi zbiorami celów na wejściu kolejnych kroków algorytmu. Z tego powodu wizualizacja przebiegu algorytmów typu means-ends opiera się na demonstracji drzewa celów. Drzewo celów przedstawione jest podobnie jak drzewo poszukiwań, z tą różnicą, że węzły nie reprezentują poszczególnych stanów, lecz zbiory celów na wejściu kolejnych rekurencyjnych kroków algorytmu. Cele powiązane z węzłem można podejrzeć wskazując dany węzeł kursorem myszy - ukazuje się wtedy lista celów lub też w przypadku implementacji algorytmu means-ends z nieukonkretnionymi celami tabela zawierająca listę celów oraz listę warunków odpowiadających każdemu celowi. W przypadku drzewa celów kolor zielony nie symbolizuje wyłącznie rozwiązania, lecz również sytuację, gdy cele w danym kroku algorytmu zostają spełnione w stanie wejściowym. Właściwość ta jest szczególnie użyteczna w przypadku śledzenia przebiegu algorytmu krok po kroku. Krawędzie drzewa celów nie są ponumerowane. Kolejność rozbudowy jest w przybliżeniu podobna jak w przypadku rozbudowy drzewa poszukiwań dla strategii przeszukiwania wszerz. Dlatego też krawędzie drzewa celów są oznaczone jedynie za pomocą etykiet sugerujących etap planowania (przydatne w momencie rozróżnienia na wyznaczanie pre-planu i post-planu). Definiowanie przestrzeni stanów W ramach ćwiczeń i prób własnych użytkownikowi została udostępniona możliwość utworzenia własnej przestrzeni stanów. Przestrzeń stanów tworzona jest na podstawie dwóch modułów: definicji stanu składającej się z nazwanych parametrów o określonych typach (słowo, liczba, lista) oraz listy następników. Następnik definiuje się podając: warunki, które definiują relację następnika, wartości atrybutów następnego (przypisane odpowiednim parametrom określonym wcześniej w definicji) oraz koszt przejścia między stanami. Wartości atrybutów, składniki warunków oraz koszt nie muszą być wartościami stałymi. Mogą one być przedstawione jako wyrażenia zależne od wartości atrybutów stanu początkowego, końcowego, aktualnego, wyników funkcji itp. Definiowanie zadań na wejściu algorytmów Użytkownik może uruchamiać algorytmy dla problemów, zdefiniowanych już w aplikacji, a także ma możliwość utworzenia własnych danych wejściowych stanowiących zadanie, dla którego mógłby zostać uruchomiony algorytm. Utworzenie zadania wymaga podania stanu początkowego i stanu końcowego lub celów, które mają być w stanie końcowym spełnione. Każdy z tych stanów wymaga zdefiniowania wartości jego parametrów. Podobnie jak w przypadku tworzenia przestrzeni stanów, parametry nie muszą być wyłącznie stałymi, lecz mogą być zdefiniowane za pomocą bardziej złożonych wyrażeń. Definiowanie heurystyki Dla algorytmów poinformowanych użytkownik może zdefiniować heurystykę. Heurystyczna funkcja wspomagająca wybór kolejnego kroku algorytmu jest definiowana dla wskazanej przestrzeni stanów. Zarówno warunki, jak i funkcja heurystyczna mogą mieć postać dość złożonych wyrażeń.

Gramatyka wyrażeń Wyrażenia definiujące parametry przestrzeni stanów oraz funkcje heurystyczne będą w efekcie końcowym zapisane w postaci kodu źródłowego języka Prolog, gdyż umożliwia to dokompilowanie ich bez konieczności ponownego uruchomienia programu. Jednakże ze względu na nieintuicyjne dla przewidywanego użytkownika sposób wprowadzania wyrażeń do programu prologowego, użytkownik ma do dyspozycji gramatykę, która przypomina powszechnie znaną formę zapisu wyrażeń. Graficzna reprezentacja puzzli 3x3 Jednym z najczęściej wykorzystywanych przykładów do ilustracji przeszukiwania przestrzeni stanów, jest problem puzzli 3x3. Specjalnie dla tego problemu opracowano odpowiednią wizualizację graficzną. Dlatego też, jeśli dla puzzli został uruchomiany algorytm, to w wygenerowanym drzewie poszukiwań podgląd węzłów będzie skutkował ukazaniem się grafiki reprezentującej stan reprezentowany przez ten węzeł. Dodatkowo, jeśli dla tej przestrzeni stanów zostało wyznaczone rozwiązanie algorytmu, istnieje możliwość obejrzenia prostej animacji, ukazującej zmianę położeń elementów puzzli na planszy zgodnie z wyznaczoną kolejnością. Wsparcie dla tworzenia zadań dla puzzli 3x3 Ze względu na dość skomplikowany format reprezentacji pojedynczego stanu puzzli 3x3, użytkownikowi został udostępniony interfejs do manualnego definiowania pary stan początkowy/docelowy, stanowiącej zadanie na wejściu algorytmów przeszukiwania przestrzeni stanów. Użytkownik zamiast definiować współrzędne każdego klocka za pomocą liczb, może sformułować zadanie przez rozmieszczenie elementów puzzli w dowolnych polach planszy. Graficzna reprezentacja świata klocków Problematyka planowania sekwencji akcji najczęściej jest ilustrowana na przykładzie świata klocków. Dlatego też aplikacja została wyposażona w możliwość graficznego podglądu stanów takiego przykładowego świata. Wizualizacja polega na interpretacji predykatów opisujących świat klocków i na jej podstawie ułożenia obiektów graficznych w odpowiedniej formie i porządku, aby użytkownikowi została unaoczniona aktualna sytuacja zawarta w danym stanie. Podobnie jak w przypadku puzzli 3x3 graficzna wizualizacja świata klocków znajduje zastosowanie zarówno przy podglądzie drzewa poszukiwań, jak też przy prostej animacji demonstrującej rozwiązanie znalezione przez planer. Wsparcie dla tworzenia zadań dla planera Dla problematyki planowania sekwencji akcji, w której głównym przykładem jest tzw. świat klocków, powinna zostać zapewniona możliwość prostego definiowania stanów. Ponieważ każdy stan w tej dziedzinie problemu jest zdefiniowany w języku rachunku predykatów, stan początkowy i cele powinny być również zapisane w tym języku, przy czym wpisywany tekst podlega weryfikacji, pod kątem poprawności semantycznej. Ponadto definiowanie stanu początkowego jest wspomagane wizualizacją graficzną. Reprezentacja graficzna stanu początkowego jest uaktualniana na bieżąco w trakcie wpisywania listy predykatów opisujących zadany świat. Generowanie spójnego grafu losowego Demonstracje działania algorytmów powinny przebiegać na różnych przykładach grafu, aby niepotrzebnie nie ograniczać możliwej różnorodności przykładów. W tym celu aplikacja została wyposażona w możliwość wygenerowania grafu losowego, przy czym użytkownik ma możliwość

ustawienia parametrów określających liczbę węzłów grafu oraz zagęszczenie krawędzi (wartość parametru określającego prawdopodobieństwo istnienia krawędzi między dwoma wierzchołkami). Kluczowa jest spójność wygenerowanego grafu, dzięki czemu wyznaczenie ścieżki między dowolnymi jego węzłami jest zawsze możliwe. Wizualizacja grafu i operacje na nim Po wygenerowaniu grafu możliwe jest wyświetlenie go na ekranie w postaci zbioru punktów połączonych odcinkami. W każdym momencie istnieje możliwość zaznaczenia dwóch dowolnych węzłów, w celu wyznaczenia ścieżki między nimi. Po dokonaniu wyboru, użytkownikowi przestawiona zostaje lista dostępnych algorytmów, które można zastosować do zaznaczonego przypadku. Wyznaczona ścieżka zostaje naniesiona na graf poprzez wyróżnienie odpowiednich krawędzi grafu kolorem czerwonym. W przypadku, gdy wybrany do znalezienia ścieżki algorytm należy do klasy poinformowanych, zostaje mu przypisana domyślna dla grafu heurystyka, która jest funkcją fizycznej odległości między aktualnym węzłem, a docelowym. Po zaznaczeniu dwóch węzłów istnieje możliwość uruchomienia algorytmu dla nich w klasycznej formie, z budową drzewa poszukiwań. Wizualizacja materiałów dydaktycznych Program udostępnia przeglądanie materiałów dydaktycznych z poziomu aplikacji. Wizualizacja ćwiczeń może zawierać w sobie zarówno tekst o różnych czcionkach, jak i obrazu. W razie zmiany ekranu w aplikacji istnieje możliwość ponownego przełączenia panelu do ćwiczeń w miejsce, w którym ostatnio zostało zakończone czytanie.

3.2 Ćwiczenia Głównym celem pracy jest dostarczenie środowiska dydaktycznego do ćwiczeń z zakresu podstawowych metod sztucznej inteligencji. Zatem takie ćwiczenia stanowią nieodłączną część aplikacji. Dlatego też oprócz implementacji samego programu przygotowanie środowiska wymagało opracowania zestawu instrukcji i objaśnień stanowiących materiały wprowadzające do dziedziny sztucznej inteligencji. Ćwiczenia mają za zadanie umożliwić użytkownikowi zapoznanie się z podstawowymi algorytmami sztucznej inteligencji oraz zrozumienie koncepcji ich działania. W celu zapewnienia efektywności wykonywanych ćwiczeń, pojęcia i przykłady muszą zostać przedstawione w odpowiednim porządku. Dlatego też zadania zostały przygotowane w kolejności uwzględniającej stopień trudności poruszanej tematyki, a także uwzględniając zależności między ćwiczeniami. Pierwszą poruszoną problematyką jest zagadnienie przestrzeni stanów. Jako że jest to podstawowe pojęcie w dziedzinie sztucznej inteligencji, będzie ono często przewijać się w ramach kolejnych tematów. Dlatego też zanim użytkownik przejdzie do problemów konkretnych algorytmów i ich implementacji, powinien poznać, co kryje się pod pojęciem przestrzeni stanów, jakie są jej właściwości, a także koncepcję jej przeszukiwania. Po poznaniu pojęcia przestrzeni stanów, użytkownik może zacząć zapoznawać się z podstawowymi algorytmami sztucznej inteligencji, których działanie uzależnione jest bezpośrednio od operacji na zadanej przestrzeni stanów. Dlatego też odpowiednią tematyką dla następnego kroku wydaje się być zagadnienie niepoinformowanych algorytmów przeszukiwania przestrzeni stanów, które de facto są pojęciowo najprostszą metodą rozwiązywania typowych problemów z zakresu sztucznej inteligencji i stanowią zazwyczaj wprowadzenie do algorytmów SI w większości publikacji z tej tematyki. Uzbrojony w wiedzę na temat niepoinformowanych algorytmów przeszukiwania przestrzeni stanów, użytkownik może rozpocząć wdrażanie się w tematykę metod heurystycznych. Algorytmy poinformowane stanowią swego rodzaju rozszerzenie algorytmów ślepych, dlatego też w tym przypadku kolejność powinna wydawać się oczywista, gdyż nawet przy opisie konkretnych metod heurystycznych, zostają one porównane z odpowiednikami w dziedzinie algorytmów niepoinformowanych jako ich ulepszenia. Po zapoznaniu się z algorytmami przeszukiwania przestrzeni stanów, można wejść w tematykę nieco bardziej złożoną, a mianowicie planowania sekwencji akcji. Jako że problematyka ta może stanowić obszar zastosowania dla poznanych dotychczas algorytmów przeszukiwania przestrzeni stanów, a zarazem dla innych metod, w których koncepcja wyznaczania rozwiązania jest diametralnie inna, wprowadzenie do tej tematyki stanowi odpowiednią kontynuację dla ćwiczeń dotychczas przerobionych. Mając to na względzie, odpowiednie ćwiczenie służy przede wszystkim do przedstawienia różnic między algorytmami przeszukiwania przestrzeni stanów oraz algorytmami opartymi na koncepcji cele-środki, która charakteryzuje się odmiennym podejściem do wyznaczania sekwencji akcji. Po wykonaniu pierwszych czterech ćwiczeń użytkownik powinien być już w pewnym stopniu zaznajomiony z algorytmami sztucznej inteligencji, których poznanie jest jedną z funkcjonalności dostarczanych przez aplikację, przy czym powinien mieć opanowane teoretyczne podstawy poznanych metod. W tym momencie można się pokusić o wprowadzenie osoby korzystającej z programu na bardziej szczegółowy poziom tych poznanych dotąd algorytmów. Dlatego też kolejne