Compare commits

..

21 Commits
kuba ... master

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
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
22 changed files with 984 additions and 292 deletions

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,8 @@
# AIProjekt
## Final
[final-evaluation](final-evaluation.md)
## Spis treści
* [Uruchomienie](#uruchomienie)
* [Wykrywanie roślin](#wykrywanie-roślin)

BIN
assets/player.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -1,38 +0,0 @@
from plant import Plant
from datetime import datetime
class Beetroot(Plant):
def __init__(self):
super().__init__()
self._wasFertilized = False #roslina nie byla nawozona przy tworzeniu
def add_soil(self, soil):
super().add_soil()
self._starttime = datetime.now()
#zwraca czy zbierać rośline
def collect(self):
if self.have_soil():
self.__growing()
if self._collect < 95:
return 'False'
elif 95 <= self._collect <= 115:
return 'True'
elif self._collect > 115:
return 'Delete'
#zwraca czy nawozić
def fertillizing(self):
if 35 <= self._collect <= 50:
return True
else:
return False
#każde iles czasu zwieksza wzrost rosliny, wywolywana w momencie sprawdzania czy roslina jest gotowa do zbiorow
def __growing(self):
checktime = datetime.now()
delta = checktime - self._starttime
a = delta // 40
self._collect += a
self._starttime = checktime

View File

@ -1,38 +0,0 @@
from plant import Plant
from datetime import datetime
class Cabbage(Plant):
def __init__(self):
super().__init__()
self._wasFertilized = False #roslina nie byla nawozona przy tworzeniu
def add_soil(self, soil):
super().add_soil()
self._starttime = datetime.now()
#zwraca czy zbierać rośline
def collect(self):
if self.have_soil():
self.__growing()
if self._collect < 85:
return 'False'
elif 85 <= self._collect <= 100:
return 'True'
elif self._collect > 100:
return 'Delete'
#zwraca czy nawozić
def fertillizing(self):
if 30 <= self._collect <= 45:
return True
else:
return False
#każde iles czasu zwieksza wzrost rosliny, wywolywana w momencie sprawdzania czy roslina jest gotowa do zbiorow
def __growing(self):
checktime = datetime.now()
delta = checktime - self._starttime
a = delta // 70
self._collect += a
self._starttime = checktime

View File

@ -1,38 +0,0 @@
from plant import Plant
from datetime import datetime
class Carrot(Plant):
def __init__(self, name, ID):
super().__init__(name, ID)
self._wasFertilized = False #roslina nie byla nawozona przy tworzeniu
def add_soil(self, soil):
super().add_soil()
self._starttime = datetime.now()
#zwraca czy zbierać rośline
def collect(self):
if self.have_soil():
self.__growing()
if self._collect < 90:
return 'False'
elif 90 <= self._collect <= 105:
return 'True'
elif self._collect > 105:
return 'Delete'
#zwraca czy nawozić
def fertillizing(self):
if 30 <= self._collect <= 50:
return True
else:
return False
#każde iles czasu zwieksza wzrost rosliny, wywolywana w momencie sprawdzania czy roslina jest gotowa do zbiorow
def __growing(self):
checktime = datetime.now()
delta = checktime - self._starttime
a = delta // 60
self._collect += a
self._starttime = checktime

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'],
]

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")

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)

37
main.py
View File

@ -1,6 +1,8 @@
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
@ -45,12 +47,16 @@ class Game(object):
#ł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('moj_model.h5')
model = load_model('data/moj_model.h5')
#inicjalizacja
pygame.init()
@ -122,7 +128,7 @@ class Game(object):
pygame.display.update()
#rysowanie
self.pole.fill((0,0,0))
self.pole.fill((157, 128, 48))
self.krata()
self.rysowanie()
pygame.display.flip()
@ -139,9 +145,34 @@ class Game(object):
#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

View File

