# Sztuczna inteligencja 2019 - Vowpal Wabbit **Czas trwania opisywanych prac:** 22.05.2019 - 13.06.2019 **Osoby odpowiedzialne za implementajcę:** Anna Nowak, Magdalena Wilczyńska **Implementowana technika:** Vowpal Wabbit **Link do repozytorium projektu:** https://git.wmi.amu.edu.pl/s440556/SZI2019SmieciarzWmi ## Techniki uczenia - Vowpal Wabbit #### Implementacja Cała implementacja dla VW znajduje się na osobnym branchu /VowpalWabbit ##### Środowisko i łączenie z Python3 W związku z informacjami o błędach w implementacji wrappera VowpalWabbit dla Python3, został zaimplementowany własny wrapper umożliwiający komunikację między aplikacją a VW. Dodana została możliwość wywoływania skryptów shellowych (w języku bash) bezpośrednio ze środowiska Python3, dzięki czemu mogłyśmy uzyskać płynną komunikację. Aby móc dostarczać poprawne dane wejściowe zarówno w trakcie procesu uczenia się jak i podczas szukania rozwiązania problemu, musiałyśmy dodać kilka modyfikacji do istniejących algorytmów. Domki oraz wysypiska dostają teraz dodatkowe oznaczenie jeśli zostały już odwiedzone. Dodatkowo, podczas szukania rozwiązania istniejącymi algorytmami planowania ruchu, oprócz listy koordynatów agenta zwracamy listę komend, które wykonuje. ##### Komunikacja agent - VW Dodałyśmy wiele funkcji obsługujących łącznośc między agentem oraz samą aplikacją a VW: 1. Parsery - mapują komendy oraz obiekty na liczby. 2. Generatory danych wejściowych: - Generator danych do uczenia się - konwertuje listy ruchów, koordynatów i otoczenia na wiersze w formacie VW, po czym zapisuje je do pliku. - Generator danych rzeczywistych - konwertuje listę obiektów w otoczeniu agenta o promieniu R = 1 na wiersz w formacie VW i zapisuje ją do pliku przeznaczonego do tymczasowego przechowywania danych. 3. Funkcja odczytująca obiekty w otoczeniu agenta o promieniu R = 1. Funkcja ta oblicza współrzędne lewego górnego rogu pola widzenia agenta w celu poprawnego zapisania obiektów w otoczeniu. Funkcja pomija współrzędne agenta oraz współrzędne będące poza siatką mapy. 4. Funkcja odczytująca wynik przewidywań VW. Funkcja ta odczytuje liczbę rzeczywistą zwrócona przez VW i mapuje ją do jednej z możliwych do wykonania przez agenta komend. Przewidywanie VW otrzymujemy przy użyciu komendy vw -i ./VowpalWabbit/VowpalModels/100k_input.model -t ./VowpalWabbit/VowpalDataCahce/constant_input.txt -p ./vowpalWabbit/VowpalDataCahce/constant_output.txt ##### Format danych Przedstawione poniżej tabele pokazują mapowania użyte podczas procesu generwania danych. **Mapowanie obiektów na mapie** | Obiekt | Cyfra | | --- | --- | | E: empty | 0 | | R: road | 1 | | H: house | 2 | | V: visited house | 0 | | Y: yellow dump | 2 | | B: blue dump | 2 | | G: green dump | 2 | **Mapowanie komend** | Komenda | Cyfra | Waga przykładu | | --- | --- | --- | | pick_garbage | 1 | 5.0 | | right | 2 | 1.0 | | left | 3 | 1.0 | | up | 4 | 1.0 | | down | 5 | 1.0 | Jeżeli w polu widzenia agenta znajduje się nieodwiedzony domek, a nie ma on aktualnie do niego dostępu, to następny ruch jest wykonywany z wagą 3.0. Wyjściowa linijka dla VW: > akcja waga | F00:a F01:b F10:c F20:d F21:e Gdzie *Fxy: a* to zmapowany na cyfrę obiekt a będący na koordynatach (x,y) w stosunku do prawego górnego rogu pola widzenia agenta. Przykładowa linijka danych: > 1 5.0 | F00:0.0 F01:1.0 F02:0.0 F10:2.0 F12:0.0 F20:0.0 F21:1.0 F22:1.0 ##### Proces uczenia Aby usprawnić proces zbierania danych dodałyśmy parametry wymagane przy starcie aplikacji. Dla projektu VowpalWabbit, zamiast python3 ./main.py ./Resources/Maps/map_name.txt od teraz wymagane są 2 do 3 argumentów: - plik mapy (ścieżka do mapy lub "auto" dla losowo generowanych map) - informacja, czy aplikacja ma się zamknąc po zakończeniu wykonywania jednego z wcześniej zaimplementowanych algorytmów (true / false) - algorytm, który automatycznie uruchamia się po starcie aplikacji (bfs / dfs / bestfs / brak wartości jeżeli nie chcemy nic automatycznie włączać) Przykładowe wywołanie komendy: >python3 ./main.py auto false dfs W celu maksymalnego zautomatyzowania procesu uczenia się, stworzyłyśmy skrypt, które wszystkie potrzebne rzeczy robi za nas. Wymaga podania liczby uruchomień aplikacji, informacji, czy ma wyczyścić poprzednie dane, nazwę wyjściowego modelu oraz informację, czy po zakończeniu zbierania danych powinien od razu zacząć sie uczyć. Po uruchomieniu aplikacji wymaganą liczbę razy, skrypt zbiera dane z powstałych plików i tworzy z nich jeden plik .txt, który następnie przekazuje do VW za pomocą komendy vw --oaa 5 data_set.txt -f data_model.model Poniżej znajdują się parametry, dla których stworzyłyśmy prezentowany model: | Liczba wykonań programu | Typ mapy | Przykładowy algorytm | Pole widzenia | | --- | --- | --- | --- | | 2000 | auto | BestFS | 2 | W wyniku procesu zbierania danych, otrzymałyśmy dane w liczbie 100 000 linii i output z VW: > Dlaczego > to > nie > działa > HALP #### Obserwacje