1
0
forked from s444426/AIProjekt

Compare commits

..

50 Commits

Author SHA1 Message Date
Jakub Adamski
cf80f84132 labes-correction 2020-06-10 08:15:15 +02:00
Jakub Adamski
04612d5cf3 Merge branch 'master' of https://git.wmi.amu.edu.pl/s444426/AIProjekt 2020-06-09 22:16:20 +02:00
Jakub Adamski
dc3db5b500 raport 2020-06-09 22:16:16 +02:00
1b24a853af final 2020-06-09 22:06:04 +02:00
c7ebf5b1b7 merge 2020-06-09 20:08:06 +02:00
2bae8269f2 merge 2020-06-09 19:34:29 +02:00
0b0ee6612b pod_Agata 2020-06-09 19:33:55 +02:00
MikeWMI
27cffed5d1 Merge branch 'master' of https://git.wmi.amu.edu.pl/s444426/AIProjekt 2020-06-09 15:59:18 +02:00
MikeWMI
d27aa09cd2 pod_Mikolaj 2020-06-09 15:59:02 +02:00
b7b7a509df plant, soil upgrade 2020-06-09 15:28:02 +02:00
Jakub Adamski
ecb0b8e426 grafika-init 2020-06-09 12:15:51 +02:00
ca13578946 Merge branch 'kuba' of s444426/AIProjekt into master 2020-06-09 09:35:32 +00:00
f35adaea6b klasa ziemi (zmienione) 2020-05-26 21:16:50 +00:00
7930f1fab7 ID3 2020-05-26 21:16:30 +00:00
ab08c46c63 klasy roślin (zmienione) 2020-05-26 21:15:49 +00:00
8b81d751b9 raport 2020-05-26 19:55:26 +00:00
df1767e243 raport 2020-05-26 19:51:23 +00:00
7e46213a57 raport 2020-05-26 18:50:34 +00:00
4cc7c6f5e2 Zaktualizuj 'adamski_raport.md' 2020-05-18 09:06:22 +00:00
Jakub Adamski
752cc86890 Merge branch 'kuba' of https://git.wmi.amu.edu.pl/s444426/AIProjekt into kuba 2020-05-18 10:56:20 +02:00
Jakub Adamski
f6c4f94b0c training 2020-05-18 10:55:02 +02:00
b1be1b43e1 img update 2020-05-12 16:28:34 +00:00
Jakub Adamski
8b7aac315e podprojekt-kuba 2020-05-12 18:25:47 +02:00
c9bbc11a79 planowanie ruchu 2020-04-28 21:02:08 +00:00
0d9a04381f planowanie ruchu 2020-04-28 21:01:14 +00:00
afc971574b Dodaj 'route-planning.md' 2020-04-28 20:56:30 +00:00
Jakub Adamski
fa7f01244f planowanie_ruchu 2020-04-28 21:15:29 +02:00
Jakub Adamski
b55566c193 dijkstra_1 2020-04-28 18:22:11 +02:00
70e5f5c16c Zaktualizuj 'traktor.py' 2020-04-08 07:03:07 +00:00
Jakub Adamski
cba879ae15 Merge branch 'master' of https://git.wmi.amu.edu.pl/s444426/AIProjekt 2020-04-07 20:59:30 +02:00
Jakub Adamski
9a9e7ad6c1 raport 2020-04-07 20:59:26 +02:00
f16dbe6e1b Zaktualizuj 'beetroot.py' 2020-04-07 18:58:58 +00:00
126745acfe przyrost1 2020-04-07 18:46:27 +00:00
13bea07e02 przyrost1 2020-04-07 18:46:09 +00:00
2a0740f79c przyrost1 2020-04-07 18:45:45 +00:00
bb28415641 Prześlij pliki do '' 2020-04-07 18:45:16 +00:00
97be779791 przyrost1
poprawione __str__ w plant i soil
2020-04-07 18:28:04 +00:00
3ddb999e3a przyrost1
poprawienie plików
2020-04-07 18:17:35 +00:00
e86c375f9c przyrost1
prawidlowe liczenie czasu dopiero po zasadzeniu
2020-04-07 17:53:43 +00:00
7304d0b03c przyrost1
poprawa growing
2020-04-07 17:50:34 +00:00
c2e1a88895 Zaktualizuj 'README.md' 2020-04-07 17:39:53 +00:00
8feee67563 D.M.
zmiana fertilizing
2020-04-07 17:22:29 +00:00
b0154dc37e Prześlij pliki do ''
dodanie klas soil i carrot
2020-04-07 17:15:42 +00:00
Jakub Adamski
0e8a2a72ef przyrost1 2020-04-07 16:58:12 +02:00
edd59c603e Zaktualizuj 'plant.py'
dodacie metody protection
2020-04-05 17:49:20 +00:00
15ebaf6423 Zaktualizuj 'plant.py'
zmiana metody get_coordinates
2020-04-05 17:37:40 +00:00
b1b3d505ff Zaktualizuj 'plant.py'
skomentowanie metody dodajacej i pobierajacej wspolrzedne
2020-04-05 17:31:18 +00:00
1665e01931 Zaktualizuj 'plant.py' 2020-04-05 17:29:08 +00:00
ab368e4d2d Prześlij pliki do ''
Klasa Plant z ktorej bedziemy robic roslinki
2020-04-05 17:28:34 +00:00
7928edc2e8 Merge branch 'master' of s444455/AIProjekt into master 2020-03-21 12:03:01 +00:00
25 changed files with 1373 additions and 3 deletions

11
.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
#vs code
.vscode/
#pycache
__pycache__/
#macOS
.DS_Store
#uczenie
dataset/

185
ID3.py Normal file
View File

@ -0,0 +1,185 @@
import pandas as pd
import numpy as np
from data import dataset
training_data = pd.DataFrame(data=dataset.training_data, columns=dataset.header)
testing_data = pd.DataFrame(data=dataset.testing_data, columns=dataset.header)
def entropy(target_col):
"""
Obliczenie warości entropii dla wskazanej kolumny
"""
values, counts = np.unique(target_col, return_counts=True)
entropy = np.sum(
[(-counts[i] / np.sum(counts)) * np.log2(counts[i] / np.sum(counts)) for i in range(len(values))])
return entropy
def info_gain(data, split_attribute_name, target_name="label"):
"""
Obliczenie wartości przyrostu informacji dla wskazanego atrybutu (split_attribute_name)
w podanym zbiorze (data)
"""
# Wartość entropii zbioru
total_entropy = entropy(data[target_name])
# Wyodrębnienie poszczególnych "podzbiorów"
vals, counts = np.unique(data[split_attribute_name], return_counts=True)
# Średnia ważona entropii każdego podzbioru
weighted_entropy = np.sum(
[(counts[i] / np.sum(counts)) * entropy(data.where(data[split_attribute_name] == vals[i]).dropna()[target_name])
for i in range(len(vals))])
# Przyrost informacji
information_gain = total_entropy - weighted_entropy
return information_gain
def ID3(data, original_data, features, target_attribute_name="label", parent_node_class=None):
"""
Algorytm ID3
parametry:
data zbiór danych, dla którego poszukujemy drzewa decyzyjnego
original_data oryginalny zbiór danych (zwracany gdy data == None)
features lista atrybutów wejściowego zbioru
target_attribute_name docelowy atrybut, który chcemy przewidzieć
parent_node_class nadrzędna wartość
"""
# Jeżeli wszystkie atrybuty są takie same, zwracamy liść z pierwszą napotkaną wartością
if len(np.unique(data[target_attribute_name])) <= 1:
return np.unique(data[target_attribute_name])[0]
elif len(data) == 0:
return np.unique(original_data[target_attribute_name])[
np.argmax(np.unique(original_data[target_attribute_name], return_counts=True)[1])]
elif len(features) == 0:
return parent_node_class
else:
# Aktualizacja nadrzędnej wartości
parent_node_class = np.unique(data[target_attribute_name])[
np.argmax(np.unique(data[target_attribute_name], return_counts=True)[1])]
# Obliczenie przyrostu informacji dla każdego potencjalnego atrybutu,
# według którego nastąpi podział zbioru
item_values = [info_gain(data, feature, target_attribute_name) for feature in
features]
# Najlepszym atrybutem jest ten o największym przyroście informacji
best_feature_index = np.argmax(item_values)
best_feature = features[best_feature_index]
# Struktura drzewa
tree = {best_feature: {}}
# Aktualizacja zbioru atrybutów
features = [i for i in features if i != best_feature]
# Dla każdej wartości wybranego atrybutu budujemy kolejne poddrzewo
for value in np.unique(data[best_feature]):
sub_data = data.where(data[best_feature] == value).dropna()
subtree = ID3(sub_data, data, features, target_attribute_name, parent_node_class)
tree[best_feature][value] = subtree
return (tree)
def predict(query, tree, default='none'):
"""
Przeszukiwanie drzewa w celu przewidzenia wartości atrybutu "label".
W przypadku, gdy dane wejściowe nie pokrywają się z żadnymi wartościami w drzewie
(np pH ziemi zostanie sklasyfikowane jako 'strongly acidic', a dane uczące nie obejmują rekordów dla takiej wartości),
wówczas przewidywana zostaje wartość domyślna.
"""
for key in list(query.keys()):
if key in list(tree.keys()):
try:
result = tree[key][query[key]]
except:
return default
result = tree[key][query[key]]
if isinstance(result, dict):
return predict(query, result)
else:
return result
def test(data, tree):
# Wartości docelowych atrybutów (nazwy warzyw) zostają usunięte
queries = data.iloc[:, :-1].to_dict(orient="records")
# Przewidywane wartości atrybutów
predicted = pd.DataFrame(columns=["predicted"])
# Obliczenie precyzji przewidywań
for i in range(len(data)):
predicted.loc[i, "predicted"] = predict(queries[i], tree, 'mushroom')
print('Precyzja przewidywań: ', (np.sum(predicted["predicted"] == data["label"]) / len(data)) * 100, '%')
def predict_data(data):
"""
Funkcja dostosowana do formatu danych, jakimi dysponuje traktor
'data' jest tutaj listą, która zostaje przekonwertowana do postaci słownika,
aby możliwe było wywołanie procedury 'predict'.
Wyniki zostają zwrócone w postaci listy.
"""
parse_data = [[data[0], categorize_pH(data[1]), categorize_dry_level(data[2]), '']]
#print(parse_data)
queries = pd.DataFrame(data=parse_data, columns=dataset.header)
predicted = pd.DataFrame(columns=["predicted"])
dict = queries.iloc[:, :-1].to_dict(orient="records")
for i in range(len(parse_data)):
predicted.loc[i, "predicted"] = predict(dict[i], tree, 'mushroom')
predicted_list = predicted.values.tolist()
print("Planted: ", predicted_list[0][0])
return predicted_list[0][0]
def categorize_pH(pH):
if pH <= 4.5:
return 'strongly acidic'
if 4.5 < pH <= 5.5:
return 'acidic'
if 5.5 < pH <= 6.5:
return 'slightly acidic'
if 6.5 < pH <= 7.2:
return 'neutral'
if 7.2 < pH:
return 'alkaline'
def categorize_dry_level(dry_level):
if dry_level <= 0.1:
return 'soaking wet'
if 0.1 < dry_level <= 0.4:
return 'wet'
if 0.4 < dry_level <= 0.6:
return 'medium wet'
if 0.6 < dry_level <= 0.8:
return 'dry'
if 0.8 < dry_level:
return 'very dry'
# tworzenie, wyświetlanie i testowanie drzewa
tree = ID3(training_data, training_data, training_data.columns[:-1])
#pprint(tree)
#test(testing_data, tree)

