93 lines
3.2 KiB
Markdown
93 lines
3.2 KiB
Markdown
# Sztuczna Inteligencja 2019 - Raport Indywidualny
|
||
|
||
**Czas trwania opisywanych prac:** 09.05.2019 - 11.06.2019
|
||
|
||
**Autor:** Michał Starski
|
||
|
||
**Wybrany temat:** Inteligentna śmieciarka
|
||
|
||
**Link do repozytorium projektu:** https://git.wmi.amu.edu.pl/s440556/SZI2019SmieciarzWmi
|
||
|
||
## Wybrany algorytm uczenia - drzewa decyzyjne
|
||
|
||
### Przygotowane dane
|
||
|
||
Aby zapewnić smieciarce jak najlepszy wynik, do przygotowania danych do uczenia wybrałem algorytm szukania najkrótszej ścieżki, który dawał najlepsze wyniki podczas projektu grupowego - **BestFS**.
|
||
|
||
Podczas każdego jednorazowego przebiegu algorytmu BestFS patrzyłem na to jaki krok śmieciarka wykonuje w danej sytuacji, a następnie dane kroki zapisywałem do pliku w formacie json, tworząc próbki do późniejszej nauki.
|
||
|
||
Przykładowa próbka w formacie json:
|
||
|
||
```json
|
||
{
|
||
"moveset": [
|
||
{
|
||
"maps": [[1, 1, 3, 4, 2, 2, 2, 2, 1], [2, 1, 1, 3, 1, 4, 1, 1, 1]],
|
||
"moves": [1, 2]
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
`moveset` to tablica wszystkich próbek wykorzystywanych do nauki.
|
||
Każdy element tablicy to obiekt posiadający dwa pola:
|
||
`maps` - otoczenie śmieciarki w danym kroku,
|
||
`moves` - ruch śmieciarki przy danym otoczeniu
|
||
|
||
W powyższym przykładzie dla czytelności, zostały przedstawione otoczenia 3x3 wokół śmieciarki. W implementacji obszar ten został powiększony do 7x7 w celu poprawienia dokładności algorytmu.
|
||
|
||
#### Maps
|
||
|
||
Spłaszczona tablicę dwuwymiarową przedstawiająca otoczenie śmieciarki w konkretnym momencie działania algorytmu. Każda z cyfr przedstawia inny obiekt na mapie:
|
||
|
||
- 1 - Trawa (Grass)
|
||
- 2 - Droga (Road)
|
||
- 3 - Wysypisko (Dump)
|
||
- 4 - Dom (House)
|
||
|
||
Dla powyższego przykładu pierwsza sytuacja (`moveset[0].maps[0]`) przedstawia następujące otoczenie na mapie
|
||
|
||
```
|
||
G G D
|
||
H R R
|
||
R R G
|
||
```
|
||
|
||
#### Moves
|
||
|
||
Tablica ruchów śmieciarki. i-ty ruch w tablicy odpowiada i-temu otoczeniu. Wyróżnimay 5 różnych ruchów agenta:
|
||
|
||
- 1 - Lewo
|
||
- 2 - Prawo
|
||
- 3 - Dół
|
||
- 4 - Góra
|
||
- 99 - Zbierz śmieci
|
||
|
||
Tak więc dla powyższego otoczenia `1` będzie oznaczać, że agent ruszył się w lewo.
|
||
|
||
---
|
||
|
||
### Implementacja
|
||
|
||
Do implementacji uczenia poprzez drzewo decyzyjny wykorzystałem bibliotekę [scikit learn](https://scikit-learn.org) do języka **python**. Podając odpowiednie dane, biblioteka przygotuje nam model zdolny do samodzielnego poruszania się na mapie.
|
||
|
||
```python
|
||
#Trenowanie modelu
|
||
from sklearn import tree
|
||
X = [Kolejne otoczenia 7x7 w danym kroku]
|
||
Y = [Kolejne kroki odpowiednie dla danego otoczenia]
|
||
clf = tree.DecisionTreeClassifier()
|
||
clf = clf.fit(X, Y)
|
||
|
||
#Samodzielny ruch wytrenowanego modelu
|
||
clf.predict([Otoczenie agenta])
|
||
```
|
||
|
||
`clf.predict` zwróci nam 1 z 5 ruchów, które ma wykonać agent.
|
||
|
||
---
|
||
|
||
### Obserwacje
|
||
|
||
W idealnym przypadku wytrenowany model powinien odzwierciedlać algorytm BestFS, jako iż to na podstawie jego był trenowany i to jego decyzje starał się naśladować. W rzeczywistości jednak po przygotowaniu ok. 1000 próbek agent radził sobie różnorako. Na jednych mapach poruszał się dość sprawnie, jednak na wielu nie wiedział co ma robić. Przyczyny mogą być różne, jednak w mojej opinii, przygotowanych danych było jednak trochę za mało i gdyby dać o wiele więcej danych do wytrenowania modelu, rezultat byłby o wiele lepszy.
|