diff --git a/WGoracy.md b/WGoracy.md new file mode 100644 index 0000000..da00e4d --- /dev/null +++ b/WGoracy.md @@ -0,0 +1,111 @@ +### Podprojekt indywidualny - Weronika Gorący + +## Wykorzystane metody uczenia + +Do realizacji podprojektu wykorzystano drzewa decyzyjne do decydowania, na które regały należy umieścić paczkę na podstawie jej cech. Do implementacji drzew decyzyjnych w Pythonie wykorzystane zostały biblioteki sklearn i pandas. + +## Omówienie kodu + +Kod podprojektu znajduje się w klasie whereDecision w pliku whereDecision.py. Wywołanie metody recognize odbywa się w klasie program w pliku program.py. + +``` +whatIsIt = self.neurons.whatIsIt(easygui.fileopenbox("Wybierz zdjęcie paczki", "Wybierz zdjęcie paczki", filetypes = [["*.jpg", "*.jpeg", "*.png", "Pliki graficzne"]])) +where = self.whereDecision.recognize(whatIsIt, self.regalsik()) +``` + +Do zmiennej whatIsIt zostaje zapisany typ otrzymanej paczki, który został rozpoznany dzięki innemu podprojektowi, następnie wywoływana jest metoda recognize z parametrami whatIsIt i self.regalsik(). + +Do tablicy regals zapisywane są dane wszystkich regałów wygenerowanych na planszy. + +``` +self.regals.append((i, j, (self.map[i][j]-3)//4)) +``` + +regalsik() sprawdza czy regał z tablicy regals jest pusty i umieszcza go w tablicy wyjściowej, która ostatecznie jest tablicą krotek zawierajacych informacje o wszystkich pustych regałach na planszy. Każda krotka zawiera informacje o współrzędnej Y i X regału oraz typ paczki jaki może być na niej przechowywany. + +``` + def regalsik(self): + tmp = [] + for regal in self.regals: + if self.map[regal[0]][regal[1]].isOccupied()==False: + tmp.append(regal) + return tmp +``` + +## Uczenie modelu + +Metoda recognize rozpoczyna od utworzenia zbioru uczącego na podstawie tabeli zawierającej informacje o pustych półkach na planszy. Dla każdego regału sprawdzany jest typ paczki, który może być na niej przechowywany, a następnie jest on dodawany do odpowiedniej kolumny. Tablica lokacja zawiera położenia wszystkich regałów na planszy. + +``` + def recognize(self, recognize, regals): + zwykle = [] + kruche = [] + latwopalne = [] + radioaktywne = [] + niebezpieczne = [] + lokacja = [] + for regal in regals: + if (regal[2] == 1): + zwykle.append(0) + kruche.append(1) + latwopalne.append(0) + radioaktywne.append(0) + niebezpieczne.append(0) + lokacja.append(str("("+str(regal[0])+", "+str(regal[1])+")")) + elif (regal[2] == 2): + zwykle.append(0) + kruche.append(0) + latwopalne.append(1) + radioaktywne.append(0) + niebezpieczne.append(0) + lokacja.append(str("("+str(regal[0])+", "+str(regal[1])+")")) + elif (regal[2] == 3): + zwykle.append(0) + kruche.append(0) + latwopalne.append(0) + radioaktywne.append(1) + niebezpieczne.append(0) + lokacja.append(str("("+str(regal[0])+", "+str(regal[1])+")")) + elif (regal[2] == 4): + zwykle.append(0) + kruche.append(0) + latwopalne.append(0) + radioaktywne.append(0) + niebezpieczne.append(1) + lokacja.append(str("("+str(regal[0])+", "+str(regal[1])+")")) + else: + zwykle.append(1) + kruche.append(0) + latwopalne.append(0) + radioaktywne.append(0) + niebezpieczne.append(0) + lokacja.append(str("("+str(regal[0])+", "+str(regal[1])+")")) +``` + +Jeżeli wszystkie półki są zajęte, wózek zatrzyma się w swojej wyjściowej pozycji. + +``` + if len(zwykle) == 0: + return [1, 2] +``` + +Do zmiennej z zapisywany jest nasz zbiór uczący, zaś do zmiennej y zapisujemy tabelę prenumeratorzy typu DataFrame z biblioteki pandas, która zawiera dane lokalizacji. + +``` + z = list(zip(zwykle, kruche, latwopalne, radioaktywne, niebezpieczne)) + prenumeratorzy = pd.DataFrame({"lokacja": lokacja}) + prenumeratorzy["lokacja"], lokacja_kody = pd.factorize(prenumeratorzy["lokacja"]) + y = prenumeratorzy["lokacja"] +``` + +## Implementacja + +Do zmiennej drzewko zapisujemy drzewo decyzyjne z biblioteki sklearn utworzone za pomocą metody DecisionTreeClassifier z parametrem criterion ustawionym na "entropy", które pozwala na uzyskiwanie informacji. Na drzewie wywołujemy metodę fit, która dopasowuje do drzewa zbiór uczący zadany w tablicach z i y.Po dopasowaniu danych możemy przewidzieć przynależność nowych przykładów, co robimy wywołując na drzewie metodę predict z parametrem uzyskanym na samym początku, który zawiera informację o rodzaju otrzymanej paczki. W ostateczności zwracamy kod lokalizacji na której zostanie umieszczona paczka. + +``` + drzewko = DecisionTreeClassifier(criterion="entropy") + drzewko.fit(X=z, y=y) + return list(make_tuple(lokacja_kody[drzewko.predict(recognize)][0])) +``` + +Lokalizacja, którą zwróciła metoda recognize zapisywana jest do zmiennej where (klasa program) i na tej podstawie wózek z pomocą algorytmu AStar wybiera odpowiednią ścieżkę do umieszczenia paczki. \ No newline at end of file