View File

@ -1,5 +1,57 @@
# AIProjekt # AIProjekt
## Final
[final-evaluation](final-evaluation.md)
## Spis treści
* [Uruchomienie](#uruchomienie)
* [Wykrywanie roślin](#wykrywanie-roślin)
* [Raport 1](#raport-1)
* [Notatki](#notatki)
## Uruchomienie
Wymagania:
* python 3.7
* zainstalowana paczka pygame (np. pip3 install pygame)
Wpisanie komendy w glownym folderze: <br> `python3 main.py`
## Wykrywanie roślin
Podprojekt na osobnym branchu - kuba. Raport - adamski_raport.md
## Raport 1
### Środowisko agenta
Całość środowiska jest napisana za pomocą języka programowania - Python oraz dodatkowej paczki - Pygame. Niebieski kwadrat reprezentuje agenta, plansza to widoczne na ekranie okno z czarnym tłem.
<br>
W naszym projekcie głównym agentem wykonującym określone działania jest traktor. Może się on poruszać po planszy, która będzie podzielona na równe części - mniejsze kwadraty. Zadania traktora to:
* decyzja o sadzeniu/zasianiu rośliny,
* nawożenie,
* zbiory upraw w odpowiednim czasie,
* oraz oczywiście odpowiednie poruszanie się po planszy.
W danym mniejszym kwadracie, traktor znajdzie wszystkie niezbędne informacje do podjęcia wyżej wymienionych działań. Będą to indywidualne projekty, które wkrótce zrealizujemy i połączymy w całość.
### Reprezentacja wiedzy
Projekt zostanie napisany w języku Python, wiedzę również będziemy reprezentować za jego pomocą. System opiera się na klasach i zawartych w nich zmiennych oraz metodach. Dzięki temu cała wiedza jest integralną częścią wykorzystywanych narzędzi programistycznych. Dostęp do danych jest szybki i bezproblemowy.
<br>
Utworzyliśmy przykładowe klasy reprezentujące wymienione obiekty:
* roślina oraz dany rodzaj rośliny - marchewka,
* gleba.
W pliku carrot.py mamy między innymi funkcję add_soil, która dodaje odpowiedni rodzaj gleby (zmienna), w jakim została umieszczona marchewka. Reszta funkcji jest analogiczna i nie będziemy ich omawiać ze względu na dużą ilość.
<br>
Wymienione wyżej klasy zostały utworzone jako przykład i mogą być, w trakcie rozwoju projektu, zmienione bądź dodane nowe.
## Notatki
Pomysły na projekt indywidualny: Pomysły na projekt indywidualny:
1. Decyzja odnoścnie ruchu (szukanie najlepszej ścieżki) 1. Decyzja odnoścnie ruchu (szukanie najlepszej ścieżki)
2. Decycja czy sadzić roślinę 2. Decycja czy sadzić roślinę
@ -8,5 +60,3 @@ Pomysły na projekt indywidualny:
Środowisko: Środowisko:
Jest ogrnaiczone pole, w polu są kratki, gracz może poruszać się po kratkach. W danej kratce są dane o polu. Jest ogrnaiczone pole, w polu są kratki, gracz może poruszać się po kratkach. W danej kratce są dane o polu.
stanu gleby (nawodnienie, ph, rodzaj)

BIN
assets/player.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

209
data.csv Normal file
View File

@ -0,0 +1,209 @@
PLANT,HUMIDITY,GROWTH,DRYNESS,DEC
CAULIFLOWER,43,94,4,YES
CABBAGE,17,99,9,NO
CABBAGE,25,106,11,NO
CABBAGE,47,118,17,NO
CABBAGE,22,103,19,NO
CABBAGE,55,112,20,NO
CABBAGE,13,110,22,NO
CABBAGE,20,100,22,NO
CABBAGE,11,113,25,NO
CABBAGE,55,95,26,NO
CABBAGE,12,109,27,NO
CABBAGE,18,119,28,NO
CABBAGE,29,90,29,NO
CAULIFLOWER,23,99,30,NO
MUSHROOM,53,94,30,NO
CAULIFLOWER,28,120,31,NO
MUSHROOM,29,91,34,NO
CAULIFLOWER,34,121,34,NO
CAULIFLOWER,33,110,36,NO
MUSHROOM,52,102,36,NO
CAULIFLOWER,52,116,36,NO
CAULIFLOWER,26,118,37,NO
MUSHROOM,59,112,41,NO
MUSHROOM,51,90,42,NO
MUSHROOM,22,91,43,NO
CAULIFLOWER,62,114,43,NO
CAULIFLOWER,78,97,43,NO
MUSHROOM,60,92,44,NO
CAULIFLOWER,88,112,44,NO
CAULIFLOWER,12,111,45,NO
CAULIFLOWER,53,113,48,NO
CAULIFLOWER,68,104,51,NO
MUSHROOM,7,117,52,NO
CAULIFLOWER,51,113,54,NO
PUMPKIN,20,89,69,YES
CAULIFLOWER,16,102,55,NO
PUMPKIN,21,63,23,YES
MUSHROOM,13,111,56,NO
CAULIFLOWER,22,95,57,NO
MUSHROOM,8,104,58,NO
PUMPKIN,23,26,19,YES
CAULIFLOWER,58,106,62,NO
PUMPKIN,24,68,7,YES
PUMPKIN,25,66,96,NO
CAULIFLOWER,55,99,63,NO
MUSHROOM,74,104,67,NO
PUMPKIN,28,34,68,YES
CAULIFLOWER,57,102,68,NO
PUMPKIN,29,29,61,YES
PUMPKIN,46,90,70,NO
CABBAGE,46,93,70,NO
CAULIFLOWER,29,105,71,NO
PUMPKIN,30,28,31,YES
MUSHROOM,30,67,24,YES
PUMPKIN,30,96,30,NO
CABBAGE,30,89,30,YES
CABBAGE,31,62,40,YES
PUMPKIN,31,65,34,YES
MUSHROOM,31,81,17,YES
MUSHROOM,31,89,29,YES
MUSHROOM,32,20,19,YES
CABBAGE,32,25,50,YES
MUSHROOM,32,90,22,NO
MUSHROOM,32,56,7,YES
CABBAGE,33,15,50,YES
MUSHROOM,33,32,14,YES
PUMPKIN,33,47,59,YES
PUMPKIN,19,99,72,NO
MUSHROOM,33,63,30,NO
CABBAGE,33,65,64,YES
CABBAGE,34,27,44,YES
CABBAGE,34,44,93,NO
MUSHROOM,34,44,22,YES
PUMPKIN,51,99,72,NO
CABBAGE,34,56,70,NO
MUSHROOM,34,56,18,YES
CABBAGE,35,21,63,YES
PUMPKIN,35,42,48,YES
CAULIFLOWER,35,74,12,YES
PUMPKIN,35,76,71,NO
CAULIFLOWER,36,58,28,YES
CABBAGE,36,57,54,YES
CAULIFLOWER,36,72,84,NO
CAULIFLOWER,36,83,71,NO
CABBAGE,36,67,64,YES
PUMPKIN,36,82,53,YES
CABBAGE,37,47,57,YES
MUSHROOM,37,59,13,YES
CAULIFLOWER,37,40,15,YES
CAULIFLOWER,37,69,16,YES
CABBAGE,37,63,60,YES
PUMPKIN,37,72,46,YES
CABBAGE,38,62,79,NO
CAULIFLOWER,38,98,12,NO
CAULIFLOWER,38,59,22,YES
PUMPKIN,38,73,56,YES
CABBAGE,38,74,52,YES
PUMPKIN,38,90,39,NO
MUSHROOM,38,78,9,YES
CABBAGE,39,86,64,NO
PUMPKIN,39,31,45,YES
PUMPKIN,39,102,53,NO
CAULIFLOWER,39,49,14,YES
CAULIFLOWER,39,54,81,NO
CABBAGE,39,87,57,NO
CABBAGE,40,8,32,YES
PUMPKIN,40,57,63,YES
CABBAGE,40,92,61,NO
CAULIFLOWER,40,52,27,YES
PUMPKIN,41,8,29,YES
CABBAGE,41,25,48,YES
CABBAGE,41,43,51,YES
CABBAGE,41,52,60,YES
CAULIFLOWER,41,20,24,YES
MUSHROOM,41,83,25,YES
CABBAGE,41,85,37,YES
CABBAGE,42,64,41,YES
MUSHROOM,42,66,26,YES
CABBAGE,42,69,59,YES
CAULIFLOWER,42,38,9,YES
MUSHROOM,43,15,9,YES
MUSHROOM,43,93,22,NO
CABBAGE,43,60,38,YES
PUMPKIN,43,78,43,YES
CAULIFLOWER,43,29,18,YES
CAULIFLOWER,43,96,20,NO
CAULIFLOWER,43,84,4,YES
CABBAGE,61,130,72,NO
CABBAGE,44,59,31,YES
PUMPKIN,44,64,44,YES
CAULIFLOWER,44,62,19,YES
CABBAGE,45,35,69,YES
MUSHROOM,45,65,27,YES
MUSHROOM,45,71,2,YES
PUMPKIN,45,83,57,YES
CAULIFLOWER,45,31,26,YES
CAULIFLOWER,45,61,10,YES
CAULIFLOWER,45,76,85,NO
MUSHROOM,46,48,24,YES
MUSHROOM,10,96,73,NO
CABBAGE,62,123,74,NO
MUSHROOM,47,37,16,YES
MUSHROOM,47,42,41,NO
CAULIFLOWER,47,50,11,YES
PUMPKIN,11,99,75,NO
CABBAGE,16,98,75,NO
MUSHROOM,48,77,12,YES
CABBAGE,48,106,75,NO
CAULIFLOWER,48,32,23,YES
CAULIFLOWER,48,44,19,YES
CAULIFLOWER,48,98,14,NO
CABBAGE,8,124,76,NO
MUSHROOM,49,64,4,YES
PUMPKIN,59,114,76,NO
PUMPKIN,50,119,77,NO
CABBAGE,55,116,77,NO
MUSHROOM,50,74,21,YES
CAULIFLOWER,50,47,25,YES
CABBAGE,53,117,78,NO
PUMPKIN,55,91,78,NO
PUMPKIN,49,91,79,NO
CABBAGE,56,125,79,NO
MUSHROOM,57,95,79,NO
PUMPKIN,8,123,80,NO
MUSHROOM,16,99,80,NO
PUMPKIN,55,93,80,NO
CABBAGE,60,99,80,NO
MUSHROOM,13,114,81,NO
CAULIFLOWER,20,100,81,NO
CABBAGE,49,100,81,NO
PUMPKIN,54,92,81,NO
CABBAGE,10,94,83,NO
PUMPKIN,17,91,83,NO
CAULIFLOWER,17,95,84,NO
PUMPKIN,53,92,84,NO
MUSHROOM,65,110,85,NO
PUMPKIN,73,101,85,NO
PUMPKIN,18,102,88,NO
PUMPKIN,47,120,88,NO
PUMPKIN,48,102,89,NO
MUSHROOM,60,98,89,NO
CABBAGE,68,120,89,NO
CABBAGE,58,16,26,NO
MUSHROOM,53,107,90,NO
CABBAGE,8,92,92,NO
MUSHROOM,11,97,92,NO
PUMPKIN,14,98,92,NO
CAULIFLOWER,58,103,92,NO
CABBAGE,59,131,92,NO
PUMPKIN,57,104,93,NO
MUSHROOM,67,97,93,NO
CABBAGE,3,107,94,NO
PUMPKIN,17,104,94,NO
PUMPKIN,17,94,96,NO
CABBAGE,56,101,96,NO
PUMPKIN,58,95,97,NO
MUSHROOM,80,93,97,NO
PUMPKIN,10,105,99,NO
PUMPKIN,50,121,99,NO
PUMPKIN,9,97,100,NO
PUMPKIN,12,95,102,NO
PUMPKIN,16,97,103,NO
PUMPKIN,60,107,107,NO
PUMPKIN,58,107,109,NO
PUMPKIN,13,96,111,NO
PUMPKIN,61,111,113,NO
PUMPKIN,49,110,116,NO
PUMPKIN,64,112,120,NO
1 PLANT HUMIDITY GROWTH DRYNESS DEC
2 CAULIFLOWER 43 94 4 YES
3 CABBAGE 17 99 9 NO
4 CABBAGE 25 106 11 NO
5 CABBAGE 47 118 17 NO
6 CABBAGE 22 103 19 NO
7 CABBAGE 55 112 20 NO
8 CABBAGE 13 110 22 NO
9 CABBAGE 20 100 22 NO
10 CABBAGE 11 113 25 NO
11 CABBAGE 55 95 26 NO
12 CABBAGE 12 109 27 NO
13 CABBAGE 18 119 28 NO
14 CABBAGE 29 90 29 NO
15 CAULIFLOWER 23 99 30 NO
16 MUSHROOM 53 94 30 NO
17 CAULIFLOWER 28 120 31 NO
18 MUSHROOM 29 91 34 NO
19 CAULIFLOWER 34 121 34 NO
20 CAULIFLOWER 33 110 36 NO
21 MUSHROOM 52 102 36 NO
22 CAULIFLOWER 52 116 36 NO
23 CAULIFLOWER 26 118 37 NO
24 MUSHROOM 59 112 41 NO
25 MUSHROOM 51 90 42 NO
26 MUSHROOM 22 91 43 NO
27 CAULIFLOWER 62 114 43 NO
28 CAULIFLOWER 78 97 43 NO
29 MUSHROOM 60 92 44 NO
30 CAULIFLOWER 88 112 44 NO
31 CAULIFLOWER 12 111 45 NO
32 CAULIFLOWER 53 113 48 NO
33 CAULIFLOWER 68 104 51 NO
34 MUSHROOM 7 117 52 NO
35 CAULIFLOWER 51 113 54 NO
36 PUMPKIN 20 89 69 YES
37 CAULIFLOWER 16 102 55 NO
38 PUMPKIN 21 63 23 YES
39 MUSHROOM 13 111 56 NO
40 CAULIFLOWER 22 95 57 NO
41 MUSHROOM 8 104 58 NO
42 PUMPKIN 23 26 19 YES
43 CAULIFLOWER 58 106 62 NO
44 PUMPKIN 24 68 7 YES
45 PUMPKIN 25 66 96 NO
46 CAULIFLOWER 55 99 63 NO
47 MUSHROOM 74 104 67 NO
48 PUMPKIN 28 34 68 YES
49 CAULIFLOWER 57 102 68 NO
50 PUMPKIN 29 29 61 YES
51 PUMPKIN 46 90 70 NO
52 CABBAGE 46 93 70 NO
53 CAULIFLOWER 29 105 71 NO
54 PUMPKIN 30 28 31 YES
55 MUSHROOM 30 67 24 YES
56 PUMPKIN 30 96 30 NO
57 CABBAGE 30 89 30 YES
58 CABBAGE 31 62 40 YES
59 PUMPKIN 31 65 34 YES
60 MUSHROOM 31 81 17 YES
61 MUSHROOM 31 89 29 YES
62 MUSHROOM 32 20 19 YES
63 CABBAGE 32 25 50 YES
64 MUSHROOM 32 90 22 NO
65 MUSHROOM 32 56 7 YES
66 CABBAGE 33 15 50 YES
67 MUSHROOM 33 32 14 YES
68 PUMPKIN 33 47 59 YES
69 PUMPKIN 19 99 72 NO
70 MUSHROOM 33 63 30 NO
71 CABBAGE 33 65 64 YES
72 CABBAGE 34 27 44 YES
73 CABBAGE 34 44 93 NO
74 MUSHROOM 34 44 22 YES
75 PUMPKIN 51 99 72 NO
76 CABBAGE 34 56 70 NO
77 MUSHROOM 34 56 18 YES
78 CABBAGE 35 21 63 YES
79 PUMPKIN 35 42 48 YES
80 CAULIFLOWER 35 74 12 YES
81 PUMPKIN 35 76 71 NO
82 CAULIFLOWER 36 58 28 YES
83 CABBAGE 36 57 54 YES
84 CAULIFLOWER 36 72 84 NO
85 CAULIFLOWER 36 83 71 NO
86 CABBAGE 36 67 64 YES
87 PUMPKIN 36 82 53 YES
88 CABBAGE 37 47 57 YES
89 MUSHROOM 37 59 13 YES
90 CAULIFLOWER 37 40 15 YES
91 CAULIFLOWER 37 69 16 YES
92 CABBAGE 37 63 60 YES
93 PUMPKIN 37 72 46 YES
94 CABBAGE 38 62 79 NO
95 CAULIFLOWER 38 98 12 NO
96 CAULIFLOWER 38 59 22 YES
97 PUMPKIN 38 73 56 YES
98 CABBAGE 38 74 52 YES
99 PUMPKIN 38 90 39 NO
100 MUSHROOM 38 78 9 YES
101 CABBAGE 39 86 64 NO
102 PUMPKIN 39 31 45 YES
103 PUMPKIN 39 102 53 NO
104 CAULIFLOWER 39 49 14 YES
105 CAULIFLOWER 39 54 81 NO
106 CABBAGE 39 87 57 NO
107 CABBAGE 40 8 32 YES
108 PUMPKIN 40 57 63 YES
109 CABBAGE 40 92 61 NO
110 CAULIFLOWER 40 52 27 YES
111 PUMPKIN 41 8 29 YES
112 CABBAGE 41 25 48 YES
113 CABBAGE 41 43 51 YES
114 CABBAGE 41 52 60 YES
115 CAULIFLOWER 41 20 24 YES
116 MUSHROOM 41 83 25 YES
117 CABBAGE 41 85 37 YES
118 CABBAGE 42 64 41 YES
119 MUSHROOM 42 66 26 YES
120 CABBAGE 42 69 59 YES
121 CAULIFLOWER 42 38 9 YES
122 MUSHROOM 43 15 9 YES
123 MUSHROOM 43 93 22 NO
124 CABBAGE 43 60 38 YES
125 PUMPKIN 43 78 43 YES
126 CAULIFLOWER 43 29 18 YES
127 CAULIFLOWER 43 96 20 NO
128 CAULIFLOWER 43 84 4 YES
129 CABBAGE 61 130 72 NO
130 CABBAGE 44 59 31 YES
131 PUMPKIN 44 64 44 YES
132 CAULIFLOWER 44 62 19 YES
133 CABBAGE 45 35 69 YES
134 MUSHROOM 45 65 27 YES
135 MUSHROOM 45 71 2 YES
136 PUMPKIN 45 83 57 YES
137 CAULIFLOWER 45 31 26 YES
138 CAULIFLOWER 45 61 10 YES
139 CAULIFLOWER 45 76 85 NO
140 MUSHROOM 46 48 24 YES
141 MUSHROOM 10 96 73 NO
142 CABBAGE 62 123 74 NO
143 MUSHROOM 47 37 16 YES
144 MUSHROOM 47 42 41 NO
145 CAULIFLOWER 47 50 11 YES
146 PUMPKIN 11 99 75 NO
147 CABBAGE 16 98 75 NO
148 MUSHROOM 48 77 12 YES
149 CABBAGE 48 106 75 NO
150 CAULIFLOWER 48 32 23 YES
151 CAULIFLOWER 48 44 19 YES
152 CAULIFLOWER 48 98 14 NO
153 CABBAGE 8 124 76 NO
154 MUSHROOM 49 64 4 YES
155 PUMPKIN 59 114 76 NO
156 PUMPKIN 50 119 77 NO
157 CABBAGE 55 116 77 NO
158 MUSHROOM 50 74 21 YES
159 CAULIFLOWER 50 47 25 YES
160 CABBAGE 53 117 78 NO
161 PUMPKIN 55 91 78 NO
162 PUMPKIN 49 91 79 NO
163 CABBAGE 56 125 79 NO
164 MUSHROOM 57 95 79 NO
165 PUMPKIN 8 123 80 NO
166 MUSHROOM 16 99 80 NO
167 PUMPKIN 55 93 80 NO
168 CABBAGE 60 99 80 NO
169 MUSHROOM 13 114 81 NO
170 CAULIFLOWER 20 100 81 NO
171 CABBAGE 49 100 81 NO
172 PUMPKIN 54 92 81 NO
173 CABBAGE 10 94 83 NO
174 PUMPKIN 17 91 83 NO
175 CAULIFLOWER 17 95 84 NO
176 PUMPKIN 53 92 84 NO
177 MUSHROOM 65 110 85 NO
178 PUMPKIN 73 101 85 NO
179 PUMPKIN 18 102 88 NO
180 PUMPKIN 47 120 88 NO
181 PUMPKIN 48 102 89 NO
182 MUSHROOM 60 98 89 NO
183 CABBAGE 68 120 89 NO
184 CABBAGE 58 16 26 NO
185 MUSHROOM 53 107 90 NO
186 CABBAGE 8 92 92 NO
187 MUSHROOM 11 97 92 NO
188 PUMPKIN 14 98 92 NO
189 CAULIFLOWER 58 103 92 NO
190 CABBAGE 59 131 92 NO
191 PUMPKIN 57 104 93 NO
192 MUSHROOM 67 97 93 NO
193 CABBAGE 3 107 94 NO
194 PUMPKIN 17 104 94 NO
195 PUMPKIN 17 94 96 NO
196 CABBAGE 56 101 96 NO
197 PUMPKIN 58 95 97 NO
198 MUSHROOM 80 93 97 NO
199 PUMPKIN 10 105 99 NO
200 PUMPKIN 50 121 99 NO
201 PUMPKIN 9 97 100 NO
202 PUMPKIN 12 95 102 NO
203 PUMPKIN 16 97 103 NO
204 PUMPKIN 60 107 107 NO
205 PUMPKIN 58 107 109 NO
206 PUMPKIN 13 96 111 NO
207 PUMPKIN 61 111 113 NO
208 PUMPKIN 49 110 116 NO
209 PUMPKIN 64 112 120 NO

209
data/data.csv Normal file
View File

@ -0,0 +1,209 @@
PLANT,FEED,GROWTH,DRYNESS,DEC
BEETROOT,43,94,4,YES
CABBAGE,17,99,9,NO
CABBAGE,25,106,11,NO
CABBAGE,47,118,17,NO
CABBAGE,22,103,19,NO
CABBAGE,55,112,20,NO
CABBAGE,13,110,22,NO
CABBAGE,20,100,22,NO
CABBAGE,11,113,25,NO
CABBAGE,55,95,26,NO
CABBAGE,12,109,27,NO
CABBAGE,18,119,28,NO
CABBAGE,29,90,29,NO
BEETROOT,23,99,30,NO
CARROT,53,94,30,NO
BEETROOT,28,120,31,NO
CARROT,29,91,34,NO
BEETROOT,34,121,34,NO
BEETROOT,33,110,36,NO
CARROT,52,102,36,NO
BEETROOT,52,116,36,NO
BEETROOT,26,118,37,NO
CARROT,59,112,41,NO
CARROT,51,90,42,NO
CARROT,22,91,43,NO
BEETROOT,62,114,43,NO
BEETROOT,78,97,43,NO
CARROT,60,92,44,NO
BEETROOT,88,112,44,NO
BEETROOT,12,111,45,NO
BEETROOT,53,113,48,NO
BEETROOT,68,104,51,NO
CARROT,7,117,52,NO
BEETROOT,51,113,54,NO
PUMPKIN,20,89,69,YES
BEETROOT,16,102,55,NO
PUMPKIN,21,63,23,YES
CARROT,13,111,56,NO
BEETROOT,22,95,57,NO
CARROT,8,104,58,NO
PUMPKIN,23,26,19,YES
BEETROOT,58,106,62,NO
PUMPKIN,24,68,7,YES
PUMPKIN,25,66,96,NO
BEETROOT,55,99,63,NO
CARROT,74,104,67,NO
PUMPKIN,28,34,68,YES
BEETROOT,57,102,68,NO
PUMPKIN,29,29,61,YES
PUMPKIN,46,90,70,NO
CABBAGE,46,93,70,NO
BEETROOT,29,105,71,NO
PUMPKIN,30,28,31,YES
CARROT,30,67,24,YES
PUMPKIN,30,96,30,NO
CABBAGE,30,89,30,YES
CABBAGE,31,62,40,YES
PUMPKIN,31,65,34,YES
CARROT,31,81,17,YES
CARROT,31,89,29,YES
CARROT,32,20,19,YES
CABBAGE,32,25,50,YES
CARROT,32,90,22,NO
CARROT,32,56,7,YES
CABBAGE,33,15,50,YES
CARROT,33,32,14,YES
PUMPKIN,33,47,59,YES
PUMPKIN,19,99,72,NO
CARROT,33,63,30,NO
CABBAGE,33,65,64,YES
CABBAGE,34,27,44,YES
CABBAGE,34,44,93,NO
CARROT,34,44,22,YES
PUMPKIN,51,99,72,NO
CABBAGE,34,56,70,NO
CARROT,34,56,18,YES
CABBAGE,35,21,63,YES
PUMPKIN,35,42,48,YES
BEETROOT,35,74,12,YES
PUMPKIN,35,76,71,NO
BEETROOT,36,58,28,YES
CABBAGE,36,57,54,YES
BEETROOT,36,72,84,NO
BEETROOT,36,83,71,NO
CABBAGE,36,67,64,YES
PUMPKIN,36,82,53,YES
CABBAGE,37,47,57,YES
CARROT,37,59,13,YES
BEETROOT,37,40,15,YES
BEETROOT,37,69,16,YES
CABBAGE,37,63,60,YES
PUMPKIN,37,72,46,YES
CABBAGE,38,62,79,NO
BEETROOT,38,98,12,NO
BEETROOT,38,59,22,YES
PUMPKIN,38,73,56,YES
CABBAGE,38,74,52,YES
PUMPKIN,38,90,39,NO
CARROT,38,78,9,YES
CABBAGE,39,86,64,NO
PUMPKIN,39,31,45,YES
PUMPKIN,39,102,53,NO
BEETROOT,39,49,14,YES
BEETROOT,39,54,81,NO
CABBAGE,39,87,57,NO
CABBAGE,40,8,32,YES
PUMPKIN,40,57,63,YES
CABBAGE,40,92,61,NO
BEETROOT,40,52,27,YES
PUMPKIN,41,8,29,YES
CABBAGE,41,25,48,YES
CABBAGE,41,43,51,YES
CABBAGE,41,52,60,YES
BEETROOT,41,20,24,YES
CARROT,41,83,25,YES
CABBAGE,41,85,37,YES
CABBAGE,42,64,41,YES
CARROT,42,66,26,YES
CABBAGE,42,69,59,YES
BEETROOT,42,38,9,YES
CARROT,43,15,9,YES
CARROT,43,93,22,NO
CABBAGE,43,60,38,YES
PUMPKIN,43,78,43,YES
BEETROOT,43,29,18,YES
BEETROOT,43,96,20,NO
BEETROOT,43,84,4,YES
CABBAGE,61,130,72,NO
CABBAGE,44,59,31,YES
PUMPKIN,44,64,44,YES
BEETROOT,44,62,19,YES
CABBAGE,45,35,69,YES
CARROT,45,65,27,YES
CARROT,45,71,2,YES
PUMPKIN,45,83,57,YES
BEETROOT,45,31,26,YES
BEETROOT,45,61,10,YES
BEETROOT,45,76,85,NO
CARROT,46,48,24,YES
CARROT,10,96,73,NO
CABBAGE,62,123,74,NO
CARROT,47,37,16,YES
CARROT,47,42,41,NO
BEETROOT,47,50,11,YES
PUMPKIN,11,99,75,NO
CABBAGE,16,98,75,NO
CARROT,48,77,12,YES
CABBAGE,48,106,75,NO
BEETROOT,48,32,23,YES
BEETROOT,48,44,19,YES
BEETROOT,48,98,14,NO
CABBAGE,8,124,76,NO
CARROT,49,64,4,YES
PUMPKIN,59,114,76,NO
PUMPKIN,50,119,77,NO
CABBAGE,55,116,77,NO
CARROT,50,74,21,YES
BEETROOT,50,47,25,YES
CABBAGE,53,117,78,NO
PUMPKIN,55,91,78,NO
PUMPKIN,49,91,79,NO
CABBAGE,56,125,79,NO
CARROT,57,95,79,NO
PUMPKIN,8,123,80,NO
CARROT,16,99,80,NO
PUMPKIN,55,93,80,NO
CABBAGE,60,99,80,NO
CARROT,13,114,81,NO
BEETROOT,20,100,81,NO
CABBAGE,49,100,81,NO
PUMPKIN,54,92,81,NO
CABBAGE,10,94,83,NO
PUMPKIN,17,91,83,NO
BEETROOT,17,95,84,NO
PUMPKIN,53,92,84,NO
CARROT,65,110,85,NO
PUMPKIN,73,101,85,NO
PUMPKIN,18,102,88,NO
PUMPKIN,47,120,88,NO
PUMPKIN,48,102,89,NO
CARROT,60,98,89,NO
CABBAGE,68,120,89,NO
CABBAGE,58,16,26,NO
CARROT,53,107,90,NO
CABBAGE,8,92,92,NO
CARROT,11,97,92,NO
PUMPKIN,14,98,92,NO
BEETROOT,58,103,92,NO
CABBAGE,59,131,92,NO
PUMPKIN,57,104,93,NO
CARROT,67,97,93,NO
CABBAGE,3,107,94,NO
PUMPKIN,17,104,94,NO
PUMPKIN,17,94,96,NO
CABBAGE,56,101,96,NO
PUMPKIN,58,95,97,NO
CARROT,80,93,97,NO
PUMPKIN,10,105,99,NO
PUMPKIN,50,121,99,NO
PUMPKIN,9,97,100,NO
PUMPKIN,12,95,102,NO
PUMPKIN,16,97,103,NO
PUMPKIN,60,107,107,NO
PUMPKIN,58,107,109,NO
PUMPKIN,13,96,111,NO
PUMPKIN,61,111,113,NO
PUMPKIN,49,110,116,NO
PUMPKIN,64,112,120,NO
1 PLANT FEED GROWTH DRYNESS DEC
2 BEETROOT 43 94 4 YES
3 CABBAGE 17 99 9 NO
4 CABBAGE 25 106 11 NO
5 CABBAGE 47 118 17 NO
6 CABBAGE 22 103 19 NO
7 CABBAGE 55 112 20 NO
8 CABBAGE 13 110 22 NO
9 CABBAGE 20 100 22 NO
10 CABBAGE 11 113 25 NO
11 CABBAGE 55 95 26 NO
12 CABBAGE 12 109 27 NO
13 CABBAGE 18 119 28 NO
14 CABBAGE 29 90 29 NO
15 BEETROOT 23 99 30 NO
16 CARROT 53 94 30 NO
17 BEETROOT 28 120 31 NO
18 CARROT 29 91 34 NO
19 BEETROOT 34 121 34 NO
20 BEETROOT 33 110 36 NO
21 CARROT 52 102 36 NO
22 BEETROOT 52 116 36 NO
23 BEETROOT 26 118 37 NO
24 CARROT 59 112 41 NO
25 CARROT 51 90 42 NO
26 CARROT 22 91 43 NO
27 BEETROOT 62 114 43 NO
28 BEETROOT 78 97 43 NO
29 CARROT 60 92 44 NO
30 BEETROOT 88 112 44 NO
31 BEETROOT 12 111 45 NO
32 BEETROOT 53 113 48 NO
33 BEETROOT 68 104 51 NO
34 CARROT 7 117 52 NO
35 BEETROOT 51 113 54 NO
36 PUMPKIN 20 89 69 YES
37 BEETROOT 16 102 55 NO
38 PUMPKIN 21 63 23 YES
39 CARROT 13 111 56 NO
40 BEETROOT 22 95 57 NO
41 CARROT 8 104 58 NO
42 PUMPKIN 23 26 19 YES
43 BEETROOT 58 106 62 NO
44 PUMPKIN 24 68 7 YES
45 PUMPKIN 25 66 96 NO
46 BEETROOT 55 99 63 NO
47 CARROT 74 104 67 NO
48 PUMPKIN 28 34 68 YES
49 BEETROOT 57 102 68 NO
50 PUMPKIN 29 29 61 YES
51 PUMPKIN 46 90 70 NO
52 CABBAGE 46 93 70 NO
53 BEETROOT 29 105 71 NO
54 PUMPKIN 30 28 31 YES
55 CARROT 30 67 24 YES
56 PUMPKIN 30 96 30 NO
57 CABBAGE 30 89 30 YES
58 CABBAGE 31 62 40 YES
59 PUMPKIN 31 65 34 YES
60 CARROT 31 81 17 YES
61 CARROT 31 89 29 YES
62 CARROT 32 20 19 YES
63 CABBAGE 32 25 50 YES
64 CARROT 32 90 22 NO
65 CARROT 32 56 7 YES
66 CABBAGE 33 15 50 YES
67 CARROT 33 32 14 YES
68 PUMPKIN 33 47 59 YES
69 PUMPKIN 19 99 72 NO
70 CARROT 33 63 30 NO
71 CABBAGE 33 65 64 YES
72 CABBAGE 34 27 44 YES
73 CABBAGE 34 44 93 NO
74 CARROT 34 44 22 YES
75 PUMPKIN 51 99 72 NO
76 CABBAGE 34 56 70 NO
77 CARROT 34 56 18 YES
78 CABBAGE 35 21 63 YES
79 PUMPKIN 35 42 48 YES
80 BEETROOT 35 74 12 YES
81 PUMPKIN 35 76 71 NO
82 BEETROOT 36 58 28 YES
83 CABBAGE 36 57 54 YES
84 BEETROOT 36 72 84 NO
85 BEETROOT 36 83 71 NO
86 CABBAGE 36 67 64 YES
87 PUMPKIN 36 82 53 YES
88 CABBAGE 37 47 57 YES
89 CARROT 37 59 13 YES
90 BEETROOT 37 40 15 YES
91 BEETROOT 37 69 16 YES
92 CABBAGE 37 63 60 YES
93 PUMPKIN 37 72 46 YES
94 CABBAGE 38 62 79 NO
95 BEETROOT 38 98 12 NO
96 BEETROOT 38 59 22 YES
97 PUMPKIN 38 73 56 YES
98 CABBAGE 38 74 52 YES
99 PUMPKIN 38 90 39 NO
100 CARROT 38 78 9 YES
101 CABBAGE 39 86 64 NO
102 PUMPKIN 39 31 45 YES
103 PUMPKIN 39 102 53 NO
104 BEETROOT 39 49 14 YES
105 BEETROOT 39 54 81 NO
106 CABBAGE 39 87 57 NO
107 CABBAGE 40 8 32 YES
108 PUMPKIN 40 57 63 YES
109 CABBAGE 40 92 61 NO
110 BEETROOT 40 52 27 YES
111 PUMPKIN 41 8 29 YES
112 CABBAGE 41 25 48 YES
113 CABBAGE 41 43 51 YES
114 CABBAGE 41 52 60 YES
115 BEETROOT 41 20 24 YES
116 CARROT 41 83 25 YES
117 CABBAGE 41 85 37 YES
118 CABBAGE 42 64 41 YES
119 CARROT 42 66 26 YES
120 CABBAGE 42 69 59 YES
121 BEETROOT 42 38 9 YES
122 CARROT 43 15 9 YES
123 CARROT 43 93 22 NO
124 CABBAGE 43 60 38 YES
125 PUMPKIN 43 78 43 YES
126 BEETROOT 43 29 18 YES
127 BEETROOT 43 96 20 NO
128 BEETROOT 43 84 4 YES
129 CABBAGE 61 130 72 NO
130 CABBAGE 44 59 31 YES
131 PUMPKIN 44 64 44 YES
132 BEETROOT 44 62 19 YES
133 CABBAGE 45 35 69 YES
134 CARROT 45 65 27 YES
135 CARROT 45 71 2 YES
136 PUMPKIN 45 83 57 YES
137 BEETROOT 45 31 26 YES
138 BEETROOT 45 61 10 YES
139 BEETROOT 45 76 85 NO
140 CARROT 46 48 24 YES
141 CARROT 10 96 73 NO
142 CABBAGE 62 123 74 NO
143 CARROT 47 37 16 YES
144 CARROT 47 42 41 NO
145 BEETROOT 47 50 11 YES
146 PUMPKIN 11 99 75 NO
147 CABBAGE 16 98 75 NO
148 CARROT 48 77 12 YES
149 CABBAGE 48 106 75 NO
150 BEETROOT 48 32 23 YES
151 BEETROOT 48 44 19 YES
152 BEETROOT 48 98 14 NO
153 CABBAGE 8 124 76 NO
154 CARROT 49 64 4 YES
155 PUMPKIN 59 114 76 NO
156 PUMPKIN 50 119 77 NO
157 CABBAGE 55 116 77 NO
158 CARROT 50 74 21 YES
159 BEETROOT 50 47 25 YES
160 CABBAGE 53 117 78 NO
161 PUMPKIN 55 91 78 NO
162 PUMPKIN 49 91 79 NO
163 CABBAGE 56 125 79 NO
164 CARROT 57 95 79 NO
165 PUMPKIN 8 123 80 NO
166 CARROT 16 99 80 NO
167 PUMPKIN 55 93 80 NO
168 CABBAGE 60 99 80 NO
169 CARROT 13 114 81 NO
170 BEETROOT 20 100 81 NO
171 CABBAGE 49 100 81 NO
172 PUMPKIN 54 92 81 NO
173 CABBAGE 10 94 83 NO
174 PUMPKIN 17 91 83 NO
175 BEETROOT 17 95 84 NO
176 PUMPKIN 53 92 84 NO
177 CARROT 65 110 85 NO
178 PUMPKIN 73 101 85 NO
179 PUMPKIN 18 102 88 NO
180 PUMPKIN 47 120 88 NO
181 PUMPKIN 48 102 89 NO
182 CARROT 60 98 89 NO
183 CABBAGE 68 120 89 NO
184 CABBAGE 58 16 26 NO
185 CARROT 53 107 90 NO
186 CABBAGE 8 92 92 NO
187 CARROT 11 97 92 NO
188 PUMPKIN 14 98 92 NO
189 BEETROOT 58 103 92 NO
190 CABBAGE 59 131 92 NO
191 PUMPKIN 57 104 93 NO
192 CARROT 67 97 93 NO
193 CABBAGE 3 107 94 NO
194 PUMPKIN 17 104 94 NO
195 PUMPKIN 17 94 96 NO
196 CABBAGE 56 101 96 NO
197 PUMPKIN 58 95 97 NO
198 CARROT 80 93 97 NO
199 PUMPKIN 10 105 99 NO
200 PUMPKIN 50 121 99 NO
201 PUMPKIN 9 97 100 NO
202 PUMPKIN 12 95 102 NO
203 PUMPKIN 16 97 103 NO
204 PUMPKIN 60 107 107 NO
205 PUMPKIN 58 107 109 NO
206 PUMPKIN 13 96 111 NO
207 PUMPKIN 61 111 113 NO
208 PUMPKIN 49 110 116 NO
209 PUMPKIN 64 112 120 NO

71
data/dataset.py Normal file
View File

@ -0,0 +1,71 @@
header = ['previous', 'soil pH', 'dry level', 'label']
training_data = [
['mushroom', 'alkaline', 'dry', 'cauliflower'],
['mushroom', 'slightly acidic', 'dry', 'cauliflower'],
['cabbage', 'alkaline', 'dry', 'cauliflower'],
['none', 'alkaline', 'dry', 'cauliflower'],
['mushroom', 'slightly acidic', 'medium wet', 'cauliflower'],
['none', 'slightly acidic', 'dry', 'cauliflower'],
['pumpkin', 'neutral', 'dry', 'cauliflower'],
['cauliflower', 'neutral', 'dry', 'cauliflower'],
['cabbage', 'alkaline', 'medium wet', 'cauliflower'],
['none', 'slightly acidic', 'medium wet', 'cauliflower'],
['cabbage', 'acidic', 'dry', 'mushroom'],
['none', 'acidic', 'medium wet', 'mushroom'],
['mushroom', 'neutral', 'dry', 'mushroom'],
['cauliflower', 'slightly acidic', 'dry', 'mushroom'],
['pumpkin', 'acidic', 'medium wet', 'mushroom'],
['cauliflower', 'acidic', 'medium wet', 'mushroom'],
['mushroom', 'neutral', 'dry', 'mushroom'],
['pumpkin', 'slightly acidic', 'medium wet', 'mushroom'],
['cauliflower', 'neutral', 'wet', 'pumpkin'],
['none', 'neutral', 'wet', 'pumpkin'],
['mushroom', 'slightly acidic', 'wet', 'pumpkin'],
['pumpkin', 'neutral', 'wet', 'pumpkin'],
['cabbage', 'slightly acidic', 'medium wet', 'pumpkin'],
['mushroom', 'neutral', 'wet', 'pumpkin'],
['cabbage', 'neutral', 'wet', 'pumpkin'],
['none', 'slightly acidic', 'wet', 'pumpkin'],
['cauliflower', 'slightly acidic', 'medium wet', 'pumpkin'],
['mushroom', 'neutral', 'medium wet', 'cabbage'],
['pumpkin', 'alkaline', 'wet', 'cabbage'],
['none', 'alkaline', 'medium wet', 'cabbage'],
['cauliflower', 'neutral', 'medium wet', 'cabbage'],
['cabbage', 'slightly acidic', 'wet', 'cabbage'],
['none', 'neutral', 'medium wet', 'cabbage'],
['cabbage', 'neutral', 'medium wet', 'cabbage'],
['mushroom', 'alkaline', 'wet', 'cabbage'],
['none', 'alkaline', 'wet', 'cabbage'],
['pumpkin', 'neutral', 'medium wet', 'cabbage'],
['mushroom', 'neutral', 'soaking wet', 'none'],
['cauliflower', 'alkaline', 'very dry', 'none'],
['none', 'alkaline', 'soaking wet', 'none'],
['cabbage', 'acidic', 'medium wet', 'none'],
['pumpkin', 'acidic', 'soaking wet', 'none'],
['cabbage', 'slightly acidic', 'soaking wet', 'none'],
['none', 'slightly acidic', 'soaking wet', 'none'],
['mushroom', 'neutral', 'very dry', 'none'],
['mushroom', 'acidic', 'medium wet', 'none'],
['pumpkin', 'neutral', 'soaking wet', 'none']
]
testing_data = [
['cauliflower', 'neutral', 'dry', 'cauliflower'],
['cabbage', 'alkaline', 'medium wet', 'cauliflower'],
['none', 'slightly acidic', 'medium wet', 'cauliflower'],
['cabbage', 'acidic', 'dry', 'mushroom'],
['none', 'acidic', 'medium wet', 'mushroom'],
['mushroom', 'neutral', 'dry', 'mushroom'],
['cauliflower', 'neutral', 'wet', 'pumpkin'],
['none', 'neutral', 'wet', 'pumpkin'],
['mushroom', 'slightly acidic', 'wet', 'pumpkin'],
['mushroom', 'neutral', 'medium wet', 'cabbage'],
['pumpkin', 'alkaline', 'wet', 'cabbage'],
['none', 'alkaline', 'medium wet', 'cabbage'],
['mushroom', 'neutral', 'soaking wet', 'none'],
['cauliflower', 'alkaline', 'very dry', 'none'],
['none', 'alkaline', 'soaking wet', 'none'],
]

BIN
data/moj_model.h5 Normal file

Binary file not shown.

51
decisiontree.py Normal file
View File

@ -0,0 +1,51 @@
import pandas as pd
#NIE AKTULAIZOWAĆ scikit / sklearn
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree.export import export_text
from sklearn.tree import export_graphviz
def decision(plant,humidity,growth,dryness):
# czytanie pliku csv
df = pd.read_csv("./data.csv")
#print(df)
#zmiana słów na cyfry, ponieważ drzewo decyzyjne opiera się na cyfrach
z = {'CABBAGE': 2, 'PUMPKIN':4, 'MUSHROOM':3, 'CAULIFLOWER': 1}
df['PLANT'] = df['PLANT'].map(z)
d = {'NO': 0, 'YES': 1}
df['DEC'] = df['DEC'].map(d)
#print(df)
features_rest = ['PLANT','HUMIDITY','GROWTH','DRYNESS'] #dane, na których opiera się decyzja
features_dec = ['DEC'] #kolumna z decyją
X = df[features_rest]
y = df[features_dec]
#wyświetlkanie kolumn
#print(X)
#print(y)
#tworzenie drzewa
dtree = DecisionTreeClassifier()
#przypisanie danych
dtree = dtree.fit(X, y)
#eksport drzewa do tekstu
r = export_text(dtree, feature_names=features_rest)
#print("\nDrzewo decyzyjne\n")
#print(r)
a = dtree.predict([[plant,humidity,growth,dryness]])
#return a
#print("\n[1] means FEED THE PLANT")
#print("[0] means NOT FEED THE PLANT\n")
print ("Decision for: ",plant,", humidity: ", humidity,", growth: ", growth,", dryness:", dryness," is ", a,"\n")

75
dijkstra.py Normal file
View File

@ -0,0 +1,75 @@
import sys
# Graf, koszt przejscia 1
# 1- 2- 3- 4- 5
# |
# 10- 9- 8- 7- 6
# |
# 11-12-13-14-15
# |
# 20-19-18-17-16
# |
# 21-22-23-24-25
graph = [[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #1
[1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #2
[0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #3
[0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #4
[0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #5
[0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #6
[0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #7
[0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #8
[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #9
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #11
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #12
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #13
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #14
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], #15
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], #16
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], #17
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0], #18
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], #19
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0], #20
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0], #21
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0], #22
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], #23
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1], #24
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0] ] #25
def printSolution(dist):
print("Odleglosc punktow od wyznaczonego")
for node in range(len(graph)):
print("Punkt: {} odleglosc: {}".format(node, dist[node]))
def minDistance(dist, sptSet):
mini = sys.maxsize
for v in range(len(graph)):
if dist[v] < mini and sptSet[v] == False:
mini = dist[v]
min_index = v
return min_index
def dijkstra(src):
dist = [sys.maxsize] * len(graph)
dist[src] = 0
sptSet = [False] * len(graph)
for cout in range(len(graph)):
u = minDistance(dist, sptSet)
sptSet[u] = True
for v in range(len(graph)):
if graph[u][v] > 0 and sptSet[v] == False and dist[v] > dist[u] + graph[u][v]:
dist[v] = dist[u] + graph[u][v]
#printSolution(dist, graph)
return dist
#wypisuje tylko odpowiednio koszt przejscia do danego punktu
#struktura grafu jest na tyle uproszczona ze nie trzeba wypisywac po kolei ktore punkty odwiedzamy
#bo idziemy albo o punkt nizej albo wyzej
#oczywiscie da to sie wszystko jakos bardziej rozwinac
#dijkstra(2)

25
final-evaluation.md Normal file
View File

@ -0,0 +1,25 @@
# Inteligentny traktor
## Opis
W finalnej wersji naszego projektu połączyliśmy wszyskie części w całość. Lista podprojektów:
* Agata Lenz - decyzja o zebraniu i posadzeniu nowej rośliny,
* Mikołaj Paterka - decyzja o nawozeniu rośliny,
* Jakub Adamski - wykrywanie typu rośliny.
## Działanie
Traktorem mozemy sterować samodzielnie lub wybierając odpowiednie pola - planowanie ruchu. Agent poruszając się po planszy, polu, podejmuje następujące działania.
1) Wykrywa typ rośliny na podstawie podanego zdjęcia;
2) Podejmuje decyzję czy daną roślinę zebrać, jeśli tak sadzi równiez nową;
3) Na podstawie między innymi danych o wilgotności gleby, podejmuje decyzję czy nawozić daną roślinę;
Projekt spełnia zadane na początku załozenia oraz implementuje kazdy z podprojektów.
## Zdjęcia
Uruchomienie - wybór czy uzywamy planowania ruchu.
![start](ss/final2.png)
Działanie programu.<br>
Posadzona nowa roślina - grzyb. Wykryta roślina na podstawie zdjęcia - grzyb (indeks 2 zaczynając od zera dla kategorii podanych ponizej). Roślina została nawieziona - wynik [1] na podstawie danych o statusie otoczenia i rośliny.
![dzialanie](ss/final1.png)

