diff --git a/integracja.md b/integracja.md new file mode 100644 index 0000000..f8f630e --- /dev/null +++ b/integracja.md @@ -0,0 +1,122 @@ +# *Sztuczna inteligencja - projekt zespołowy - Autonomiczny Traktor* + +#### autorzy: Aleksandra Werda, Natalia Wiśniewska, Kinga Jagodzińska, Aleksandra Jonas +*** +## Integracja podprojektów +___ + +Finalnym zadaniem jest integracja podprojektów wszystkich członków zespołu. + +Traktor (agent): +* informuje nas o stanie gleby (zła, neutralna, dobra) +* decyduje czy dane pole należy podlać +* decyduje jakie warzywo można posadzić na danym polu, aby nie doszło do konfliktu z gatunkami zasadzonymi na sąsiednich polach +* rozpoznaje jakie warzywo rośnie na danym polu. +___ +## Reprezentacja pól +Planszę podzieliłyśmy na 25 osobnych pól uprawnych. Przy każdym uruchomieniu program losowo dobiera dla każdego stopień nawodnienia czy zasiane tam gatunki roślin. + +Całą planszę reprezentujemy jako tablicę punktów poszczególnych pól (współrzędne środka pola). Następnie losowo przyporządkowujemy każdemu jedno z 7 zdjęć (6 warzyw i puste). + +--- +## Rozpoznawanie warzyw + +Pierwszym wykonywanym przez agenta zadaniem jest identyfikacja każdego pola. Przy pomocy sieci neuronowych agent rozpoznaje jakie warzywo zostało posiane na danym polu i przypisuje mu nazwę oraz odpowiednie wartości dot. m. in. podlewania czy wpływu na sąsiednie pola. + +``` + def rozpoznawanie_warzyw(self): + for _ in range(25): + temp = _ + img_path = self.warzywa_etykiety[temp] + img = image.load_img(img_path, target_size=(224, 224)) + x = image.img_to_array(img) + x = np.expand_dims(x, axis=0) + x = preprocess_input(x) + + preds = self.model.predict(x) + preds = np.asarray(preds) + szacunek = preds.max() + ind = np.where(preds == szacunek) + + if ind == 0: + self.fields.append('rzodkiewa') + if ind == 1: + self.fields.append('papryka') + if ind == 2: + self.fields.append('marchew') + if ind == 3: + self.fields.append('pomidorek') + if ind == 4: + self.fields.append('salata') + if ind == 5: + self.fields.append('pietruszka') + if ind == 6: + self.fields.append('puste') +``` + +Na polu może znajdować się: +* marchew +* pomidor +* papryka +* rzodkiewka +* pietruszka +* salata +* lub może pozostać puste - gotowe do zasadzenia. + + +Dodatkowo agent w każdym momencie jest w stanie ponownie zidentyfikować warzywo na danym polu po wciśnięciu klawisza spacji. + +--- +## Tworzenie planszy + +Po rozpoznaniu warzyw, program generuje pozostałe wartości dla pól - chwast, ph gleby, nawodnienie. + +``` + def randomize_field(self): + chwasty_list = list(range(1, 11)) + waga_ch = [0.3, 0.2, 0.15, 0.1, 0.05, 0.05, 0.05, 0.04, 0.03, 0.03] + podlanie_list = list(range(1, 11)) + waga_po = [0.02, 0.05, 0.05, 0.05, 0.05, 0.08, 0.1, 0.15, 0.15, 0.3] + ph_list = list(range(1, 11)) + waga_ph = [0.01, 0.01, 0.02, 0.03, 0.07, 0.37, 0.4, 0.05, 0.03, 0.01] + for x in range(25): + temp = [] + # nasiona + temp1 = [] + temp1.append(random.choices(chwasty_list, waga_ch)[0]) + woda = random.choices(podlanie_list, waga_po)[0] + temp1.append(woda) + temp1.append(random.choices(ph_list, waga_ph)[0]) +``` + +Ilość dni po jakich trzeba podlać rośliny jest różny, dlatego bazując na ropoznaniu przez sieci neuronowe warzyw rosnących na danym polu, ustawiamy dla nich odpowiednie wartości. + +``` + if self.fields[x] == "rzodkiewa": + temp.append(4) + elif self.fields[x] == "papryka": + temp.append(3) + elif self.fields[x] == "pomidor": + temp.append(2) + elif self.fields[x] == "marchew": + temp.append(5) + elif self.fields[x] == "sałata": + temp.append(5) + elif self.fields[x] == "pietruszka": + temp.append(1) + elif self.fields[x] == "puste": + temp.append(6) + else: + temp.append(0) + +``` + +--- +### Działanie agenta + +Poruszamy się agentem po planszy przy użyciu strzałek. + +Po wciśnięciu spacji rozpoznajemy warzywo rosnące na danym polu. + +Klawisze s, g i p odpowiednio odpowiadają za; sadzenie, sprawdzanie stanu gleby oraz sprawdzanie czy dane pole należy podlać. +