diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 300aef3..fa6cb87 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,49 +2,13 @@ - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -207,34 +172,35 @@ - + + - + - + - + - + - + - + - + - + @@ -252,15 +218,15 @@ - + - + - + - + @@ -275,6 +241,6 @@ - + \ No newline at end of file diff --git a/__pycache__/astar.cpython-37.pyc b/__pycache__/astar.cpython-37.pyc index 540fd48..180c0c8 100644 Binary files a/__pycache__/astar.cpython-37.pyc and b/__pycache__/astar.cpython-37.pyc differ diff --git a/__pycache__/cart.cpython-37.pyc b/__pycache__/cart.cpython-37.pyc index 70275bf..f77c0ca 100644 Binary files a/__pycache__/cart.cpython-37.pyc and b/__pycache__/cart.cpython-37.pyc differ diff --git a/__pycache__/definitions.cpython-37.pyc b/__pycache__/definitions.cpython-37.pyc index 7c199b8..6f16531 100644 Binary files a/__pycache__/definitions.cpython-37.pyc and b/__pycache__/definitions.cpython-37.pyc differ diff --git a/__pycache__/graph.cpython-37.pyc b/__pycache__/graph.cpython-37.pyc index d9bc7b6..9e30ed1 100644 Binary files a/__pycache__/graph.cpython-37.pyc and b/__pycache__/graph.cpython-37.pyc differ diff --git a/__pycache__/neuralnetwork.cpython-37.pyc b/__pycache__/neuralnetwork.cpython-37.pyc index 2b3ea84..5aa3eab 100644 Binary files a/__pycache__/neuralnetwork.cpython-37.pyc and b/__pycache__/neuralnetwork.cpython-37.pyc differ diff --git a/__pycache__/plant.cpython-37.pyc b/__pycache__/plant.cpython-37.pyc index e47b153..da2eafa 100644 Binary files a/__pycache__/plant.cpython-37.pyc and b/__pycache__/plant.cpython-37.pyc differ diff --git a/__pycache__/treelearn.cpython-37.pyc b/__pycache__/treelearn.cpython-37.pyc index 07f9535..942f4e3 100644 Binary files a/__pycache__/treelearn.cpython-37.pyc and b/__pycache__/treelearn.cpython-37.pyc differ diff --git a/astar.py b/astar.py index 01190dc..b035171 100644 --- a/astar.py +++ b/astar.py @@ -51,14 +51,14 @@ def cost(map, node): #funkcja kosztu : ile kosztuje przejechanie przez dane pole cost = cost + map.get_field_cost(int(node.get_x()), int(node.get_y())) + 1 node = node.get_parent() return cost -def f(map, node, goaltest): #funkcja zwracająca sumę funkcji kosztu oraz heurestyki - return cost(map, node) + heuristic(node, goaltest) +def f(goaltest, map, node): #funkcja zwracająca sumę funkcji kosztu oraz heurestyki + return cost(map, node) + heuristic(goaltest, node) def goal_test(elem, goaltest): #funkcja sprawdzająca czy położenie wózka równa się położeniu punktu docelowego, jeśli tak zwraca prawdę, w przeciwnym wypadku fałsz if elem.get_x() == goaltest[0] and elem.get_y() == goaltest[1]: return True else: return False -def graphsearch(fringe, explored, istate, succ, goaltest, f, map): #przeszukiwanie grafu wszerz +def graphsearch(explored, f, fringe, goaltest, istate, map, succ): #przeszukiwanie grafu wszerz node = Node(None, istate.get_direction(), None, istate.get_x(), istate.get_y()) #wierzchołek początkowy, stworzony ze stanu początkowego wózka fringe.append((node, 0)) #wierzchołki do odwiedzenia z priorytetem while True: @@ -79,7 +79,7 @@ def graphsearch(fringe, explored, istate, succ, goaltest, f, map): #przeszukiwan for (x, y) in explored: explored_tuple.append((x.get_direction(), x.get_x(), x.get_y())) x = Node(action, state[0], elem[0], state[1], state[2]) #stworzenie nowego wierzchołka, którego rodzicem jest elem - p = f(map, x, goaltest) #liczy priorytet + p = f(goaltest, map, x) #liczy priorytet if state not in fringe_tuple and state not in explored_tuple: #jeżeli stan nie znajduje się na fringe oraz nie znajduje się w liście wierzchołków odwiedzonych fringe.append((x, p)) #dodanie wierzchołka na fringe fringe = sorted(fringe, key=itemgetter(1)) #sortowanie fringe'a według priorytetu @@ -93,7 +93,7 @@ def graphsearch(fringe, explored, istate, succ, goaltest, f, map): #przeszukiwan fringe = sorted(fringe, key=itemgetter(1)) #sortowanie fringe'a według priorytetu break i = i + 1 -def heuristic(node, goaltest): #funkcja heurestyki : oszacowuje koszt osiągnięcia stanu końcowego (droga) +def heuristic(goaltest, node): #funkcja heurestyki : oszacowuje koszt osiągnięcia stanu końcowego (droga) return abs(node.get_x() - goaltest[0]) + abs(node.get_y() - goaltest[1]) def print_moves(elem): #zwraca listę ruchów jakie należy wykonać by dotrzeć do punktu docelowego moves_list = [] diff --git a/cart.py b/cart.py index 22accce..1f151ef 100644 --- a/cart.py +++ b/cart.py @@ -48,7 +48,7 @@ class Cart: return self.y def set_y(self, y): self.y = y - def do_work(self, map1, station1, cart_rect): #jaką pracę wózek ma wykonać na danym polu, na którym aktualnie przebywa (zmienia stan logiczny danego pola) + def do_work(self, cart_rect, map1, station1): #jaką pracę wózek ma wykonać na danym polu, na którym aktualnie przebywa (zmienia stan logiczny danego pola) loop = True if self.get_all_amount_of_seeds() == 0: loop = False @@ -125,7 +125,7 @@ class Cart: field.get_soil().set_water_level(False) field.get_soil().set_state(False) self.set_collected_plants("wheat", self.get_collected_plants("wheat") + 1) - def handle_movement(self, move, cart_rect): #odpowiada za poruszanie się wózka po mapie + def handle_movement(self, cart_rect, move): #odpowiada za poruszanie się wózka po mapie if self.get_fuel() > 0: if move == "move": self.move() diff --git a/graph.py b/graph.py index 27c23c5..a0b82cd 100644 --- a/graph.py +++ b/graph.py @@ -44,12 +44,12 @@ class Node: #wierzchołek grafu return self.y def set_y(self, y): self.y = y -def goal_test(elem, goaltest): #funkcja sprawdzająca czy położenie wózka równa się położeniu punktu docelowego, jeśli tak zwraca prawdę, w przeciwnym wypadku fałsz +def goal_test(goaltest, elem): #funkcja sprawdzająca czy położenie wózka równa się położeniu punktu docelowego, jeśli tak zwraca prawdę, w przeciwnym wypadku fałsz if elem.get_x() == goaltest[0] and elem.get_y() == goaltest[1]: return True else: return False -def graphsearch(fringe, explored, istate, succ, goaltest): #przeszukiwanie grafu wszerz +def graphsearch(explored, fringe, goaltest, istate, succ): #przeszukiwanie grafu wszerz node = Node(None, istate.get_direction(), None, istate.get_x(), istate.get_y()) #wierzchołek początkowy, stworzony ze stanu początkowego wózka fringe.append(node) #wierzchołki do odwiedzenia while True: @@ -57,7 +57,7 @@ def graphsearch(fringe, explored, istate, succ, goaltest): #przeszukiwanie grafu return False elem = fringe.pop(0) #zdejmujemy wierzchołek z kolejki fringe i rozpatrujemy go temp = copy.copy(elem) - if goal_test(elem, goaltest) is True: #jeżeli osiągniemy cel w trakcie przeszukiwania grafu wszerz (wjedziemy na pole docelowe) : zwracamy listę ruchów, po których wykonaniu dotrzemy na miejsce + if goal_test(goaltest, elem) is True: #jeżeli osiągniemy cel w trakcie przeszukiwania grafu wszerz (wjedziemy na pole docelowe) : zwracamy listę ruchów, po których wykonaniu dotrzemy na miejsce return print_moves(elem) explored.append(elem) #dodajemy wierzchołek do listy wierzchołków odwiedzonych for (action, state) in succ(temp): #iterujemy po wszystkich możliwych akcjach i stanach otrzymanych dla danego wierzchołka grafu diff --git a/neuralnetwork.py b/neuralnetwork.py index 9660659..bd03f16 100644 --- a/neuralnetwork.py +++ b/neuralnetwork.py @@ -55,7 +55,7 @@ def create_neural_network(): images_path = glob.glob(pred_path+'/*.jpg') pred_dict = {} for i in images_path: - pred_dict[i[i.rfind('/') + 1:]] = prediction1(i, transformer1, model, classes) + pred_dict[i[i.rfind('/') + 1:]] = prediction1(classes, i, model, transformer1) print(pred_dict) else: model = ConvNet(num_classes=6).to(device) @@ -93,11 +93,11 @@ def create_neural_network(): _, prediction = torch.max(outputs.data, 1) test_accuracy += int(torch.sum(prediction == labels.data)) test_accuracy = test_accuracy / test_count - print('Epoch: ' + str(epoch) + ' Train Loss: ' + str(train_loss) + ' Train Accuracy: ' + str(train_accuracy) + ' Test Accuracy: ' + str(test_accuracy)) + print('Epoch: ' + str(epoch + 1) + ' Train Loss: ' + str(train_loss) + ' Train Accuracy: ' + str(train_accuracy) + ' Test Accuracy: ' + str(test_accuracy)) if test_accuracy > best_accuracy: torch.save(model.state_dict(), 'resources/neural_network/checkpoint.model') best_accuracy = test_accuracy -def prediction1(img_path, transformer, model, classes): +def prediction1(classes, img_path, model, transformer): image = Image.open(img_path) image_tensor = transformer(image).float() image_tensor = image_tensor.unsqueeze_(0) diff --git a/plant.py b/plant.py index 6a5e1b4..8d7d5d6 100644 --- a/plant.py +++ b/plant.py @@ -12,12 +12,12 @@ class Plant: def set_state(self, state): self.state = state @staticmethod - def get_mature_plant(map1, cart): #pobiera współrzędne jakiejś dojrzałej rośliny + def get_mature_plant(map): #pobiera współrzędne jakiejś dojrzałej rośliny x = -1 y = -1 for i in range(definitions.WIDTH_AMOUNT): for j in range(definitions.HEIGHT_AMOUNT): - field = map1.get_fields()[i][j] + field = map.get_fields()[i][j] if field.get_plant().get_name() == "beetroot" and field.get_plant().get_state() == definitions.BEETROOTS_MAXIMUM_STATE: x = i y = j @@ -36,11 +36,10 @@ class Plant: else: return x, y @staticmethod - def grow_plants( - map1): #metoda statyczna, która zwiększa pole state (etap rozwoju rośliny) dla danej rośliny na danym polu o 1 + def grow_plants(map): #metoda statyczna, która zwiększa pole state (etap rozwoju rośliny) dla danej rośliny na danym polu o 1 for i in range(definitions.WIDTH_AMOUNT): for j in range(definitions.HEIGHT_AMOUNT): - field = map1.get_fields()[i][j] + field = map.get_fields()[i][j] if field.get_plant().get_name() == "beetroot" and field.get_plant().get_state() > 0 and field.get_plant().get_state() < definitions.BEETROOTS_MAXIMUM_STATE: field.get_plant().set_state(field.get_plant().get_state() + 1) elif field.get_plant().get_name() == "carrot" and field.get_plant().get_state() > 0 and field.get_plant().get_state() < definitions.CARROTS_MAXIMUM_STATE: @@ -50,10 +49,10 @@ class Plant: elif field.get_plant().get_name() == "wheat" and field.get_plant().get_state() > 0 and field.get_plant().get_state() < definitions.WHEAT_MAXIMUM_STATE: field.get_plant().set_state(field.get_plant().get_state() + 1) @staticmethod - def if_any_mature_plant(map1): #sprawdza czy na polu występuje choć jedna dojrzała roślina, jeśli tak zwraca prawdę, w przeciwnym razie zwraca fałsz + def if_any_mature_plant(map): #sprawdza czy na polu występuje choć jedna dojrzała roślina, jeśli tak zwraca prawdę, w przeciwnym razie zwraca fałsz for i in range(definitions.WIDTH_AMOUNT): for j in range(definitions.HEIGHT_AMOUNT): - field = map1.get_fields()[i][j] + field = map.get_fields()[i][j] if field.get_plant().get_name() == "beetroot" and field.get_plant().get_state() == definitions.BEETROOTS_MAXIMUM_STATE: return True elif field.get_plant().get_name() == "carrot" and field.get_plant().get_state() == definitions.CARROTS_MAXIMUM_STATE: diff --git a/py.py b/py.py index e3b3590..bb5cee2 100644 --- a/py.py +++ b/py.py @@ -34,15 +34,15 @@ def main(): if not move_list and plant.Plant.if_any_mature_plant(map1) is True: #jeżeli są jakieś ruchy do wykonania w move_list oraz istnieje jakaś dojrzała roślina istate = graph.Istate(cart1.get_direction(), cart1.get_x() / definitions.BLOCK_SIZE, cart1.get_y() / definitions.BLOCK_SIZE) #stan początkowy wózka (jego orientacja oraz jego aktualne współrzędne) if decision == [0]: #jeżeli decyzja jest 0 (brak powrotu do stacji) to uprawiaj pole - move_list = (astar.graphsearch([], [], istate, graph.succ, plant.Plant.get_mature_plant(map1, istate), astar.f, map1)) #lista z ruchami, które należy po kolei wykonać, astar + move_list = (astar.graphsearch([], astar.f, [], plant.Plant.get_mature_plant(map1), istate, map1, graph.succ)) #lista z ruchami, które należy po kolei wykonać, astar else: #jeżeli decyzja jest 1 (powrót do stacji) to wróć do stacji uzupełnić zapasy - move_list = (graph.graphsearch([], [], istate, graph.succ, (0, 0))) #lista z ruchami, które należy po kolei wykonać, graphsearch + move_list = (graph.graphsearch([], [], (0, 0), istate, graph.succ)) #lista z ruchami, które należy po kolei wykonać, graphsearch elif move_list: #jeżeli move_list nie jest pusta - cart1.handle_movement(move_list.pop(0), cart1_rect) #wykonaj kolejny ruch oraz zdejmij ten ruch z początku listy + cart1.handle_movement(cart1_rect, move_list.pop(0)) #wykonaj kolejny ruch oraz zdejmij ten ruch z początku listy else: cart1.handle_movement_random(cart1_rect) #wykonuj losowe ruchy - cart1.do_work(map1, station1, cart1_rect) #wykonaj pracę na danym polu - decision = treelearn.make_decision(tree, cart1.get_all_amount_of_seeds(), cart1.get_all_collected_plants(), cart1.get_all_fertilizer(), cart1.get_fuel(), cart1.get_water_level()) #podejmij decyzję czy wracać do stacji (0 : NIE, 1 : TAK) + cart1.do_work(cart1_rect, map1, station1) #wykonaj pracę na danym polu + decision = treelearn.make_decision(cart1.get_all_amount_of_seeds(), cart1.get_all_collected_plants(), cart1.get_all_fertilizer(), cart1.get_fuel(), tree, cart1.get_water_level()) #podejmij decyzję czy wracać do stacji (0 : NIE, 1 : TAK) plant.Plant.grow_plants(map1) #zwiększ poziom dojrzałości roślin pygame.quit() if __name__ == "__main__": diff --git a/treelearn.py b/treelearn.py index 249d7bf..829eb8a 100644 --- a/treelearn.py +++ b/treelearn.py @@ -6,7 +6,7 @@ import pickle import pydotplus from sklearn import tree from sklearn.tree import DecisionTreeClassifier -def make_decision(tree, amount_of_seeds, collected_plants, fertilizer, fuel, water_level): #zwraca decyzję o powrocie do stacji (0 : NIE, 1 : TAK) +def make_decision(amount_of_seeds, collected_plants, fertilizer, fuel, tree, water_level): #zwraca decyzję o powrocie do stacji (0 : NIE, 1 : TAK) decision = tree.predict([[amount_of_seeds, collected_plants, fertilizer, fuel, water_level]]) #podejmij decyzję na podstawie aktualnych parametrów wózka o powrocie do stacji lub nie return decision def treelearn(): #zwraca utworzone drzewo decyzyjne