BIN
imgs/cabbage.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
imgs/cauliflower.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
imgs/mushroom.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
imgs/pumpkin.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

200
main.py Normal file
View File

@ -0,0 +1,200 @@
import pygame, sys
from traktor import Traktor
import dijkstra as di
import decisiontree as dt
from ID3 import predict_data
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import load_model
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions
import numpy as np
import os, random
#u mnie blad z biblioteka
os.environ['KMP_DUPLICATE_LIB_OK']='True'
class Game(object):
def __init__(self):
#lokalizacje odpowiednich punktow na planszy
lokalizacje = [[0,0],
[100, 0],
[200, 0],
[300, 0],
[400, 0],
[400, 100],
[300, 100],
[200, 100],
[100, 100],
[0, 100],
[0, 200],
[100, 200],
[200, 200],
[300, 200],
[400, 200],
[400, 300],
[300, 300],
[200, 300],
[100, 300],
[0, 300],
[0, 400],
[100, 400],
[200, 400],
[300, 400],
[400, 400]]
#ładowanie tablicy ze zdjeciami
imgs = []
data_plant = []
data_soil = []
img_dir = './imgs'
for _ in lokalizacje:
data_plant.append([random.randrange(5, 90),random.randrange(0, 120),random.randrange(5, 90)])
data_soil.append([random.randrange(44, 75)/10, random.randrange(0, 100)/100])
imgs.append(img_dir + '/' + random.choice(os.listdir(img_dir)))
#model do rozpoznawania
model = load_model('data/moj_model.h5')
#inicjalizacja
pygame.init()
self.pole = pygame.display.set_mode((501,501))
self.player = Traktor(self)
sterowanie = int(input("Podaj czy chcesz sam sterowac traktorem - 1, czy chcesz podawac punkty - 0: "))
if sterowanie == 1:
sterowanie = True
else:
sterowanie = False
while True:
run_classifier = False
#obsługa zdarzń
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(0)
#sterowanie traktorem
if sterowanie:
if event.type == pygame.KEYDOWN :
if event.key == pygame.K_UP:
self.player.y -= 100
if self.player.y < 0:
self.player.y = 0
if event.key == pygame.K_DOWN:
self.player.y += 100
if self.player.y > 400:
self.player.y = 400
if event.key == pygame.K_RIGHT:
self.player.x += 100
if self.player.x > 400:
self.player.x = 400
if event.key == pygame.K_LEFT:
self.player.x -= 100
if self.player.x < 0:
self.player.x = 0
#okreslanie w ktorym punkcie jesteśmy
wsp = [self.player.x, self.player.y]
self.player.punkt = lokalizacje.index(wsp)
run_classifier = True
else:
#po spacji wpisujemy punkty
if event.type == pygame.KEYDOWN :
if event.key == pygame.K_SPACE:
pt = 0
punkt1 = int(input("Podaj pierwszy punkt (liczba od 0 do 24): "))
punkt2 = int(input("Podaj drugi punkt (liczba od 0 do 24): "))
dist = di.dijkstra(self.player.punkt)
if dist[punkt1] < dist[punkt2]:
print("Wybralem pierwszy punkt")
pt = punkt1
else:
print("Wybralem drugi punkt")
pt = punkt2
self.player.x = lokalizacje[pt][0]
self.player.y = lokalizacje[pt][1]
self.player.punkt = pt
run_classifier = True
pygame.display.update()
#rysowanie
self.pole.fill((157, 128, 48))
self.krata()
self.rysowanie()
pygame.display.flip()
if run_classifier:
#wybieranie zdjecia
pt = self.player.punkt
img_path = imgs[pt]
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)
#detektor roslin, 5 rezultatow
plt.imshow(img)
preds = model.predict(x)
list_of_preds = preds.tolist()[0]
index = list_of_preds.index(max(list_of_preds))
#print(index)
names = ['cabbage', 'cauliflower', 'mushroom', 'pumpkin']
# decyzja o posadzeniu nowej rośliny następuje wtedy, gdy jest ona dojrzała przynajmniej w 90%
if(data_plant[pt][1] > 90):
new_plant = predict_data([names[index], data_soil[pt][0], data_soil[pt][1]])
if(new_plant != 'none'):
index = names.index(new_plant)
imgs[pt] = img_dir + '/' + (os.listdir(img_dir))[index]
data_plant[pt] = [0, 0, 50]
else:
print("Planted: none")
if index == 0:
dt.decision(4, data_plant[pt][0],data_plant[pt][1],data_plant[pt][2])
if index == 1:
dt.decision(1, data_plant[pt][0],data_plant[pt][1],data_plant[pt][2])
if index == 2:
dt.decision(2, data_plant[pt][0],data_plant[pt][1],data_plant[pt][2])
if index == 3:
dt.decision(3, data_plant[pt][0],data_plant[pt][1],data_plant[pt][2])
print("kapusta, kalafior, grzyb, dynia\n {}\n".format(preds) )
plt.show()
def krata(self):
#wymiary
w= 500
rows = 5
sizeBtw = w // rows
x = 0
y = 0
for r in range(rows):
x = x + sizeBtw
y = y + sizeBtw
#rysownie karaty
pygame.draw.line(self.pole, (255,255,255), (x,0), (x,w))
pygame.draw.line(self.pole, (255,255,255), (0,y), (w,y))
def rysowanie(self):
#rysowanie agenta
self.player.rysowanie()
if __name__=="__main__":
Game()

