SZI2019SmieciarzWmi/Raports/SI_Raport_2.md
2019-04-24 02:27:58 +02:00

75 lines
3.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Sztuczna inteligencja 2019 - Raport 2
**Czas trwania opisywanych prac:** 06.03.2018 - 26.03.2018
**Członkowie zespołu:** Anna Nowak, Magdalena Wilczyńska, Konrad Pierzyński, Michał Starski
**Wybrany temat:** Inteligentna śmieciarka
**Link do repozytorium projektu:** https://git.wmi.amu.edu.pl/s440556/SZI2019SmieciarzWmi
## Pierwszy algorytm przeszukiwania mapy - DFS
#### Implementacja
Pierwszym podejściem naszej grupy do rozwiązania problemu była implementacja
algorytmu przeszukiwania drzewa w głąb - DFS (Wersja iteracyjna).
Aby zaimplementować ten algorytm, niezbędne było przygotowanie dla niego kilku
struktur pomocniczych dzięki którym będziemy mogli jasno zdefiniować warunki stopu i uzyskać satysfakcjonujące nas rozwiązanie.
Do użytych struktur należą:
- **Lista dwuwymiarowa przedstawiająca mapę w formie siatki po której można łatwo iterować** - Jeden stan takiej listy traktowaliśmy jako wierzchołek grafu
- **Stos wykonanych przez algorytm ruchów** - Używany do przechodzenia do kolejnych możliwych stanów jak i zapamiętania rozwiązania problemu.
- **Lista możliwych ruchów do wykonania przez agenta przy konkretnym stanie mapy**
- **Licznik głębokości na którą zszedł algorytm** - Zapobiega zajściu za głęboko w przypadku braku rozwiązania
**Przebieg algorytmu**:
- Dodaj do stosu pierwszy krok
- Dopóki stos nie jest pusty:
1. Weź stan mapy ze stosu (operacja stack.pop())
2. Sprawdź warunek końca (Czy problem został rozwiązany ?)
- Jeżeli tak, zakończ algorytm
- Jeżeli nie, sprawdź czy głębokość przekroczyła 30
1. Jeżeli tak, zakończ algorytm informacją o braku rozwiązania
2. Jeżeli nie, kontynuuj algorytm
Rozwiązanie następuje wtedy, gdy wszystkie śmieci zostaną zebrane przez agenta.
#### Obserwacje
Przede wszystkim, algorytm przeszukiwania w głąb działa dla tego problemu
**zdecydowanie wolniej niż powinien**, przy jego działaniu łatwo wchodzić w głąb złej ścieżki, która nie doprowadzi nas do rozwiązania. Co prawda przy małej mapie algorytm radzi sobie z problemem, jednak z każdą kolejną większą
jest co raz gorzej.
Problem można pokazać na przykładzie:
Załóżmy, że hipotetyczne drzewo T wygląda w taki sposób:
```
a -- e
|
b
|
c
|
d
.
. - 100 wierzchołków
.
x
```
Naszym rozwiązaniem będzie doprowadzenie agenta z wierzchołka startowego **a** do wierzchołka końcowego **b**. DFS odwiedzi najpierw wierzchołki po kolei od a aż do x i dopiero później przyjdzie do e. Naturalnie można stwierdzić, że to nie jest sposób którego szukamy. Oczywiście 100 wierzchołków to mała liczba dla komputera, ale co jak będzie ich 1000, 10 000, lub 1 000 000 ?
#### Podsumowanie
Szukanie w głąb miałoby sens w innych przypadkach, na przykład gdybyśmy chcieli znaleźć możliwe wyniki w grze gdzie każda akcja pociąga za sobą kolejną, tworząc dość głęboki graf.
Do szukania ścieżki po której ma poruszać się agent lepiej byłoby jednak przeszukiwać graf wszerz.
#### Uruchamianie
Aby uruchomić DFS na mapie Śmieciarza WMI, należy kliknąć **0**.