@ -1,65 +0,0 @@
from abc import ABC, abstractmethod
class Plant:
#tworzymy jakas rosline co ma nazwe,i id. ID powiedzmy ze buraki beda mialy 1, marchewki 2 itd. gleby powiedzmy tez damy 4 i beda mialy id 5-8
def __init__(self, name, ID):
super().__init__()
self._soil = -1 #jak tworzymy rosline to nie bedzie ona miala gleby
self._name = name #to nazwa rosliny będzie np. burak1
self._id = ID #id rosliny buraki bedą mialy 1, i po tym inne obiekty beda rozpoznawac ten obiekt
self._collect = 0 #nowa roslina jest w 0% dojrzala
#to jest jakbysmy usuneli obiekt. zabezpieczenie, zeby gleba pozniej byla wolna
def __del__(self):
self.leave_soil()
#to sie drukuje jak zapytamy o stworzony obiekt
def __str__(self):
return f'Plant: {self._name}, Soil: {self._soil}, Status: {self.collect()}'
#metoda abstrakcyjna, kazda roslina ma inny czas rosniecia wiec pass
@abstractmethod
def collect(self):
pass
@abstractmethod
def fertillizing(self):
pass
@abstractmethod
def growing(self):
pass
#pobieramy wspolrzedne roslinki
def get_coordinates(self):
if self.have_soil():
a = self.get_soil()
a.get_coordinates(self) #get coordinates jest metoda w glebie
#pobieramy id roślinki
def get_id(self):
return self._id
#dodajemy glebe
def add_soil(self, soil):
self._soil = soil
#zwraca czy roslinka znajduje sie w ziemii obecnie - jak nie ma gleby to znaczy ze nie jest zasadzona jeszcze albo już.
def have_soil(self):
return self._soil is not -1
#pobieramy jaka ma glebe, gleba tutaj będzie obiektem
def get_soil(self):
return self._soil
#to w przypadku jak bedziemy wyciagac z ziemii roslinke
def leave_soil(self):
if self.have_soil():
a = self.get_soil()
a.plant_remove() #to bedzie metoda w klasie Soil, bedzie usuwac roslinke z gleby
self._soil = -1

View File

@ -1,38 +0,0 @@
from plant import Plant
from datetime import datetime
class Pumpkin(Plant):
def __init__(self):
super().__init__()
self._wasFertilized = False #roslina nie byla nawozona przy tworzeniu
def add_soil(self, soil):
super().add_soil()
self._starttime = datetime.now()
#zwraca czy zbierać rośline
def collect(self):
if self.have_soil():
self.__growing()
if self._collect < 90:
return 'False'
elif 90 <= self._collect <= 110:
return 'True'
elif self._collect > 110:
return 'Delete'
#zwraca czy nawozić
def fertillizing(self):
if 20 <= self._collect <= 45:
return True
else:
return False
#każde iles czasu zwieksza wzrost rosliny, wywolywana w momencie sprawdzania czy roslina jest gotowa do zbiorow
def __growing(self):
checktime = datetime.now()
delta = checktime - self._starttime
a = delta // 50
self._collect += a
self._starttime = checktime

View File

@ -22,8 +22,8 @@ Klasyfikator działa w głównej pętli while w pliku main.py. Uruchamia się gd
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)
![uczenie](../ss/adamski2.png) <br>
![dzialanie](../ss/adamski1.png)
## Uruchomienie
Instalacja tensorflow <br>

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

67
soil.py
View File

@ -1,67 +0,0 @@
from datetime import datetime
class Soil:
def __init__(self, x, y, ID):
super().__init__()
self._id = ID
self._x = x
self._y = y
self._plant = -1 #nowa gleba nie ma roślinki
self._dry = 0 #procent wysuszenia gleby, tworząc nową jest nawodniona w 100%
self._starttime = datetime.now()
def __del__(self):
self.plant_remove()
def __str__(self):
return f'{self._x}, {self._y}), Plant: {self._plant}'
# współrzędne pola
def get_coordinates(self):
return self._x, self._y
# id gleby
def get_id(self):
return self._id
# zasadzenie roślinki
def add_plant(self, plant):
if not self.have_plant():
plant.add_soil(self)
self._plant = plant
# zwraca czy w ziemi znajduje się roślinka
def have_plant(self):
return self._plant is not -1
# zwraca roślinkę znajdującą się w ziemii
def get_plant(self):
return self._soil
#sprawdza w ilu procentach ziemia jest sucha
def is_dry(self):
self.__drying()
if self._dry < 30:
return 'False'
elif 30 <= self._dry < 70:
return 'Medium'
else:
return 'True'
#metoda wysuszajaca ziemie. dodaje wysuszenie do ziemi, wywolywana w momencie sprawdzania czy ziemia jest sucha
def __drying(self):
checktime = datetime.now()
delta = checktime - self._starttime
a = delta //60
self._dry += a
self._starttime = checktime
self.__is_dry()
# usuwa roślinkę z ziemi i ją zwraca
def plant_remove(self):
if self.have_plant():
a = self.get_plant()
a.leave_soil()
self._plant = -1

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

View File

@ -10,8 +10,12 @@ class Traktor(object):
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):
obje = pygame.Rect(self.x, self.y ,99,99)
pygame.draw.rect(self.game.pole, (0,100,255), obje)
def rysowanie(self):
rect = self.myimage.get_rect()
rect.center = (self.x+50, self.y+50)
self.screen.blit(self.myimage, rect)