36
net_training.py Normal file
View File

@ -0,0 +1,36 @@
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model
import numpy as np
import os, random
#podstawa modelu
base_model = MobileNetV2(include_top=False, weights="imagenet", pooling='avg')
#model
x=base_model.output
preds=Dense(4,activation='softmax')(x)
model=Model(inputs=base_model.input,outputs=preds)
#tylko ostatnie 20 warstw uczymy
for layer in model.layers[:20]:
layer.trainable=False
for layer in model.layers[20:]:
layer.trainable=True
#generator obrazkow
train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input)
train_generator=train_datagen.flow_from_directory('./dataset', target_size=(224,224), color_mode='rgb', batch_size=32, class_mode='categorical', shuffle=True)
#uczenie //to dzielenie i podloga
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])
step_size_train=train_generator.n//train_generator.batch_size
model.fit_generator(generator=train_generator, steps_per_epoch=step_size_train, epochs=10)
#zapis
model.save('moj_model.h5')

39
raporty/adamski_raport.md Normal file
View File

@ -0,0 +1,39 @@
## Podprojekt Jakub Adamski
Wykrywanie rodzaju rośliny na danym polu, w którym znajduje się traktor.
## Spis treści
* [Wykorzystana technologia](#wykorzystana-technologia)
* [Dane](#dane)
* [Kod](#kod)
* [Działanie](#działanie)
* [Uruchomienie](#uruchomienie)
* [Notatki](#notatki)
## Wykorzystana technologia
W projekcie wykorzystuję sieć neuronową. Jest to klasyfikator obiektów, oparty na modelu MobileNetV2. MobileNet to wysoce zoptymalizowana struktura pozwalająca na rozpoznawanie obiektów. <br>
Składa się z warstw: CNN - convolutional neural network do wyodrębnienia cech charakterystycznych z obrazka oraz jednej warstwy dense, złozonej z 4 neuronow (ilosc obiektow w moim projekcie), które produkują finalny wynik na podstawie wyniku z CNN.
## Dane
Zgromadzone zdjecia dostepne sa tutaj: [link](https://drive.google.com/open?id=1cs3TE-niBrhXT-23IA9g2rll3Qpk7Xdk). Dane zbierałem za pomocą wyszukiwarki google, następnie pogrupowałem według klas. Ostatnie 20 warstw sieci jest wytrenowana w pliku net_training.py, pierwsze warstwy są uczone na zbiorze danych imagenet - zmienna base_model. <br>
Do uruchomienia uzywam pakietu keras dostępnego w bibliotece tensorflow. Tensorflow to rozbudowany zestaw narzędzi do machine learningu, keraz to nakładka ułatwijąca uzywanie tego frameworku.
## Kod
Klasyfikator działa w głównej pętli while w pliku main.py. Uruchamia się gdy traktor (niebieski kwadrat) zmieni swoją lokalizację. Zdjęcia przypisane do danej kratki są dobierane losowo. W finalnej wersji zdjęć będzie więcej - folder imgs/. <br>
Gdy klasyfikator zakończy swoje działanie, w konsoli pojawia się najbardziej prawdopodobny obiekt znajdujący się na zdjęciu. Zdjęcie pojawia się w osobnym oknie. Po zamknięciu okna mozemy kontynuować sterowanie traktorem za pomocą strzałek.
## Działanie
![uczenie](../ss/adamski2.png) <br>
![dzialanie](../ss/adamski1.png)
## Uruchomienie
Instalacja tensorflow <br>
Byl error z jakas biblioteka, trzeba zainstalować nomkl lub rozwiazanie ad hoc to komenda która pokazuje się przy błędzie. <code>os.environ['KMP_DUPLICATE_LIB_OK']='True'</code>
https://docs.anaconda.com/mkl-optimizations/
## Notatki
Lista obiektów:
- pumpkin/dynia
- cabbage/kapusta
- mushroom/grzyb
- cauliflower/kalafior

132
raporty/lenz_raport.md Normal file
View File

@ -0,0 +1,132 @@
# Agata Lenz - drzewa decyzyjne, algorytm ID3
## Wymagania
Importowane biblioteki:
* numpy
* pandas
## Opis podprojektu
Podprojekt implementuje algorytm ID3 pozwalający wyznaczyć drzewo decyzyjne, przy użyciu którego agent (traktor) podejmie decyzję co posadzić w danym miejscu, na podstawie:
* *previous* - gatunku rośliny, która poprzednio rosła w danym miejscu
* *pH* - pH gleby
* *dry_level* - suchości gleby
## Uczenie modelu
### Dane
Dane uczące jak i testowe znajdują się w pliku data.py. Dane uczące są zapisane w postaci listy, której elementy to przykładowe dane w formacie ['previous', 'pH', 'dry_level', 'label'], gdzie *label* oznacza posadzoną w wymienionych warunkach roślinę.
Łącznie zestaw uczący zawiera 47 elementów, a zestaw testowy - 15.
Przykładowe elementy zestawu uczącego:
```
['pumpkin', 'neutral', 'dry', 'beetroot'],
['none', 'neutral', 'wet', 'pumpkin'],
['cabbage', 'alkaline', 'soaking wet', 'none']
```
### Implementacja algorytmu ID3
Za budowę drzewa decyzyjnego odpowiada rekurencyjna funkcja *ID3(data, original_data, features, target_attribute_name="label", parent_node_class=None)*:
```
def ID3(data, original_data, features, target_attribute_name="label", parent_node_class=None):
"""
Algorytm ID3
parametry:
data zbiór danych, dla którego poszukujemy drzewa decyzyjnego
original_data oryginalny zbiór danych (zwracany gdy data == None)
features lista atrybutów wejściowego zbioru
target_attribute_name docelowy atrybut, który chcemy przewidzieć
parent_node_class nadrzędna wartość
"""
# Jeżeli wszystkie atrybuty są takie same, zwracamy liść z pierwszą napotkaną wartością
if len(np.unique(data[target_attribute_name])) <= 1:
return np.unique(data[target_attribute_name])[0]
elif len(data) == 0:
return np.unique(original_data[target_attribute_name])[
np.argmax(np.unique(original_data[target_attribute_name], return_counts=True)[1])]
elif len(features) == 0:
return parent_node_class
else:
# Aktualizacja nadrzędnej wartości
parent_node_class = np.unique(data[target_attribute_name])[
np.argmax(np.unique(data[target_attribute_name], return_counts=True)[1])]
# Obliczenie przyrostu informacji dla każdego potencjalnego atrybutu,
# według którego nastąpi podział zbioru
item_values = [info_gain(data, feature, target_attribute_name) for feature in
features]
# Najlepszym atrybutem jest ten o największym przyroście informacji
best_feature_index = np.argmax(item_values)
best_feature = features[best_feature_index]
# Struktura drzewa
tree = {best_feature: {}}
# Aktualizacja zbioru atrybutów
features = [i for i in features if i != best_feature]
# Dla każdej wartości wybranego atrybutu budujemy kolejne poddrzewo
for value in np.unique(data[best_feature]):
sub_data = data.where(data[best_feature] == value).dropna()
subtree = ID3(sub_data, data, features, target_attribute_name, parent_node_class)
tree[best_feature][value] = subtree
return (tree)
```
Do obliczenia przyrostu informacji służy funkcja *info_gain(data, split_attribute_name, target_name="label")*, która dla wejściowego zestawu danych (*data*), oblicza jego entropię oraz średnią ważoną entropii każdego podzestawu (wyznaczanego przez unikalne wartości atrybutu *split_attribute_name*):
```
def info_gain(data, split_attribute_name, target_name="label"):
total_entropy = entropy(data[target_name])
vals, counts = np.unique(data[split_attribute_name], return_counts=True)
weighted_entropy = np.sum(
[(counts[i] / np.sum(counts)) * entropy(data.where(data[split_attribute_name] == vals[i]).dropna()[target_name])
for i in range(len(vals))])
information_gain = total_entropy - weighted_entropy
return information_gain
```
## Implementacja w projekcie głównym
Funkcja, z której będzie korzystał traktor, aby podjąć decyzję o posadzeniu rośliny, to *def decide_to_plant(soil)*
```
def decide_to_plant(soil):
if soil.have_plant():
plant = soil.get_plant()
if plant.collect() == 'True':
info = get_info(soil)
plant.leave_soil()
else:
return [['none']]
else:
info = get_info(soil)
data = []
data.append(info)
predicted = predict_data(data)
grow_a_plant(soil,predicted[0][0])
return predicted
```
Pierwszym krokiem jest sprawdzenie, czy w danej ziemi już coś rośnie - jeżeli jest to roślina dojrzała, zostaje ona zebrana, a jej nazwa staje się wartością atrybutu *previous*. Jeżeli nie, nie przewiduje się sadzenia w tym miejscu żadnej rośliny w danym momencie.
Funkcja *get_info(soil)* zwraca listę parametrów obiektu *Soil*, potrzebną do poszukiwań w drzewie decyzyjnym.
W pliku *dataset.py* znajduje się funkcja *create_data_soil()* pozwalająca przetestować działanie algorytmu na obiektach typu *Soil*

56
raporty/route-planning.md Normal file
View File

@ -0,0 +1,56 @@
# Route planning
## Spis treści
* [Informacje](#informacje)
* [Pętla główna](#pętla%20główna)
* [Funkcja następnika](#funkcja%20następnika)
* [Heurystyka](#heurystyka)
## Informacje
Omawiane fragmenty kodu znajdują się w pliku ```dijkstra.py```.
Po uruchomieniu programu, użytkownik ma do wyboru samodzielne sterowanie traktorem przy pomocy strzałek (1) lub podawanie punktów wykorzystujące planowanie ruchu (0). Przy wyborze drugiej z opcji, aby wykonać ruch, użytkownik w aktywnym oknie programu naciska spację, po czym podaje dwa punkty.
## Pętla główna
Implementacja algorytmu Dijkstry:
```
def dijkstra(src):
dist = [sys.maxsize] * len(graph)
dist[src] = 0
sptSet = [False] * len(graph)
for cout in range(len(graph)):
u = minDistance(dist, sptSet)
sptSet[u] = True
for v in range(len(graph)):
if graph[u][v] > 0 and sptSet[v] == False and dist[v] > dist[u] + graph[u][v]:
dist[v] = dist[u] + graph[u][v]
return dist
```
Dla ```src``` będącego wierzchołkiem źródłowym, funkcja zwraca koszt przejścia do każdego punktu w grafie w postaci listy ```dist```.
Dopóki nie zostaną rozpatrzone wszystkie wierzchołki, pętla:
* za wierzchołek ```u``` przyjmuje wierzchołek najbliższy źródła, który nie został jeszcze rozważony
* dla każdego sąsiada ```v``` wierzchołka ```u```, jeżeli przez ```u``` da się dojść do ```v``` szybciej niż dotychczasową ścieżką, to wykonuje podstawienie: ```dist[v] = dist[u] + graph[u][v]```.
## Funkcja następnika
```
def minDistance(dist, sptSet):
mini = sys.maxsize
for v in range(len(graph)):
if dist[v] < mini and sptSet[v] == False:
mini = dist[v]
min_index = v
return min_index
```
Funkcja zwraca indeks wierzchołka, który jest najbliższej źródła, a nie został jeszcze rozważony, przeszukując w tym celu pozostałe wierzchołki grafu.
## Heurystyka

BIN
ss/adamski1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
ss/adamski2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

BIN
ss/final1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
ss/final2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

21
traktor.py Normal file
View File

@ -0,0 +1,21 @@
import pygame
from pygame.math import Vector2
class Traktor(object):
def __init__(self, game):
#przekazywanie okiektu gra obiektowi traktor
self.game = game
self.x = 0
self.y = 0
self.punkt = 0
self.canSteer = True
self.myimage = pygame.image.load("./assets/player.png").convert()
self.myimage = pygame.transform.scale(self.myimage, (99, 99))
self.screen = pygame.display.set_mode((500, 500))
def rysowanie(self):
rect = self.myimage.get_rect()
rect.center = (self.x+50, self.y+50)
self.screen.blit(self.myimage, rect)