Compare commits

...

108 Commits

Author SHA1 Message Date
366716a32b Merge pull request 'Merge master with genetic_algorithms branch' (#29) from genetic_algorithms into master
Reviewed-on: #29
2024-06-09 18:40:57 +02:00
99c709d271 Merge pull request 'Merge genetic_algorithms with final_show branch' (#28) from final_show into genetic_algorithms
Reviewed-on: #28
2024-06-09 18:40:24 +02:00
b78f7f5ee7 Merge pull request 'Merge genetic2 to final_show' (#27) from genetic2 into final_show
Reviewed-on: #27
2024-06-09 18:39:27 +02:00
eb2529831a This: -added goaltressure in bfs3 call in App.py -changed def value for randomGT in BFS3 in bfs.py -added more context to readme.txt 2024-06-09 18:33:50 +02:00
d61b585827 Corrected GeneticAlgorithm2 and made a GeneticAlgorithm3 and generated fields using them. Made GeneticAccuracy to check the performance of the algorithms. 2024-06-08 23:25:08 +02:00
6c86eebd89 genetic algorithm 2 with a value of None 2024-06-07 18:41:55 +02:00
da1bfe1d8f This: -changed readme.txt 2024-06-07 15:29:26 +02:00
4339284c4b This: -changed label for decision -changed goaltressure for BFS3 2024-06-07 15:01:15 +02:00
tafit0902
51a5b13669 ladowanie pola z pliku GA, rozpoznawanie zdjec na polu, decyzja o podlaniu 2024-06-07 00:02:36 +02:00
0becd1b1f6 Made genetic algorithm and made a field using it. 2024-06-06 08:35:36 +02:00
eb9744f52f Merge pull request 'refactor' (#26) from refactor into master
Reviewed-on: #26
2024-06-04 13:25:07 +02:00
ea6a9f5204 Merge pull request 'neural_network' (#25) from neural_network into refactor
Reviewed-on: #25
2024-06-04 13:23:15 +02:00
7a3c30bd2f Added some trained models. 2024-06-04 13:18:15 +02:00
53ec8e993e Merge pull request 'Merge with model for 2 crops only' (#23) from neural_network_two_crops into neural_network
Reviewed-on: #23
2024-06-04 12:45:15 +02:00
24724fb8b7 This: -added trained model for 2 crops -added way to choose which model should we use 2024-06-04 12:40:39 +02:00
16302f4d6c Merge pull request 'Merge old branches to refactor due to merge it with master' (#22) from tree into refactor
Reviewed-on: #22
2024-06-04 11:36:13 +02:00
6959afe81a Merge pull request 'This: -small refactor in print' (#21) from tree_tractor_move into tree
Reviewed-on: #21
2024-06-04 11:32:36 +02:00
58e958ac44 This: -small refactor in print 2024-06-04 11:32:07 +02:00
38c1adb054 This: -improved printing of results -fixed a bug where picking tomato fertilizer caused crash -added trained model_500_hidden.pth trained with 500 hidden layers 2024-05-27 09:01:51 +02:00
ccd1cb2359 Trained the model. 2024-05-26 18:41:55 +02:00
5d7b68fdd6 This: -removed model.pth from git tracking for now -added corn to dataset 2024-05-26 14:46:12 +02:00
34bfe78218 This: -fixed line where device for training was always cuda device 2024-05-26 14:39:05 +02:00
26c99ddc55 This: -enchanced image dataset -fixed a bug where images where not loaded -fixed a bug where tractor wasnt moving -fixed a bug where training on gpu caused a crash 2024-05-26 13:58:48 +02:00
tafit0902
d2abac6ebd roslina umiera po zlym nawiezieniu 2024-05-26 01:55:40 +02:00
tafit0902
de0740d34b losowanie bez powtorzen, poprawki w wyswieltaniu konsoli 2024-05-26 01:37:01 +02:00
tafit0902
3c6e79a1fd losowanie zdjecia dla slotu, poruszanie sie traktora, uzycie sieci 2024-05-26 01:08:47 +02:00
tafit0902
f38a52e135 dodanie podstaw sieci nuronowej 2024-05-25 02:00:19 +02:00
971746a0f8 This: -improved quality of tree visualization -fixed a bug where season cycle was not working properly 2024-05-12 22:53:41 +02:00
afae656d76 dodatkowe dane 2024-05-12 21:39:01 +02:00
9ebac46bef This: -fixed a bug where tractor_water_level and move delay was called in wrong place 2024-05-12 17:34:27 +02:00
0b494d694d This: -removed unused move in tree_move -changed display to table form in terminal -small refactoring due to code clean 2024-05-12 14:59:23 +02:00
3713ccc8ff This: -made graph bigger 2024-05-12 13:58:57 +02:00
tafit0902
7a14a94b1e traktor porusza sie po polu i decyduje czy podlac na podstawie drzewa decyzyjnego 2024-05-11 22:05:02 +02:00
7c7a485d6b Made an algorithm to generate data (treeData.py) 2024-05-11 18:30:14 +02:00
d2d7a98a84 This: -changed decision from int to string values 2024-05-11 14:30:29 +02:00
b377c5ea24 This: -added tree.png to .gitignore to prevent mistakes 2024-05-11 14:21:26 +02:00
12d2ba0d81 This: -added tree saving to .png file -added usage of decision tree -added way to get current status of all conditions -small improvements -switched off road and mud generation -changed order in .csv file to more logical 2024-05-11 14:18:40 +02:00
48b159ae02 This: -switched diseases from string to int values 2024-05-11 13:31:06 +02:00
de69592612 This: -turned off gas station drawing 2024-05-11 13:25:36 +02:00
51fe19a071 This: -switched data for tree from strings to int -broke weather atributte to temperature and rain -added waterLevel for tractor 2024-05-11 13:24:09 +02:00
f8a3156678 This: -renamed tree.py to Drzewo.py -added dataTree.csv -added basic function connected to decision tree -added required packages to readme.txt 2024-05-10 19:41:13 +02:00
e6c86e7856 This: -added readme file 2024-05-10 18:39:26 +02:00
01a3d1864b This: -added Tree.py 2024-05-10 18:34:52 +02:00
feeca26892 This: -added weather cycle 2024-05-10 18:33:38 +02:00
2b3170d10c This: -refactor few lines to disable Astar related functions and behaviour 2024-05-10 17:47:05 +02:00
d0e8a47da1 Merge pull request 'astar_temp' (#19) from astar_temp into master
Reviewed-on: #19
2024-05-10 17:34:47 +02:00
d150e9c21d Made function to test speed of A*.
Changed heuristic2.
2024-04-29 14:05:26 +02:00
c0fe5766b0 fix: brakowalo total_cost przy wylowywaniu A_star2 w App.py 2024-04-28 13:17:08 +02:00
92c893c917 This: -added road.jpg 2024-04-28 12:59:28 +02:00
7c50b44417 This: -fixed cost sum in A* -added cost of direction change for A*2 -added function to change image of visited tile -added display of total cost 2024-04-28 12:58:58 +02:00
e448c80739 This: -simplified cost taking for A* 2024-04-28 11:51:47 +02:00
eb17e42686 Merge branch 'losowanie_celu' into astar_temp 2024-04-28 11:21:09 +02:00
af15a10048 Dodanie wypisywanie kosztu do AStar1 i ustawiono staly koszt obrotu 2024-04-27 20:09:12 +02:00
tafit0902
702eff581a cel jest losowany w osobnej funkcji, dodano zdjecie stacji benzynowej jako cel trakotra 2024-04-27 00:59:48 +02:00
03434fdb79 Did heuristic2 and A_star2.
Fixed coordinate bug.
2024-04-26 16:32:50 +02:00
637b7567b4 Pierwsza wersja AStar 2024-04-25 22:56:18 +02:00
2017b89aa4 Merge pull request 'New surfaces were made (mud, dirt, stone).' (#18) from introduction_astar into astar
Reviewed-on: #18
2024-04-25 20:51:56 +02:00
ae462e2920 New surfaces were made (mud, dirt, stone).
Renamed from bfs2 to bfs3.
Added koszt to Stan and it's set automatically.
Added some ideas about A*.
2024-04-24 22:16:34 +02:00
ab14a34ecf Merge pull request 'BFS' (#17) from BFS into master
Reviewed-on: #17
2024-04-24 17:44:08 +02:00
da6b3ef067 Merge pull request 'snake_move' (#16) from snake_move into BFS
Reviewed-on: #16
2024-04-24 17:41:46 +02:00
a696da09de -Added way to clear console -Support different dimmension of grid for console 2024-04-15 11:20:47 +02:00
e0397b95a7 -Added support to precalculated BFS2 -Added way to set HydrateValue by HydrateIndex -Minor changes in Tractor.py -Added flags to make handling different BFS implements easier 2024-04-15 10:49:25 +02:00
d38c4d9593 -Added garage -Fixed bugs that were causing crashes realted to mouse position out of the window 2024-04-15 10:02:09 +02:00
a8c5b1b434 Merge pull request 'Made BFS1 and BFS3 algorithm in BFS.py file.' (#15) from algorytm_bfs2 into snake_move
Reviewed-on: #15 reviewed by Jakub Zaręba
2024-04-15 09:25:33 +02:00
63229b2c60 Made BFS1 and BFS3 algorithm in BFS.py file. 2024-04-14 21:39:04 +02:00
066894d85c Merge pull request 'ruch_traktora_po_bfs' (#14) from ruch_traktora_po_bfs into snake_move
Reviewed-on: #14
2024-04-14 19:50:30 +02:00
tafit0902
2c03c4857c poprawki 2024-04-14 00:41:18 +02:00
tafit0902
fbe6a7e386 poprawa obrotu traktora 2024-04-14 00:13:27 +02:00
tafit0902
1578dd28f9 traktor porusza sie po scieszce bfs i nawadnia na sztywno pole 2024-04-13 23:55:58 +02:00
tafit0902
eb5556e514 poprawki 2024-04-13 23:49:04 +02:00
9ca821bab8 -fixed a bug where mouse on the console would sometimes cause a crash 2024-04-13 02:09:49 +02:00
7ac1093231 -fix in gap between lines -added option to disable console 2024-04-13 01:51:52 +02:00
911876e59a -added initial_move to get all slot's hydrate stats by visiting all slots -added way to get hydrate stats for single slot -added console to print things there instead of terminal 2024-04-13 01:39:39 +02:00
2dac7c64a9 -minor changes to move action (added do_move_if_valid) 2024-04-13 00:13:51 +02:00
999f28a405 Merge pull request 'Made BFS algorithm.' (#13) from algorytm_bfs into BFS
Reviewed-on: #13 by Jakub Zaręba
2024-04-13 00:02:29 +02:00
ce698aa14a Made BFS algorithm. 2024-04-12 22:11:30 +02:00
901c246681 Merge pull request 'ruch_traktor_bfs' (#12) from ruch_traktor_bfs into BFS
Reviewed-on: #12
2024-04-12 20:44:17 +02:00
18d2fdbb49 -Fixed direction changes 2024-04-12 09:12:38 +02:00
ee2c65730d Zmiana organizacji ruchu traktora na wybieranie kierunku i ruchu w przód, jeszcze bez obrotów przed zmiana slota 2024-04-11 22:25:38 +02:00
05e028c171 Merge pull request 'ram' (#11) from ram into master
Reviewed-on: #11
2024-03-25 10:01:36 +01:00
a5691816ac -Merged classes slot and roslina. -Added function to display current status of plant. 2024-03-24 23:30:02 +01:00
4c9bbed441 Wprowadzono poprawki do klas Roslina, Stan oraz Akcja. 2024-03-24 19:19:49 +01:00
be47ed188f dodado akcje do osprzetu i lekkie poprawki w klasie Akcja 2024-03-24 13:10:02 +01:00
tafit0902
17f6f36e77 dodanie klasy srodek oraz akcja 2024-03-24 12:31:56 +01:00
tafit0902
81ebfc91b6 komentarze i wyrzucenie chroby wirusowej 2024-03-24 12:17:44 +01:00
tafit0902
3fb9b77d38 poprawki 2024-03-24 12:01:41 +01:00
f2539c9fd0 Merge pull request 'traktor_osprzet' (#9) from traktor_osprzet into ram
Reviewed-on: #9
2024-03-24 11:58:35 +01:00
tafit0902
30d81744cf dodanie wiecej srodkow 2024-03-23 23:19:38 +01:00
tafit0902
78eb846720 dodano akcje oraz srodek, przykladowe srodki tworzone w akcjach 2024-03-23 23:17:51 +01:00
25ce2bb241 usunieto plik niewazny 4 2024-03-23 21:07:56 +01:00
8c1a8cb882 usunieto plik niewazny 3 2024-03-23 21:07:40 +01:00
97214964cd usunieto plik nieważny 2024-03-23 21:07:22 +01:00
8a89bbcf1f usunieto workspace 2024-03-23 21:07:01 +01:00
c55f2b88c3 Dodano wpis do .gitignore 2024-03-23 21:04:45 +01:00
968e9641d7 traktor slot i klasa osprzet 2024-03-23 21:00:08 +01:00
24fe7c40fc Merge pull request 'Utworzono klasy Roslina oraz Stan.' (#8) from roslina&stan into ram
Reviewed-on: #8
2024-03-23 16:37:11 +01:00
fea90a983d Utworzono klasy Roslina oraz Stan. 2024-03-23 16:22:13 +01:00
47a43c5599 Merge pull request 'cleaning' (#7) from cleaning into ram
Reviewed-on: #7
2024-03-23 14:47:00 +01:00
e3b8f1c84c Removed unused variable condition from class slot 2024-03-23 14:30:36 +01:00
8d1d176d5b Added function to quickly return scaled desired plant image. 2024-03-23 13:59:24 +01:00
b345f827b3 Cleaned up main.py (by adding files app,colors,ui), added images for plants, added support for plant image in slot class, changed image loading by scaling it once at the start 2024-03-23 13:46:48 +01:00
7a03e2f254 Merge pull request 'mozliwosc maninpulowania wielkoscia kraty' (#6) from elastyczna_krata into master
Reviewed-on: #6
2024-03-19 13:29:09 +01:00
tafit0902
88367b0686 mozliwosc maninpulowania wielkoscia kraty 2024-03-11 21:24:16 +01:00
4e98ae6e87 Merge pull request 'ruch_traktora' (#5) from ruch_traktora into master
Reviewed-on: #5
2024-03-11 13:33:41 +01:00
4eaec14c77 Merge branch 'ruch_traktora' of https://git.wmi.amu.edu.pl/s481825/AI_PROJECT into ruch_traktora 2024-03-11 13:31:13 +01:00
5d259b8b06 Dodano klase Traktor i dodano podstawowy, pseudolosowy ruch 2024-03-11 13:29:02 +01:00
870bd81627 Dodano klase Traktor i dodano podstawowy, pseudolosowy ruch 2024-03-11 13:24:12 +01:00
7967449e64 Merge pull request 'Naprawiono blad polegajacy na rysowaniu jednej linijki, drobne usprawnienia komentarzy' (#3) from zarzadzanie_slotami into master
Reviewed-on: #3
2024-03-11 10:24:18 +01:00
55 changed files with 13083 additions and 105 deletions

6
.gitignore vendored
View File

@ -1 +1,5 @@
__pycache__/
__pycache__/
.idea/
tree.png
dataset/
dataset.zip

284
AStar.py Normal file
View File

@ -0,0 +1,284 @@
"""
f(n) = g(n) + h(n)
g(n) = dotychczasowy koszt -> dodać currentCost w Node lub brać koszt na nowo przy oddtawrzaniu ścieżki
h(n) = abs(state['x'] - goalTreassure[0]) + abs(state['y'] - goalTreassure[1]) -> odległość Manhatan -> można zrobić jeszcze drugą wersje gdzie mnoży się razy 5.5 ze wzgledu na średni koszt przejścia
Należy zaimplementować kolejkę priorytetową oraz zaimplementować algorytm przeszukiwania grafu stanów z uwzględnieniem kosztu za pomocą przerobienia algorytmu przeszukiwania grafu stanów
"""
import random
import pygame
import Node
import BFS
from displayControler import NUM_X, NUM_Y
from Pole import stoneList
from queue import PriorityQueue
def getRandomGoalTreasure():
while True:
goalTreasure = (random.randint(0, NUM_X - 1), random.randint(0, NUM_Y - 1)) # Współrzędne celu
if goalTreasure not in stoneList:
break
return goalTreasure
def heuristic(state, goal):
# Oblicz odległość Manhattanowską między aktualnym stanem a celem
manhattan_distance = abs(state['x'] - goal[0]) + abs(state['y'] - goal[1])
return manhattan_distance
'''def get_cost_for_plant(plant_name):
plant_costs = {
"pszenica": 7,
"kukurydza": 9,
"ziemniak": 2,
"slonecznik": 5,
"borowka": 3,
"winogrono": 4,
"mud": 15,
"dirt": 0,
}
if plant_name in plant_costs:
return plant_costs[plant_name]
else:
# Jeśli nazwa rośliny nie istnieje w słowniku, zwróć domyślną wartość
return 0
'''
def A_star(istate, pole, goalTreasure):
# goalTreasure = (random.randint(0,NUM_X-1), random.randint(0,NUM_Y-1))
# #jeśli chcemy używać random musimy wykreslić sloty z kamieniami, ponieważ tez mogą się wylosować i wtedy traktor w ogóle nie rusza
#lub zrobić to jakoś inaczej, np. funkcja szukająca najmniej nawodnionej rośliny
# przeniesione wyżej do funkcji getRandomGoalTreasure, wykorzystywana jest w App.py
# while True:
# goalTreasure = (random.randint(0, NUM_X - 1), random.randint(0, NUM_Y - 1)) # Współrzędne celu
# if goalTreasure not in stoneList:
# break
fringe = PriorityQueue() # Kolejka priorytetowa dla wierzchołków do rozpatrzenia
explored = [] # Lista odwiedzonych stanów
obrot = 1
# Tworzenie węzła początkowego
x = Node.Node(istate)
x.g = 0
x.h = heuristic(x.state, goalTreasure)
fringe.put((x.g + x.h, x)) # Dodanie węzła do kolejki
total_cost = 0
while not fringe.empty():
_, elem = fringe.get() # Pobranie węzła z najniższym priorytetem
if BFS.goalTest3(elem.state, goalTreasure): # Sprawdzenie, czy osiągnięto cel
path = []
cost_list=[]
while elem.parent is not None: # Odtworzenie ścieżki
path.append([elem.parent, elem.action])
elem = elem.parent
for node, action in path:
# Obliczanie kosztu ścieżki dla każdego pola i wyświetlanie
plant_cost = get_plant_name_and_cost_from_coordinates(node.state['x'],node.state['y'], pole)
if action == "left" or action == "right": # Liczenie kosztu tylko dla pól nie będących obrotami
total_cost += obrot
cost_list.append(obrot)
else:
total_cost += plant_cost
cost_list.append(plant_cost)
return path,cost_list,total_cost
explored.append(elem.state)
for resp in succ3A(elem.state):
child_state = resp[1]
if child_state not in explored:
child = Node.Node(child_state)
child.parent = elem
child.action = resp[0]
# Pobranie nazwy rośliny z danego slotu na podstawie współrzędnych
plant_cost = get_plant_name_and_cost_from_coordinates(child_state['x'], child_state['y'], pole)
# Pobranie kosztu dla danej rośliny
#plant_cost = get_cost_for_plant(plant_name)
if child.action == "left" or child.action == "right":
child.g = elem.g + obrot
else:
child.g = elem.g + plant_cost
# Obliczenie heurystyki dla dziecka
child.h = heuristic(child.state, goalTreasure)
in_fringe = False
for priority, item in fringe.queue:
if item.state == child.state:
in_fringe = True
if priority > child.g + child.h:
# Jeśli znaleziono węzeł w kolejce o gorszym priorytecie, zastąp go nowym
fringe.queue.remove((priority, item))
fringe.put((child.g + child.h, child))
break
if not in_fringe:
# Jeśli stan dziecka nie jest w kolejce, dodaj go do kolejki
fringe.put((child.g + child.h, child))
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
return False
def get_plant_name_and_cost_from_coordinates(x, y, pole):
if (x, y) in pole.slot_dict: # Sprawdzenie, czy podane współrzędne znajdują się na polu
slot = pole.slot_dict[(x, y)] # Pobranie slotu na podstawie współrzędnych
if slot.plant: # Sprawdzenie, czy na slocie znajduje się roślina
return slot.plant.stan.koszt # Zwrócenie nazwy rośliny na slocie
else:
return 0 # jeśli na slocie nie ma rośliny
else:
return 0 # jeśli podane współrzędne są poza polem
#to ogólnie identyczna funkcja jak w BFS ale nie chciałam tam ruszać, żeby przypadkiem nie zapsuć do BFS,
#tylko musiałam dodac sprawdzenie kolizji, bo traktor brał sloty z Y których nie ma na planszy
def succ3A(state):
resp = []
if state["direction"] == "N":
if state["y"] > 0 and (state['x'], state["y"] - 1) not in stoneList:
resp.append(["forward", {'x': state["x"], 'y': state["y"]-1, 'direction': state["direction"]}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "E"}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "W"}])
elif state["direction"] == "S":
if state["y"] < NUM_Y - 1 and (state['x'], state["y"] + 1) not in stoneList:
resp.append(["forward", {'x': state["x"], 'y': state["y"]+1, 'direction': state["direction"]}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "W"}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "E"}])
elif state["direction"] == "E":
if state["x"] < NUM_X - 1 and (state['x'] + 1, state["y"]) not in stoneList:
resp.append(["forward", {'x': state["x"]+1, 'y': state["y"], 'direction': state["direction"]}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "S"}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "N"}])
else: #state["direction"] == "W"
if state["x"] > 0 and (state['x'] - 1, state["y"]) not in stoneList:
resp.append(["forward", {'x': state["x"]-1, 'y': state["y"], 'direction': state["direction"]}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "N"}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "S"}])
return resp
def heuristic2(state, goal):
# Oblicz odległość Manhattanowską między aktualnym stanem a celem
manhattan_distance = (abs(state['x'] - goal[0]) + abs(state['y'] - goal[1])) * 2.5
return manhattan_distance
def A_star2(istate, pole, goalTreasure):
# goalTreasure = (random.randint(0,NUM_X-1), random.randint(0,NUM_Y-1))
# #jeśli chcemy używać random musimy wykreslić sloty z kamieniami, ponieważ tez mogą się wylosować i wtedy traktor w ogóle nie rusza
#lub zrobić to jakoś inaczej, np. funkcja szukająca najmniej nawodnionej rośliny
# przeniesione wyżej do funkcji getRandomGoalTreasure, wykorzystywana jest w App.py
# while True:
# goalTreasure = (random.randint(0, NUM_X - 1), random.randint(0, NUM_Y - 1)) # Współrzędne celu
# if goalTreasure not in stoneList:
# break
fringe = PriorityQueue() # Kolejka priorytetowa dla wierzchołków do rozpatrzenia
explored = [] # Lista odwiedzonych stanów
obrot = 1
# Tworzenie węzła początkowego
x = Node.Node(istate)
x.g = 0
x.h = heuristic2(x.state, goalTreasure)
fringe.put((x.g + x.h, x)) # Dodanie węzła do kolejki
total_cost=0
while not fringe.empty():
_, elem = fringe.get() # Pobranie węzła z najniższym priorytetem
if BFS.goalTest3(elem.state, goalTreasure): # Sprawdzenie, czy osiągnięto cel
path = []
cost_list=[]
while elem.parent is not None: # Odtworzenie ścieżki
path.append([elem.parent, elem.action])
elem = elem.parent
for node, action in path:
# Obliczanie kosztu ścieżki dla każdego pola i wyświetlanie
plant_cost = get_plant_name_and_cost_from_coordinates(node.state['x'],node.state['y'], pole)
if action == "left" or action == "right": # Liczenie kosztu tylko dla pól nie będących obrotami
total_cost += obrot
cost_list.append(obrot)
else:
total_cost += plant_cost
cost_list.append(plant_cost)
return path,cost_list,total_cost
explored.append(elem.state)
for resp in succ3A(elem.state):
child_state = resp[1]
if child_state not in explored:
child = Node.Node(child_state)
child.parent = elem
child.action = resp[0]
# Pobranie nazwy rośliny z danego slotu na podstawie współrzędnych
plant_cost = get_plant_name_and_cost_from_coordinates(child_state['x'], child_state['y'], pole)
if child.action == "left" or child.action == "right":
child.g = elem.g + obrot
else:
child.g = elem.g + plant_cost
# Obliczenie heurystyki dla dziecka
child.h = heuristic2(child.state, goalTreasure)
in_fringe = False
for priority, item in fringe.queue:
if item.state == child.state:
in_fringe = True
if priority > child.g + child.h:
# Jeśli znaleziono węzeł w kolejce o gorszym priorytecie, zastąp go nowym
fringe.queue.remove((priority, item))
fringe.put((child.g + child.h, child))
break
if not in_fringe:
# Jeśli stan dziecka nie jest w kolejce, dodaj go do kolejki
fringe.put((child.g + child.h, child))
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
return False
"""
TO TEST SPEED OF ASTAR
test_speed = False
if test_speed:
time1 = 0
time2 = 0
cost1 = 0
cost2 = 0
for i in range(500):
print(i)
start = time.time()
aStarRoot, cost_list, total_cost = AStar.A_star({'x': 0, 'y': 0, 'direction': "E"}, pole, goalTreasure)
end = time.time()
time1 += end - start
cost1 += total_cost
start = time.time()
aStarRoot2, cost_list, total_cost = AStar.A_star2({'x': 0, 'y': 0, 'direction': "E"}, pole, goalTreasure)
end = time.time()
time2 += end - start
cost2 += total_cost
print(time1, time2)
print(float(cost1 / 1000), float(cost2 / 1000))
"""

47
Akcja.py Normal file
View File

@ -0,0 +1,47 @@
import Srodek
#w przyszłości trzeba przenieść definicję środków do innego pliku inicjalizującego
class Akcja:
srodki = [] #lista obiektów klasy Srodek
benefits = [] #lista przechowująca benefity płynące z wykonania akcji
def __init__(self, typ):
self.typ = typ
if self.typ == "nawodnienie":
self.srodki.append(Srodek.Srodek(1, "woda", "woda"))
self.srodki.append(Srodek.Srodek(1.5, "powerade", "woda")) #nawadnia lepiej niż woda
self.benefits.append(typ)
self.benefits.append(100)
if self.typ == "zyznosc":
self.srodki.append(Srodek.Srodek(2, "obornik", "nawoz"))
self.srodki.append(Srodek.Srodek(3, "azotan", "nawoz"))
self.srodki.append(Srodek.Srodek(4, "wapno", "nawoz"))
self.srodki.append(Srodek.Srodek(5, "superfosfat", "nawoz"))
self.benefits.append(typ)
self.benefits.append(100)
if self.typ == "wzrost":
self.srodki.append(Srodek.Srodek(6, "witaminy", "odzywka"))
self.srodki.append(Srodek.Srodek(7, "aminokwasy", "odzywka"))
self.srodki.append(Srodek.Srodek(8, "algi morskie", "odzywka"))
self.benefits.append(typ)
self.benefits.append(20)
if self.typ == "grzyb":
self.srodki.append(Srodek.Srodek(9, "mankozeb", "ochrona"))
self.srodki.append(Srodek.Srodek(10, "czosnek", "ochrona")) #tak czosnek zabija grzyby
self.benefits.append("choroba")
self.benefits.append("brak")
if self.typ == "bakteria":
self.srodki.append(Srodek.Srodek(11, "miedź", "ochrona"))
self.srodki.append(Srodek.Srodek(12, "streptomycyna ", "ochrona"))
self.benefits.append("choroba")
self.benefits.append("brak")
if self.typ == "pasożyt":
self.srodki.append(Srodek.Srodek(13, "Cyjantraniliprol", "ochrona"))
self.srodki.append(Srodek.Srodek(14, "Permetryna", "ochrona"))
self.srodki.append(Srodek.Srodek(15, "Abamektyna", "ochrona"))
self.benefits.append("choroba")
self.benefits.append("brak")
def getBenefit(self):
return self.benefits

189
App.py Normal file

File diff suppressed because one or more lines are too long

267
BFS.py Normal file
View File

@ -0,0 +1,267 @@
import random
import pygame
import Node
from displayControler import NUM_X, NUM_Y
from Pole import stoneList
def goalTest1(hIndex):
for i in list(hIndex.values()):
if i == 0:
return False
return True
def succ1(state):
resp = []
hIndex = state["hydradeIndex"].copy()
if state["direction"] == "N":
if state["y"] > 0:
if hIndex[state["x"], state["y"]-1] == 0:
hIndex[state["x"], state["y"] - 1] = 1
resp.append(["forward", {'x': state["x"], 'y': state["y"]-1, 'direction': state["direction"], 'hydradeIndex': hIndex}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "E", 'hydradeIndex': state["hydradeIndex"].copy()}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "W", 'hydradeIndex': state["hydradeIndex"].copy()}])
elif state["direction"] == "S":
if state["y"] < NUM_Y-1:
if hIndex[state["x"], state["y"]+1] == 0:
hIndex[state["x"], state["y"] + 1] = 1
resp.append(["forward", {'x': state["x"], 'y': state["y"]+1, 'direction': state["direction"], 'hydradeIndex': hIndex}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "W", 'hydradeIndex': state["hydradeIndex"].copy()}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "E", 'hydradeIndex': state["hydradeIndex"].copy()}])
elif state["direction"] == "E":
if state["x"] < NUM_X-1:
if hIndex[state["x"]+1, state["y"]] == 0:
hIndex[state["x"] + 1, state["y"]] = 1
resp.append(["forward", {'x': state["x"]+1, 'y': state["y"], 'direction': state["direction"], 'hydradeIndex': hIndex}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "S", 'hydradeIndex': state["hydradeIndex"].copy()}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "N", 'hydradeIndex': state["hydradeIndex"].copy()}])
else: #state["zwrot"] == "W"
if state["x"] > 0:
if hIndex[state["x"]-1, state["y"]] == 0:
hIndex[state["x"] - 1, state["y"]] = 1
resp.append(["forward", {'x': state["x"]-1, 'y': state["y"], 'direction': state["direction"], 'hydradeIndex': hIndex}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "N", 'hydradeIndex': state["hydradeIndex"].copy()}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "S", 'hydradeIndex': state["hydradeIndex"].copy()}])
return resp
def check1(tab, state):
for i in tab:
if i.state == state:
return False
return True
def BFS1(istate):
fringe = []
explored = []
x = Node.Node(istate)
fringe.append(x)
while True:
if fringe == []:
return False
elem = fringe.pop(0)
if goalTest1(elem.state["hydradeIndex"]):
x = elem
tab = []
while x.parent != None:
tab.append([x.parent, x.action])
x = x.parent
return tab
explored.append(elem)
for resp in succ1(elem.state):
if check1(fringe, resp[1]) and check1(explored, resp[1]):
x = Node.Node(resp[1])
x.parent = elem
x.action = resp[0]
fringe.append(x)
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
def goalTest3(state, goalTreassure):
if state["x"] == goalTreassure[0] and state["y"] == goalTreassure[1]:
return True
return False
def succ3(state):
resp = []
if state["direction"] == "N":
if state["y"] > 0 and (state['x'], state["y"] - 1) not in stoneList:
resp.append(["forward", {'x': state["x"], 'y': state["y"]-1, 'direction': state["direction"]}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "E"}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "W"}])
elif state["direction"] == "S":
if state["y"] < NUM_Y - 1 and (state['x'], state["y"] + 1) not in stoneList:
resp.append(["forward", {'x': state["x"], 'y': state["y"]+1, 'direction': state["direction"]}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "W"}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "E"}])
elif state["direction"] == "E":
if state["x"] < NUM_X - 1 and (state['x'] + 1, state["y"]) not in stoneList:
resp.append(["forward", {'x': state["x"]+1, 'y': state["y"], 'direction': state["direction"]}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "S"}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "N"}])
else: #state["zwrot"] == "W"
if state["x"] > 0 and (state['x'] - 1, state["y"]) not in stoneList:
resp.append(["forward", {'x': state["x"]-1, 'y': state["y"], 'direction': state["direction"]}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "N"}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "S"}])
return resp
def check3(tab, state):
for i in tab:
if i.state == state:
return False
return True
def BFS3(istate,GT):
randomGT=False
if(randomGT==True):
goalTreassuere = (random.randint(0,NUM_X-1), random.randint(0,NUM_Y-1))
else:
goalTreassuere=GT
print(goalTreassuere)
fringe = []
explored = []
x = Node.Node(istate)
fringe.append(x)
while True:
if fringe == []:
return False
elem = fringe.pop(0)
if goalTest3(elem.state, goalTreassuere):
x = elem
tab = []
while x.parent != None:
tab.append([x.parent, x.action])
x = x.parent
return tab
explored.append(elem)
for resp in succ3(elem.state):
if check3(fringe, resp[1]) and check3(explored, resp[1]):
x = Node.Node(resp[1])
x.parent = elem
x.action = resp[0]
fringe.append(x)
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
"""
def goalTest(hIndex):
for i in list(hIndex.values()):
if i == 0:
return False
return True
def succ(state):
resp = []
hIndex = state["hydradeIndex"].copy()
if state["direction"] == "N":
if state["y"] > 0:
if hIndex[state["x"], state["y"]-1] == 0:
hIndex[state["x"], state["y"] - 1] = 1
resp.append(["forward", {'x': state["x"], 'y': state["y"]-1, 'direction': state["direction"], 'hydradeIndex': hIndex}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "E", 'hydradeIndex': state["hydradeIndex"].copy()}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "W", 'hydradeIndex': state["hydradeIndex"].copy()}])
elif state["direction"] == "S":
if state["y"] < dCon.NUM_Y-1:
if hIndex[state["x"], state["y"]+1] == 0:
hIndex[state["x"], state["y"] + 1] = 1
resp.append(["forward", {'x': state["x"], 'y': state["y"]+1, 'direction': state["direction"], 'hydradeIndex': hIndex}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "W", 'hydradeIndex': state["hydradeIndex"].copy()}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "E", 'hydradeIndex': state["hydradeIndex"].copy()}])
elif state["direction"] == "E":
if state["x"] < dCon.NUM_X-1:
if hIndex[state["x"]+1, state["y"]] == 0:
hIndex[state["x"] + 1, state["y"]] = 1
resp.append(["forward", {'x': state["x"]+1, 'y': state["y"], 'direction': state["direction"], 'hydradeIndex': hIndex}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "S", 'hydradeIndex': state["hydradeIndex"].copy()}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "N", 'hydradeIndex': state["hydradeIndex"].copy()}])
else: #state["direction"] == "W"
if state["x"] > 0:
if hIndex[state["x"]-1, state["y"]] == 0:
hIndex[state["x"] - 1, state["y"]] = 1
resp.append(["forward", {'x': state["x"]-1, 'y': state["y"], 'direction': state["direction"], 'hydradeIndex': hIndex}])
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "N", 'hydradeIndex': state["hydradeIndex"].copy()}])
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "S", 'hydradeIndex': state["hydradeIndex"].copy()}])
return resp
def check(tab, state):
for i in tab:
if i.state == state:
return False
return True
def BFS(istate):
fringe = []
explored = []
x = Node.Node(istate)
fringe.append(x)
while True:
if fringe == []:
return False
elem = fringe.pop(0)
if goalTest(elem.state["hydradeIndex"]):
x = elem
tab = []
while x.parent != None:
tab.append(x.action)
x = x.parent
return tab
explored.append(elem)
for resp in succ(elem.state):
if check(fringe, resp[1]) and check(explored, resp[1]):
x = Node.Node(resp[1])
x.parent = elem
x.action = resp[0]
fringe.append(x)
"""

49
Climate.py Normal file
View File

@ -0,0 +1,49 @@
#THESE DICTIONARIES ARE USED FOR DISPLAY AND FOR DOCUMENTATION PURPOSES
seasons={
0:"zima",
1:"wiosna",
2:"lato",
3:"jesien"}
time={
0:"rano",
1:"poludnie",
2:"wieczor",
3:"noc"}
rain={
0:"brak",
1:"lekki deszcz",
2:"normalny deszcz",
3:"ulewa"
}
temperature={
0:"bardzo zimno",
1:"zimno",
2:"przecietnie",
3:"cieplo",
4:"upal",}
def getNextSeason(season):
if(season==3):
return 0
else:
return season+1
def getNextTime(currentTime):
if(currentTime==3):
return 0
else:
return currentTime+1
def getAmount(type):
if(type=="seasons"):
return len(seasons)
if(type=="rain"):
return len(rain)
if(type=="time"):
return len(time)
if(type=="temperature"):
return len(temperature)

14
Colors.py Normal file
View File

@ -0,0 +1,14 @@
import random
BLACK = (0, 0, 0)
BROWN = (139, 69, 19)
WHITE = (255, 255, 255)
RED=(255,0,0)
GREEN=(0,255,0)
def random_color():
x=random.randint(0,3)
switcher={0:BROWN,
1:GREEN,
2:RED,
3:WHITE}
return switcher[x]

47
Condition.py Normal file
View File

@ -0,0 +1,47 @@
import random
import Climate
import Ui
class Condition:
def __init__(self):
self.season=self.setRandomSeason()
self.currentTime=self.setRandomTime()
self.rain=self.setRandomRain()
self.temperature=self.setRandomRain()
self.clock=0
def setRandomSeason(self):
return self.randomizer(Climate.getAmount("seasons"))
def setRandomTime(self):
return self.randomizer(Climate.getAmount("time"))
def setRandomRain(self):
return self.randomizer(Climate.getAmount("rain"))
def setRandomTemperature(self):
return self.randomizer(Climate.getAmount("temperature"))
def randomizer(self,max):
return random.randint(0,max-1)
def cycle(self):
if(self.clock==11):
self.currentTime=0
self.rain=self.setRandomRain()
self.temperature=self.setRandomTemperature()
self.season=Climate.getNextSeason(self.season)
self.clock=0
return
else:
self.currentTime=Climate.getNextTime(self.currentTime)
self.rain=self.setRandomRain()
self.temperature=self.setRandomTemperature()
self.clock=self.clock+1
def return_condition(self):
return [self.temperature,self.rain,self.season,self.currentTime]
def getCondition(self):
return ([Climate.temperature[self.temperature],Climate.rain[self.rain],Climate.seasons[self.season],Climate.time[self.currentTime]])

9219
Data/dataTree.csv Normal file

File diff suppressed because it is too large Load Diff

248
Data/dataTree2.csv Normal file
View File

@ -0,0 +1,248 @@
plant_water_level,growth,disease,fertility,tractor_water_level,temperature,rain,season,current_time,action
1,20,0,40,60,2,0,2,1,1
20,40,0,40,60,2,0,2,1,1
87,20,0,40,60,2,0,2,1,0
27,43,1,40,60,2,0,2,1,0
89,56,1,40,60,2,1,1,1,0
67,100,1,37,55,1,3,3,3,0
67,40,1,87,90,4,0,1,0,0
1,20,0,40,60,2,0,0,1,0
20,40,0,40,60,2,0,0,1,0
87,20,0,56,45,2,0,0,2,0
27,43,1,40,60,2,0,0,3,0
89,56,1,40,89,2,1,0,1,0
67,100,1,37,55,1,3,0,3,0
67,40,1,87,90,4,0,0,0,0
1,100,0,45,20,2,0,2,1,0
20,100,0,40,34,0,1,2,0,0
87,100,0,56,60,2,0,1,1,0
27,100,0,89,67,1,2,2,2,0
89,100,0,40,60,2,1,1,1,0
76,100,0,37,55,1,3,3,3,0
67,100,0,87,90,4,0,1,0,0
1,20,0,40,0,2,0,2,1,0
20,40,0,40,0,2,0,2,1,0
87,20,0,40,0,2,0,2,1,0
27,43,1,40,0,2,0,2,1,0
89,56,1,40,0,2,1,1,1,0
67,100,1,37,0,1,3,3,3,0
67,40,1,87,0,4,0,1,0,0
1,20,0,40,0,2,0,0,1,0
20,40,0,40,0,2,0,0,1,0
87,20,0,56,0,2,0,0,2,0
27,43,1,40,0,2,0,0,3,0
89,56,1,40,0,2,1,0,1,0
67,100,1,37,0,1,3,0,3,0
67,40,1,87,0,4,0,0,0,0
1,100,0,45,0,2,0,2,1,0
20,100,0,40,0,0,1,2,0,0
87,100,0,56,0,2,0,1,1,0
27,100,0,89,0,1,2,2,2,0
89,100,0,40,0,2,1,1,1,0
76,100,0,37,0,1,3,3,3,0
67,100,0,87,0,4,0,1,0,0
1,45,0,56,44,2,1,1,1,1
20,55,0,43,34,2,0,2,2,1
15,23,0,23,26,2,1,3,3,1
45,67,0,12,67,3,0,1,0,1
59,88,0,34,87,3,0,2,1,1
32,32,0,32,90,3,0,3,2,1
44,43,0,19,27,2,0,1,3,1
33,11,0,28,76,2,0,2,0,1
54,90,0,44,5,3,0,3,1,1
21,76,0,50,25,3,1,1,2,1
29,64,0,38,36,2,0,2,3,1
11,54,0,65,44,3,1,1,2,1
23,55,0,34,43,3,0,2,1,1
51,32,0,32,62,3,1,3,3,1
54,76,0,21,76,2,0,1,2,1
95,88,0,43,78,2,0,2,1,0
23,23,0,23,9,2,0,3,3,1
44,34,0,91,72,3,0,1,0,1
33,11,0,82,67,3,0,2,2,1
45,9,0,44,50,2,0,3,3,1
21,67,0,50,52,2,1,1,0,1
92,46,0,83,63,3,0,2,1,0
20,55,1,43,34,0,0,2,2,0
15,23,1,23,26,0,1,3,3,0
45,67,1,12,67,0,0,1,0,0
59,88,1,34,87,0,0,2,1,0
32,32,0,32,90,0,0,3,2,0
44,43,0,19,27,4,0,1,3,0
33,11,0,28,76,4,0,2,0,0
54,90,0,44,5,4,0,3,1,0
21,76,0,50,25,4,1,1,2,0
29,64,0,38,36,4,0,2,3,0
11,54,0,65,44,0,1,1,2,0
23,55,0,34,43,0,0,2,1,0
51,32,0,32,62,0,1,3,3,0
80,76,1,39,7,3,0,1,0,0
98,77,0,15,91,1,3,2,3,0
3,48,1,73,41,2,2,0,3,0
20,15,1,97,87,4,1,2,1,0
93,6,0,37,0,0,1,0,1,0
4,31,0,1,5,2,3,1,2,0
42,52,0,33,19,3,2,3,0,0
76,43,0,77,18,4,0,0,3,0
31,13,1,21,42,0,1,2,3,0
96,65,1,63,35,1,3,3,2,0
29,39,0,40,37,3,3,0,0,0
82,53,0,55,9,0,1,3,2,0
21,35,0,58,1,1,2,2,0,0
92,98,0,69,16,3,0,0,1,0
34,23,0,95,2,2,3,0,3,0
36,28,0,62,22,0,1,1,1,0
66,88,1,10,85,3,1,2,3,0
53,51,0,79,90,2,2,3,2,0
9,74,0,60,4,4,1,2,3,1
17,0,0,38,58,1,2,3,0,0
12,76,0,50,25,3,1,1,2,1
92,64,0,38,36,2,0,2,3,0
11,54,0,65,44,3,1,1,2,1
32,55,0,34,43,3,0,2,1,1
15,32,0,32,62,3,1,3,3,1
45,76,0,21,76,2,0,1,2,1
59,88,0,43,78,2,0,2,1,1
32,23,0,23,9,2,0,3,3,1
14,34,0,91,72,3,0,1,0,1
13,11,0,82,67,3,0,2,2,1
45,9,0,44,50,2,0,3,3,1
21,67,0,50,52,2,1,1,0,1
92,46,0,83,63,3,0,2,1,0
2,40,1,34,43,1,3,2,2,0
51,32,1,32,62,2,1,3,3,0
54,76,1,21,76,3,0,1,0,0
98,38,0,50,44,4,0,1,0,0
63,7,0,93,79,2,0,2,1,1
91,59,0,94,24,4,0,3,2,0
11,49,0,54,76,2,0,1,3,1
33,31,0,59,39,3,0,1,3,1
28,50,0,26,0,4,0,2,2,0
54,83,0,36,0,3,0,2,1,0
49,78,0,68,0,2,0,3,2,0
59,21,0,43,100,1,0,3,2,1
1,30,0,52,100,2,0,0,3,0
60,9,0,40,40,3,0,0,3,0
85,94,0,87,85,4,0,1,3,0
79,68,0,56,90,1,0,2,2,1
75,22,0,25,95,1,0,3,2,1
100,51,0,33,12,0,0,2,2,0
90,70,0,71,81,0,0,2,1,0
47,26,0,6,78,4,0,1,1,1
14,89,0,70,18,4,0,1,0,1
99,19,0,74,91,2,0,3,0,0
18,48,0,15,32,2,0,3,0,1
5,57,0,14,34,0,1,1,3,1
22,67,0,9,5,0,1,2,2,0
95,81,0,46,86,1,1,3,1,0
39,65,0,84,0,1,1,0,0,0
84,75,0,30,0,2,1,1,1,0
86,41,0,2,67,2,1,2,2,0
64,53,0,53,47,1,1,3,3,1
69,61,0,0,73,2,1,0,0,0
94,40,1,0,18,3,1,1,2,0
62,82,1,20,50,4,1,2,3,0
57,1,1,17,92,0,1,3,2,0
80,35,1,58,45,0,0,3,1,0
30,47,1,8,47,1,0,2,1,0
82,32,0,99,39,1,3,1,3,0
20,84,0,0,51,2,3,2,3,0
42,88,0,0,54,2,2,2,0,0
66,45,0,91,10,3,2,1,0,0
81,14,0,19,55,3,0,1,2,1
74,37,0,88,78,4,0,3,2,1
89,99,0,100,60,4,0,3,3,0
15,20,0,45,11,0,0,1,3,1
92,28,0,85,90,2,0,1,1,0
55,4,0,13,95,2,0,2,1,1
2,6,0,35,0,2,0,2,0,0
61,56,0,90,0,2,0,3,0,0
76,11,0,61,10,3,0,3,1,1
26,80,0,57,9,3,0,1,2,1
40,44,0,81,8,3,0,2,3,1
50,66,0,23,7,3,0,3,0,1
48,15,0,77,6,2,0,0,1,0
11,54,0,65,44,3,3,1,2,0
23,55,0,34,43,3,3,2,1,0
51,32,0,32,62,3,3,3,3,0
54,76,0,21,76,2,3,1,2,0
95,88,0,43,78,2,3,2,1,0
23,23,0,23,9,2,3,3,3,0
44,34,0,91,72,3,3,1,0,0
33,11,0,82,67,3,3,2,2,0
45,9,0,44,50,2,3,3,3,0
21,67,0,50,52,2,3,1,0,0
92,46,0,83,63,3,3,2,1,0
20,55,1,43,34,0,3,2,2,0
15,23,1,23,26,0,3,3,3,0
45,67,1,12,67,0,3,1,0,0
59,88,1,34,87,0,3,2,1,0
32,32,0,32,90,0,3,3,2,0
1,60,0,55,11,0,1,0,0,1
2,70,0,44,12,1,1,0,1,1
3,44,0,11,13,2,1,0,2,1
4,55,0,34,66,3,0,0,3,1
5,66,0,90,77,0,0,1,2,1
6,22,0,89,88,0,0,2,2,1
7,1,0,45,9,0,1,2,3,1
8,2,0,34,22,3,1,2,3,1
9,3,0,56,34,3,1,0,1,1
10,6,0,78,5,3,0,3,1,1
11,8,0,36,67,2,0,0,0,1
12,59,0,57,23,2,1,1,0,1
13,67,0,29,34,1,1,0,1,1
14,20,0,30,90,1,1,2,2,1
15,21,0,66,89,0,1,3,3,1
44,100,0,91,72,3,3,1,0,0
33,100,0,82,67,3,3,2,2,0
45,100,0,44,50,2,3,3,3,0
21,100,0,50,52,2,3,1,0,0
92,100,0,83,63,3,3,2,1,0
20,100,1,43,34,0,3,2,2,0
15,100,1,23,26,0,3,3,3,0
45,100,1,12,67,0,3,1,0,0
59,100,1,34,87,0,3,2,1,0
32,100,0,32,90,0,3,3,2,0
1,100,0,55,11,0,1,0,0,0
2,100,0,44,12,1,1,0,1,0
3,100,0,11,13,2,1,0,2,0
4,100,0,34,66,3,0,0,3,0
5,100,0,90,77,0,0,1,2,0
6,100,0,89,88,0,0,2,2,0
7,100,0,45,9,0,1,2,3,0
8,100,0,34,22,3,1,2,3,0
9,100,0,56,34,3,1,0,1,0
10,100,0,78,5,3,0,3,1,0
11,100,0,36,67,2,0,0,0,0
12,100,0,57,23,2,1,1,0,0
13,100,0,29,34,1,1,0,1,0
14,100,0,30,90,1,1,2,2,0
15,100,0,66,89,0,1,3,3,0
1,6,0,5,10,4,1,1,3,1
2,7,0,4,20,4,1,2,2,1
3,4,0,11,30,4,1,3,1,1
4,5,0,43,5,2,0,1,2,1
5,6,0,9,17,2,0,2,1,1
6,2,0,98,18,4,0,3,1,1
7,11,0,54,19,4,1,0,2,1
8,20,0,43,22,4,1,1,1,1
9,30,0,65,43,4,1,2,3,1
10,60,0,87,50,1,0,3,3,1
11,80,0,63,76,1,0,0,2,1
12,95,0,75,32,1,1,1,1,1
13,76,0,30,43,2,1,2,0,1
14,2,0,92,9,2,1,3,0,1
1,6,0,5,10,4,3,1,3,0
2,7,0,4,20,4,3,2,2,0
3,4,0,11,30,4,3,3,1,0
4,5,0,43,5,2,3,1,2,0
5,6,0,9,17,2,3,2,1,0
6,2,0,98,18,4,3,3,1,0
7,11,0,54,19,4,3,0,2,0
8,20,0,43,22,4,3,1,1,0
9,30,0,65,43,4,3,2,3,0
10,60,0,87,50,1,3,3,3,0
11,80,0,63,76,1,3,0,2,0
12,95,0,75,32,1,3,1,1,0
13,76,0,30,43,2,3,2,0,0
14,2,0,92,9,2,3,3,0,0
1 plant_water_level growth disease fertility tractor_water_level temperature rain season current_time action
2 1 20 0 40 60 2 0 2 1 1
3 20 40 0 40 60 2 0 2 1 1
4 87 20 0 40 60 2 0 2 1 0
5 27 43 1 40 60 2 0 2 1 0
6 89 56 1 40 60 2 1 1 1 0
7 67 100 1 37 55 1 3 3 3 0
8 67 40 1 87 90 4 0 1 0 0
9 1 20 0 40 60 2 0 0 1 0
10 20 40 0 40 60 2 0 0 1 0
11 87 20 0 56 45 2 0 0 2 0
12 27 43 1 40 60 2 0 0 3 0
13 89 56 1 40 89 2 1 0 1 0
14 67 100 1 37 55 1 3 0 3 0
15 67 40 1 87 90 4 0 0 0 0
16 1 100 0 45 20 2 0 2 1 0
17 20 100 0 40 34 0 1 2 0 0
18 87 100 0 56 60 2 0 1 1 0
19 27 100 0 89 67 1 2 2 2 0
20 89 100 0 40 60 2 1 1 1 0
21 76 100 0 37 55 1 3 3 3 0
22 67 100 0 87 90 4 0 1 0 0
23 1 20 0 40 0 2 0 2 1 0
24 20 40 0 40 0 2 0 2 1 0
25 87 20 0 40 0 2 0 2 1 0
26 27 43 1 40 0 2 0 2 1 0
27 89 56 1 40 0 2 1 1 1 0
28 67 100 1 37 0 1 3 3 3 0
29 67 40 1 87 0 4 0 1 0 0
30 1 20 0 40 0 2 0 0 1 0
31 20 40 0 40 0 2 0 0 1 0
32 87 20 0 56 0 2 0 0 2 0
33 27 43 1 40 0 2 0 0 3 0
34 89 56 1 40 0 2 1 0 1 0
35 67 100 1 37 0 1 3 0 3 0
36 67 40 1 87 0 4 0 0 0 0
37 1 100 0 45 0 2 0 2 1 0
38 20 100 0 40 0 0 1 2 0 0
39 87 100 0 56 0 2 0 1 1 0
40 27 100 0 89 0 1 2 2 2 0
41 89 100 0 40 0 2 1 1 1 0
42 76 100 0 37 0 1 3 3 3 0
43 67 100 0 87 0 4 0 1 0 0
44 1 45 0 56 44 2 1 1 1 1
45 20 55 0 43 34 2 0 2 2 1
46 15 23 0 23 26 2 1 3 3 1
47 45 67 0 12 67 3 0 1 0 1
48 59 88 0 34 87 3 0 2 1 1
49 32 32 0 32 90 3 0 3 2 1
50 44 43 0 19 27 2 0 1 3 1
51 33 11 0 28 76 2 0 2 0 1
52 54 90 0 44 5 3 0 3 1 1
53 21 76 0 50 25 3 1 1 2 1
54 29 64 0 38 36 2 0 2 3 1
55 11 54 0 65 44 3 1 1 2 1
56 23 55 0 34 43 3 0 2 1 1
57 51 32 0 32 62 3 1 3 3 1
58 54 76 0 21 76 2 0 1 2 1
59 95 88 0 43 78 2 0 2 1 0
60 23 23 0 23 9 2 0 3 3 1
61 44 34 0 91 72 3 0 1 0 1
62 33 11 0 82 67 3 0 2 2 1
63 45 9 0 44 50 2 0 3 3 1
64 21 67 0 50 52 2 1 1 0 1
65 92 46 0 83 63 3 0 2 1 0
66 20 55 1 43 34 0 0 2 2 0
67 15 23 1 23 26 0 1 3 3 0
68 45 67 1 12 67 0 0 1 0 0
69 59 88 1 34 87 0 0 2 1 0
70 32 32 0 32 90 0 0 3 2 0
71 44 43 0 19 27 4 0 1 3 0
72 33 11 0 28 76 4 0 2 0 0
73 54 90 0 44 5 4 0 3 1 0
74 21 76 0 50 25 4 1 1 2 0
75 29 64 0 38 36 4 0 2 3 0
76 11 54 0 65 44 0 1 1 2 0
77 23 55 0 34 43 0 0 2 1 0
78 51 32 0 32 62 0 1 3 3 0
79 80 76 1 39 7 3 0 1 0 0
80 98 77 0 15 91 1 3 2 3 0
81 3 48 1 73 41 2 2 0 3 0
82 20 15 1 97 87 4 1 2 1 0
83 93 6 0 37 0 0 1 0 1 0
84 4 31 0 1 5 2 3 1 2 0
85 42 52 0 33 19 3 2 3 0 0
86 76 43 0 77 18 4 0 0 3 0
87 31 13 1 21 42 0 1 2 3 0
88 96 65 1 63 35 1 3 3 2 0
89 29 39 0 40 37 3 3 0 0 0
90 82 53 0 55 9 0 1 3 2 0
91 21 35 0 58 1 1 2 2 0 0
92 92 98 0 69 16 3 0 0 1 0
93 34 23 0 95 2 2 3 0 3 0
94 36 28 0 62 22 0 1 1 1 0
95 66 88 1 10 85 3 1 2 3 0
96 53 51 0 79 90 2 2 3 2 0
97 9 74 0 60 4 4 1 2 3 1
98 17 0 0 38 58 1 2 3 0 0
99 12 76 0 50 25 3 1 1 2 1
100 92 64 0 38 36 2 0 2 3 0
101 11 54 0 65 44 3 1 1 2 1
102 32 55 0 34 43 3 0 2 1 1
103 15 32 0 32 62 3 1 3 3 1
104 45 76 0 21 76 2 0 1 2 1
105 59 88 0 43 78 2 0 2 1 1
106 32 23 0 23 9 2 0 3 3 1
107 14 34 0 91 72 3 0 1 0 1
108 13 11 0 82 67 3 0 2 2 1
109 45 9 0 44 50 2 0 3 3 1
110 21 67 0 50 52 2 1 1 0 1
111 92 46 0 83 63 3 0 2 1 0
112 2 40 1 34 43 1 3 2 2 0
113 51 32 1 32 62 2 1 3 3 0
114 54 76 1 21 76 3 0 1 0 0
115 98 38 0 50 44 4 0 1 0 0
116 63 7 0 93 79 2 0 2 1 1
117 91 59 0 94 24 4 0 3 2 0
118 11 49 0 54 76 2 0 1 3 1
119 33 31 0 59 39 3 0 1 3 1
120 28 50 0 26 0 4 0 2 2 0
121 54 83 0 36 0 3 0 2 1 0
122 49 78 0 68 0 2 0 3 2 0
123 59 21 0 43 100 1 0 3 2 1
124 1 30 0 52 100 2 0 0 3 0
125 60 9 0 40 40 3 0 0 3 0
126 85 94 0 87 85 4 0 1 3 0
127 79 68 0 56 90 1 0 2 2 1
128 75 22 0 25 95 1 0 3 2 1
129 100 51 0 33 12 0 0 2 2 0
130 90 70 0 71 81 0 0 2 1 0
131 47 26 0 6 78 4 0 1 1 1
132 14 89 0 70 18 4 0 1 0 1
133 99 19 0 74 91 2 0 3 0 0
134 18 48 0 15 32 2 0 3 0 1
135 5 57 0 14 34 0 1 1 3 1
136 22 67 0 9 5 0 1 2 2 0
137 95 81 0 46 86 1 1 3 1 0
138 39 65 0 84 0 1 1 0 0 0
139 84 75 0 30 0 2 1 1 1 0
140 86 41 0 2 67 2 1 2 2 0
141 64 53 0 53 47 1 1 3 3 1
142 69 61 0 0 73 2 1 0 0 0
143 94 40 1 0 18 3 1 1 2 0
144 62 82 1 20 50 4 1 2 3 0
145 57 1 1 17 92 0 1 3 2 0
146 80 35 1 58 45 0 0 3 1 0
147 30 47 1 8 47 1 0 2 1 0
148 82 32 0 99 39 1 3 1 3 0
149 20 84 0 0 51 2 3 2 3 0
150 42 88 0 0 54 2 2 2 0 0
151 66 45 0 91 10 3 2 1 0 0
152 81 14 0 19 55 3 0 1 2 1
153 74 37 0 88 78 4 0 3 2 1
154 89 99 0 100 60 4 0 3 3 0
155 15 20 0 45 11 0 0 1 3 1
156 92 28 0 85 90 2 0 1 1 0
157 55 4 0 13 95 2 0 2 1 1
158 2 6 0 35 0 2 0 2 0 0
159 61 56 0 90 0 2 0 3 0 0
160 76 11 0 61 10 3 0 3 1 1
161 26 80 0 57 9 3 0 1 2 1
162 40 44 0 81 8 3 0 2 3 1
163 50 66 0 23 7 3 0 3 0 1
164 48 15 0 77 6 2 0 0 1 0
165 11 54 0 65 44 3 3 1 2 0
166 23 55 0 34 43 3 3 2 1 0
167 51 32 0 32 62 3 3 3 3 0
168 54 76 0 21 76 2 3 1 2 0
169 95 88 0 43 78 2 3 2 1 0
170 23 23 0 23 9 2 3 3 3 0
171 44 34 0 91 72 3 3 1 0 0
172 33 11 0 82 67 3 3 2 2 0
173 45 9 0 44 50 2 3 3 3 0
174 21 67 0 50 52 2 3 1 0 0
175 92 46 0 83 63 3 3 2 1 0
176 20 55 1 43 34 0 3 2 2 0
177 15 23 1 23 26 0 3 3 3 0
178 45 67 1 12 67 0 3 1 0 0
179 59 88 1 34 87 0 3 2 1 0
180 32 32 0 32 90 0 3 3 2 0
181 1 60 0 55 11 0 1 0 0 1
182 2 70 0 44 12 1 1 0 1 1
183 3 44 0 11 13 2 1 0 2 1
184 4 55 0 34 66 3 0 0 3 1
185 5 66 0 90 77 0 0 1 2 1
186 6 22 0 89 88 0 0 2 2 1
187 7 1 0 45 9 0 1 2 3 1
188 8 2 0 34 22 3 1 2 3 1
189 9 3 0 56 34 3 1 0 1 1
190 10 6 0 78 5 3 0 3 1 1
191 11 8 0 36 67 2 0 0 0 1
192 12 59 0 57 23 2 1 1 0 1
193 13 67 0 29 34 1 1 0 1 1
194 14 20 0 30 90 1 1 2 2 1
195 15 21 0 66 89 0 1 3 3 1
196 44 100 0 91 72 3 3 1 0 0
197 33 100 0 82 67 3 3 2 2 0
198 45 100 0 44 50 2 3 3 3 0
199 21 100 0 50 52 2 3 1 0 0
200 92 100 0 83 63 3 3 2 1 0
201 20 100 1 43 34 0 3 2 2 0
202 15 100 1 23 26 0 3 3 3 0
203 45 100 1 12 67 0 3 1 0 0
204 59 100 1 34 87 0 3 2 1 0
205 32 100 0 32 90 0 3 3 2 0
206 1 100 0 55 11 0 1 0 0 0
207 2 100 0 44 12 1 1 0 1 0
208 3 100 0 11 13 2 1 0 2 0
209 4 100 0 34 66 3 0 0 3 0
210 5 100 0 90 77 0 0 1 2 0
211 6 100 0 89 88 0 0 2 2 0
212 7 100 0 45 9 0 1 2 3 0
213 8 100 0 34 22 3 1 2 3 0
214 9 100 0 56 34 3 1 0 1 0
215 10 100 0 78 5 3 0 3 1 0
216 11 100 0 36 67 2 0 0 0 0
217 12 100 0 57 23 2 1 1 0 0
218 13 100 0 29 34 1 1 0 1 0
219 14 100 0 30 90 1 1 2 2 0
220 15 100 0 66 89 0 1 3 3 0
221 1 6 0 5 10 4 1 1 3 1
222 2 7 0 4 20 4 1 2 2 1
223 3 4 0 11 30 4 1 3 1 1
224 4 5 0 43 5 2 0 1 2 1
225 5 6 0 9 17 2 0 2 1 1
226 6 2 0 98 18 4 0 3 1 1
227 7 11 0 54 19 4 1 0 2 1
228 8 20 0 43 22 4 1 1 1 1
229 9 30 0 65 43 4 1 2 3 1
230 10 60 0 87 50 1 0 3 3 1
231 11 80 0 63 76 1 0 0 2 1
232 12 95 0 75 32 1 1 1 1 1
233 13 76 0 30 43 2 1 2 0 1
234 14 2 0 92 9 2 1 3 0 1
235 1 6 0 5 10 4 3 1 3 0
236 2 7 0 4 20 4 3 2 2 0
237 3 4 0 11 30 4 3 3 1 0
238 4 5 0 43 5 2 3 1 2 0
239 5 6 0 9 17 2 3 2 1 0
240 6 2 0 98 18 4 3 3 1 0
241 7 11 0 54 19 4 3 0 2 0
242 8 20 0 43 22 4 3 1 1 0
243 9 30 0 65 43 4 3 2 3 0
244 10 60 0 87 50 1 3 3 3 0
245 11 80 0 63 76 1 3 0 2 0
246 12 95 0 75 32 1 3 1 1 0
247 13 76 0 30 43 2 3 2 0 0
248 14 2 0 92 9 2 3 3 0 0

29
Drzewo.py Normal file
View File

@ -0,0 +1,29 @@
from sklearn import tree as skltree
import pandas,os
import matplotlib.pyplot as plt
atributes=['plant_water_level','growth','disease','fertility','tractor_water_level','temperature','rain','season','current_time'] #Columns in CSV file has to be in the same order
class Drzewo:
def __init__(self):
self.tree=self.treeLearn()
def treeLearn(self):
csvdata=pandas.read_csv('Data/dataTree2.csv')
#csvdata = pandas.read_csv('Data/dataTree2.csv')
x=csvdata[atributes]
decision=csvdata['action']
self.tree=skltree.DecisionTreeClassifier()
self.tree=self.tree.fit(x.values,decision)
def plotTree(self):
plt.figure(figsize=(20,30))
skltree.plot_tree(self.tree,filled=True,feature_names=atributes)
plt.title("Drzewo decyzyjne wytrenowane na przygotowanych danych: ")
plt.savefig('tree.png')
#plt.show()
def makeDecision(self,values):
action=self.tree.predict([values]) #0- nie podlewac, 1-podlewac
if(action==[0]):
return "Nie"
if(action==[1]):
return "Tak"

139
GeneticAccuracy.py Normal file
View File

@ -0,0 +1,139 @@
import json
import random
from displayControler import NUM_Y, NUM_X
iterat = 2500
population = 120
roulette = True
plants = ['corn', 'potato', 'tomato', 'carrot']
initial_yields = {'corn': 38, 'potato': 40, 'tomato': 43, 'carrot': 45}
yield_reduction = {
'corn': {'corn': -4.5, 'potato': -3, 'tomato': -7, 'carrot': -7},
'potato': {'corn': -7, 'potato': -5, 'tomato': -10, 'carrot': -6},
'tomato': {'corn': -4, 'potato': -5, 'tomato': -7, 'carrot': -7},
'carrot': {'corn': -11, 'potato': -5, 'tomato': -4, 'carrot': -7}
}
yield_reduction2 = {
'corn': {'corn': None, 'potato': -4, 'tomato': -2, 'carrot': -4},
'potato': {'corn': None, 'potato': -5, 'tomato': -5, 'carrot': -2},
'tomato': {'corn': -5, 'potato': -3, 'tomato': -7, 'carrot': None},
'carrot': {'corn': -3, 'potato': -6, 'tomato': -4, 'carrot': -9}
}
yield_multiplier = {'corn': 1.25, 'potato': 1.17, 'tomato': 1.22, 'carrot': 1.13}
yield_multiplier2 = {'corn': 1.25, 'potato': 1.19, 'tomato': 1.22, 'carrot': 1.15}
def calculate_yields(garden):
rows = len(garden)
cols = len(garden[0])
total_yields = 0
for i in range(rows):
for j in range(cols):
plant = garden[i][j]
yield_count = initial_yields[plant]
# Sprawdzanie sąsiadów
neighbors = [
(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)
]
for ni, nj in neighbors:
if 0 <= ni < rows and 0 <= nj < cols:
neighbor_plant = garden[ni][nj]
yield_count += yield_reduction[plant][neighbor_plant]
yield_count *= yield_multiplier[plant]
total_yields += yield_count
return total_yields
def calculate_yields2(garden):
rows = len(garden)
cols = len(garden[0])
total_yields = 0
for i in range(rows):
for j in range(cols):
plant = garden[i][j]
yield_count = initial_yields[plant]
# Sprawdzanie sąsiadów
neighbors = [
(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)
]
neighbor_flag = False
for ni, nj in neighbors:
if 0 <= ni < rows and 0 <= nj < cols:
neighbor_plant = garden[ni][nj]
if yield_reduction2[plant][neighbor_plant] is not None: # jeśli jest wartość None to plony dla tej rośliny będą wyzerowane
yield_count += yield_reduction2[plant][neighbor_plant]
else:
neighbor_flag = True
if not neighbor_flag:
yield_count *= yield_multiplier2[plant]
total_yields += yield_count
return total_yields
def generate_garden(rows=20, cols=12):
return [[random.choice(plants) for _ in range(cols)] for _ in range(rows)]
def generate_garden_with_yields(t, rows=NUM_Y, cols=NUM_X):
garden = generate_garden(rows, cols)
if t == 1:
total_yields = calculate_yields(garden)
else:
total_yields = calculate_yields2(garden)
return [garden, total_yields]
def generate():
s1 = 0
s2 = 0
n = 150
for i in range(n):
x = generate_garden_with_yields(1)
s1 += x[1]
y = generate_garden_with_yields(2)
s2 += y[1]
return [s1/n, s2/n]
data = generate()
# print(data)
# Odczyt z pliku
with open(f'pole_pop{population}_iter{iterat}_{roulette}.json', 'r') as file:
garden_data = json.load(file)
# print("Odczytane dane ogrodu:")
# for row in garden_data:
# print(row)
print("Wygenerowane przy pomocy GA: ", calculate_yields(garden_data))
print(f"Przeciętny ogród wygenerowany randomowo ma {data[0]} plonów")
print("Uśredniony przyrost plonów (ile razy więcej plonów): ", calculate_yields(garden_data)/data[0])
# Odczyt z pliku
with open(f'pole2_pop{population}_iter{iterat}_{roulette}.json', 'r') as file:
garden_data2 = json.load(file)
# print("Odczytane dane ogrodu:")
# for row in garden_data2:
# print(row)
print("Wygenerowane: przy pomocy GA2", calculate_yields2(garden_data2))
print(f"Przeciętny ogród wygenerowany randomowo ma {data[1]} plonów")
print("Uśredniony przyrost plonów (ile razy więcej plonów): ", calculate_yields2(garden_data2)/data[1])

208
GeneticAlgorithm.py Normal file
View File

@ -0,0 +1,208 @@
import copy
import json
import random
from displayControler import NUM_X, NUM_Y
# Definiowanie stałych dla roślin i plonów
plants = ['corn', 'potato', 'tomato', 'carrot']
initial_yields = {'corn': 38, 'potato': 40, 'tomato': 43, 'carrot': 45}
yield_reduction = {
'corn': {'corn': -4.5, 'potato': -3, 'tomato': -7, 'carrot': -7},
'potato': {'corn': -7, 'potato': -5, 'tomato': -10, 'carrot': -6},
'tomato': {'corn': -4, 'potato': -5, 'tomato': -7, 'carrot': -7},
'carrot': {'corn': -11, 'potato': -5, 'tomato': -4, 'carrot': -7}
}
yield_multiplier = {'corn': 1.25, 'potato': 1.17, 'tomato': 1.22, 'carrot': 1.13}
# Generowanie listy 20x12 z losowo rozmieszczonymi roślinami
def generate_garden(rows=20, cols=12):
return [[random.choice(plants) for _ in range(cols)] for _ in range(rows)]
# Funkcja do obliczania liczby plonów
def calculate_yields(garden):
rows = len(garden)
cols = len(garden[0])
total_yields = 0
for i in range(rows):
for j in range(cols):
plant = garden[i][j]
yield_count = initial_yields[plant]
# Sprawdzanie sąsiadów
neighbors = [
(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)
]
for ni, nj in neighbors:
if 0 <= ni < rows and 0 <= nj < cols:
neighbor_plant = garden[ni][nj]
yield_count += yield_reduction[plant][neighbor_plant]
yield_count *= yield_multiplier[plant]
total_yields += yield_count
return total_yields
# Funkcja do generowania planszy/ogrodu i zapisywania go jako lista z liczbą plonów
def generate_garden_with_yields(rows=NUM_Y, cols=NUM_X):
garden = generate_garden(rows, cols)
total_yields = calculate_yields(garden)
return [garden, total_yields]
# Funkcja do generowania linii cięcia i zapisywania jej jako liczba roślin w kolumnie z pierwszej planszy/ogrodu
def line():
path = []
flag = False
x = random.randint(4, 8)
position = (0, x)
path.append(position)
while not flag: # wybór punktu dopóki nie wybierze się skrajnego
# prawdopodobieństwo "ruchu" -> 0.6: w prawo, 0.2: w góre, 0.2: w dół
p = [(position[0] + 1, position[1]), (position[0], position[1] + 1), (position[0], position[1] - 1)]
w = [0.6, 0.2, 0.2]
position2 = random.choices(p, w)[0]
if position2 not in path: # sprawdzenie czy dany punkt nie był już wybrany aby nie zapętlać się
path.append(position2)
position = position2
if position[0] == NUM_X or position[1] == 0 or position[1] == NUM_Y: # sprawdzenie czy osiągnięto skrajny punkt
flag = True
info = [] # przeformatowanie sposobu zapisu na liczbę roślin w kolumnie, które będzię się dzidziczyło z pierwszej planszy/ogrodu
for i in range(len(path) - 1):
if path[i + 1][0] - path[i][0] == 1:
info.append(NUM_Y - path[i][1])
if len(info) < NUM_X: # uzupełnienie informacji o dziedziczeniu z planszy/ogrodu
if path[-1:][0][1] == 0:
x = NUM_Y
else:
x = 0
while len(info) < NUM_X:
info.append(x)
# return path, info
return info
# Funkcja do generowania potomstwa
def divide_gardens(garden1, garden2):
info = line()
new_garden1 = [[] for _ in range(NUM_Y)]
new_garden2 = [[] for _ in range(NUM_Y)]
for i in range(NUM_X):
for j in range(NUM_Y):
# do utworzonych kolumn w nowych planszach/ogrodach dodajemy dziedziczone rośliny
if j < info[i]:
new_garden1[j].append(garden1[j][i])
new_garden2[j].append(garden2[j][i])
else:
new_garden1[j].append(garden2[j][i])
new_garden2[j].append(garden1[j][i])
return [new_garden1, calculate_yields(new_garden1)], [new_garden2, calculate_yields(new_garden2)]
# Funkcja do mutacji danej planszy/ogrodu
def mutation(garden, not_used):
new_garden = copy.deepcopy(garden)
for i in range(NUM_X):
x = random.randint(0, 11) # wybieramy, w którym wierszu w i-tej kolumnie zmieniamy roślinę na inną
other_plants = [plant for plant in plants if plant != new_garden[x][i]]
new_garden[x][i] = random.choice(other_plants)
return [new_garden, calculate_yields(new_garden)]
# Funkcja do generowania pierwszego pokolenia
def generate(n):
generation = []
for i in range(n * 3):
generation.append(generate_garden_with_yields())
generation.sort(reverse=True, key=lambda x: x[1])
return generation[:n]
# Funkcja do implementacji ruletki (sposobu wyboru) - sumuje wszystkie plony generacji
def sum_yields(x):
s = 0
for i in range(len(x)):
s += x[i][1]
return s
if __name__ == '__main__':
roulette = True
attemps = 150
iterat = 2500
population = 120
best = []
for a in range(attemps):
generation = generate(population)
print(generation[0][1])
for i in range(iterat): # ile iteracji - nowych pokoleń
print(a, i)
new_generation = generation[:(population // 7)] # dziedziczenie x najlepszych osobników
j = 0
while j < (
population - (
population // 7)): # dobór reszty osobników do pełnej liczby populacji danego pokolenia
if roulette: # zasada ruletki -> "2 rzuty kulką"
s = sum_yields(generation) # suma wszystkich plnów całego pokolenia
z = []
if s == 0: # wtedy każdy osobnik ma takie same szanse
z.append(random.randint(0, population - 1))
z.append(random.randint(0, population - 1))
else:
weights = [] # wagi prawdopodobieństwa dla każdego osobnika generacji
pos = [] # numery od 0 do 49 odpowiadające numerom osobnikom w generacji
for i in range(population):
weights.append(generation[i][1] / s)
pos.append(i)
z.append(random.choices(pos, weights)[0]) # wybranie osobnika według wag prawdopodobieństwa
z.append(random.choices(pos, weights)[0]) # wybranie osobnika według wag prawdopodobieństwa
else: # metoda rankingu
z = random.sample(range(0, int(population // 1.7)), 2)
# krzyzowanie 90% szans, mutacja 10% szans
function = [divide_gardens, mutation]
weight = [0.9, 0.1]
fun = random.choices(function, weight)[0]
h = fun(generation[z[0]][0], generation[z[1]][0])
if len(h[0]) == 2:
new_generation.append(h[0])
new_generation.append(h[1])
j += 2
else:
new_generation.append(h)
j += 1
new_generation.sort(reverse=True, key=lambda x: x[1]) # sortowanie malejąco listy według wartości plonów
generation = new_generation[:population]
best.append(generation[0])
best.sort(reverse=True, key=lambda x: x[1])
# Zapis do pliku
# for i in range(len(best)):
# print(best[i][1], calculate_yields(best[i][0]))
#
#
# with open(f'pole_pop{population}_iter{iterat}_{roulette}.json', 'w') as file: # zapis planszy/ogrodu do pliku json
# json.dump(best[0][0], file, indent=4)
#
# print("Dane zapisane do pliku")
# Odczyt z pliku
# with open(f'pole_pop{population}_iter{iterat}_{roulette}.json', 'r') as file:
# garden_data = json.load(file)
#
# print("Odczytane dane ogrodu:")
# for row in garden_data:
# print(row)
#
# print(calculate_yields(garden_data))
# if best[0][0] == garden_data:
# print("POPRAWNE: ", calculate_yields(garden_data), calculate_yields(best[0][0]))

213
GeneticAlgorithm2.py Normal file
View File

@ -0,0 +1,213 @@
import copy
import json
import random
from displayControler import NUM_X, NUM_Y
# Definiowanie stałych dla roślin i plonów
plants = ['corn', 'potato', 'tomato', 'carrot']
initial_yields = {'corn': 38, 'potato': 40, 'tomato': 43, 'carrot': 45}
yield_reduction = {
'corn': {'corn': None, 'potato': -4, 'tomato': -2, 'carrot': -4},
'potato': {'corn': None, 'potato': -5, 'tomato': -5, 'carrot': -2},
'tomato': {'corn': -5, 'potato': -3, 'tomato': -7, 'carrot': None},
'carrot': {'corn': -3, 'potato': -6, 'tomato': -4, 'carrot': -9}
}
yield_multiplier = {'corn': 1.25, 'potato': 1.19, 'tomato': 1.22, 'carrot': 1.15}
# Generowanie listy 20x12 z losowo rozmieszczonymi roślinami
def generate_garden(rows=20, cols=12):
return [[random.choice(plants) for _ in range(cols)] for _ in range(rows)]
# Funkcja do obliczania liczby plonów
def calculate_yields(garden):
rows = len(garden)
cols = len(garden[0])
total_yields = 0
for i in range(rows):
for j in range(cols):
plant = garden[i][j]
yield_count = initial_yields[plant]
# Sprawdzanie sąsiadów
neighbors = [
(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)
]
neighbor_flag = False
for ni, nj in neighbors:
if 0 <= ni < rows and 0 <= nj < cols:
neighbor_plant = garden[ni][nj]
if yield_reduction[plant][neighbor_plant] is not None: # jeśli jest wartość None to plony dla tej rośliny będą wyzerowane
yield_count += yield_reduction[plant][neighbor_plant]
else:
neighbor_flag = True
if not neighbor_flag:
yield_count *= yield_multiplier[plant]
total_yields += yield_count
return total_yields
# Funkcja do generowania planszy/ogrodu i zapisywania go jako lista z liczbą plonów
def generate_garden_with_yields(rows=NUM_Y, cols=NUM_X):
garden = generate_garden(rows, cols)
total_yields = calculate_yields(garden)
return [garden, total_yields]
# Funkcja do generowania linii cięcia i zapisywania jej jako liczba roślin w kolumnie z pierwszej planszy/ogrodu
def line():
path = []
flag = False
x = random.randint(4, 8)
position = (0, x)
path.append(position)
while not flag: # wybór punktu dopóki nie wybierze się skrajnego
# prawdopodobieństwo "ruchu" -> 0.6: w prawo, 0.2: w góre, 0.2: w dół
p = [(position[0] + 1, position[1]), (position[0], position[1] + 1), (position[0], position[1] - 1)]
w = [0.6, 0.2, 0.2]
position2 = random.choices(p, w)[0]
if position2 not in path: # sprawdzenie czy dany punkt nie był już wybrany aby nie zapętlać się
path.append(position2)
position = position2
if position[0] == NUM_X or position[1] == 0 or position[1] == NUM_Y: # sprawdzenie czy osiągnięto skrajny punkt
flag = True
info = [] # przeformatowanie sposobu zapisu na liczbę roślin w kolumnie, które będzię się dzidziczyło z pierwszej planszy/ogrodu
for i in range(len(path) - 1):
if path[i + 1][0] - path[i][0] == 1:
info.append(NUM_Y - path[i][1])
if len(info) < NUM_X: # uzupełnienie informacji o dziedziczeniu z planszy/ogrodu
if path[-1:][0][1] == 0:
x = NUM_Y
else:
x = 0
while len(info) < NUM_X:
info.append(x)
# return path, info
return info
# Funkcja do generowania potomstwa
def divide_gardens(garden1, garden2):
info = line()
new_garden1 = [[] for _ in range(NUM_Y)]
new_garden2 = [[] for _ in range(NUM_Y)]
for i in range(NUM_X):
for j in range(NUM_Y):
# do utworzonych kolumn w nowych planszach/ogrodach dodajemy dziedziczone rośliny
if j < info[i]:
new_garden1[j].append(garden1[j][i])
new_garden2[j].append(garden2[j][i])
else:
new_garden1[j].append(garden2[j][i])
new_garden2[j].append(garden1[j][i])
return [new_garden1, calculate_yields(new_garden1)], [new_garden2, calculate_yields(new_garden2)]
# Funkcja do mutacji danej planszy/ogrodu
def mutation(garden, not_used):
new_garden = copy.deepcopy(garden)
for i in range(NUM_X):
x = random.randint(0, 11) # wybieramy, w którym wierszu w i-tej kolumnie zmieniamy roślinę na inną
other_plants = [plant for plant in plants if plant != new_garden[x][i]]
new_garden[x][i] = random.choice(other_plants)
return [new_garden, calculate_yields(new_garden)]
# Funkcja do generowania pierwszego pokolenia
def generate(n):
generation = []
for i in range(n * 3):
generation.append(generate_garden_with_yields())
generation.sort(reverse=True, key=lambda x: x[1])
return generation[:n]
# Funkcja do implementacji ruletki (sposobu wyboru) - sumuje wszystkie plony generacji
def sum_yields(x):
s = 0
for i in range(len(x)):
s += x[i][1]
return s
if __name__ == '__main__':
roulette = True
attemps = 20
iterat = 2500
population = 120
best = []
for a in range(attemps):
generation = generate(population)
print(generation[0][1])
for i in range(iterat): # ile iteracji - nowych pokoleń
print(a, i)
new_generation = generation[:(population // 7)] # dziedziczenie x najlepszych osobników
j = 0
while j < (
population - (
population // 7)): # dobór reszty osobników do pełnej liczby populacji danego pokolenia
if roulette: # zasada ruletki -> "2 rzuty kulką"
s = sum_yields(generation) # suma wszystkich plnów całego pokolenia
z = []
if s == 0: # wtedy każdy osobnik ma takie same szanse
z.append(random.randint(0, population - 1))
z.append(random.randint(0, population - 1))
else:
weights = [] # wagi prawdopodobieństwa dla każdego osobnika generacji
pos = [] # numery od 0 do 49 odpowiadające numerom osobnikom w generacji
for i in range(population):
weights.append(generation[i][1] / s)
pos.append(i)
z.append(random.choices(pos, weights)[0]) # wybranie osobnika według wag prawdopodobieństwa
z.append(random.choices(pos, weights)[0]) # wybranie osobnika według wag prawdopodobieństwa
else: # metoda rankingu
z = random.sample(range(0, int(population // 1.7)), 2)
# krzyzowanie 90% szans, mutacja 10% szans
function = [divide_gardens, mutation]
weight = [0.9, 0.1]
fun = random.choices(function, weight)[0]
h = fun(generation[z[0]][0], generation[z[1]][0])
if len(h[0]) == 2:
new_generation.append(h[0])
new_generation.append(h[1])
j += 2
else:
new_generation.append(h)
j += 1
new_generation.sort(reverse=True, key=lambda x: x[1]) # sortowanie malejąco listy według wartości plonów
generation = new_generation[:population]
best.append(generation[0])
best.sort(reverse=True, key=lambda x: x[1])
# Zapis do pliku
# for i in range(len(best)):
# print(best[i][1], calculate_yields(best[i][0]))
#
#
# with open(f'pole2_pop{population}_iter{iterat}_{roulette}.json', 'w') as file: # zapis planszy/ogrodu do pliku json
# json.dump(best[0][0], file, indent=4)
#
# print("Dane zapisane do pliku")
#
# Odczyt z pliku
# with open(f'pole2_pop{population}_iter{iterat}_{roulette}.json', 'r') as file:
# garden_data = json.load(file)
#
# print("Odczytane dane ogrodu:")
# for row in garden_data:
# print(row)
#
# print(calculate_yields(garden_data))
# if best[0][0] == garden_data:
# print("POPRAWNE: ", calculate_yields(garden_data), calculate_yields(best[0][0]))

211
GeneticAlgorithm3.py Normal file
View File

@ -0,0 +1,211 @@
import copy
import json
import random
from displayControler import NUM_X, NUM_Y
# Definiowanie stałych dla roślin i plonów
plants = ['corn', 'potato', 'tomato', 'carrot']
initial_yields = {'corn': 38, 'potato': 40, 'tomato': 43, 'carrot': 45}
yield_reduction = {
'corn': {'corn': None, 'potato': 0, 'tomato': 0, 'carrot': 0},
'potato': {'corn': None, 'potato': 0, 'tomato': 0, 'carrot': 0},
'tomato': {'corn': 0, 'potato': 0, 'tomato': 0, 'carrot': None},
'carrot': {'corn': 0, 'potato': 0, 'tomato': 0, 'carrot': 0}
}
yield_multiplier = {'corn': 1.25, 'potato': 1.19, 'tomato': 1.22, 'carrot': 1.13}
# Generowanie listy 20x12 z losowo rozmieszczonymi roślinami
def generate_garden(rows=20, cols=12):
return [[random.choice(plants) for _ in range(cols)] for _ in range(rows)]
# Funkcja do obliczania liczby plonów
def calculate_yields(garden):
rows = len(garden)
cols = len(garden[0])
total_yields = 0
for i in range(rows):
for j in range(cols):
plant = garden[i][j]
# Sprawdzanie sąsiadów
neighbors = [
(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)
]
neighbor_flag = False
for ni, nj in neighbors:
if 0 <= ni < rows and 0 <= nj < cols:
neighbor_plant = garden[ni][nj]
if yield_reduction[plant][neighbor_plant] is None: # jeśli jest wartość None to plony dla tej rośliny będą wyzerowane
neighbor_flag = True
if not neighbor_flag:
total_yields += 1
return total_yields
# Funkcja do generowania planszy/ogrodu i zapisywania go jako lista z liczbą plonów
def generate_garden_with_yields(rows=NUM_Y, cols=NUM_X):
garden = generate_garden(rows, cols)
total_yields = calculate_yields(garden)
return [garden, total_yields]
# Funkcja do generowania linii cięcia i zapisywania jej jako liczba roślin w kolumnie z pierwszej planszy/ogrodu
def line():
path = []
flag = False
x = random.randint(4, 8)
position = (0, x)
path.append(position)
while not flag: # wybór punktu dopóki nie wybierze się skrajnego
# prawdopodobieństwo "ruchu" -> 0.6: w prawo, 0.2: w góre, 0.2: w dół
p = [(position[0] + 1, position[1]), (position[0], position[1] + 1), (position[0], position[1] - 1)]
w = [0.6, 0.2, 0.2]
position2 = random.choices(p, w)[0]
if position2 not in path: # sprawdzenie czy dany punkt nie był już wybrany aby nie zapętlać się
path.append(position2)
position = position2
if position[0] == NUM_X or position[1] == 0 or position[1] == NUM_Y: # sprawdzenie czy osiągnięto skrajny punkt
flag = True
info = [] # przeformatowanie sposobu zapisu na liczbę roślin w kolumnie, które będzię się dzidziczyło z pierwszej planszy/ogrodu
for i in range(len(path) - 1):
if path[i + 1][0] - path[i][0] == 1:
info.append(NUM_Y - path[i][1])
if len(info) < NUM_X: # uzupełnienie informacji o dziedziczeniu z planszy/ogrodu
if path[-1:][0][1] == 0:
x = NUM_Y
else:
x = 0
while len(info) < NUM_X:
info.append(x)
# return path, info
return info
# Funkcja do generowania potomstwa
def divide_gardens(garden1, garden2):
info = line()
new_garden1 = [[] for _ in range(NUM_Y)]
new_garden2 = [[] for _ in range(NUM_Y)]
for i in range(NUM_X):
for j in range(NUM_Y):
# do utworzonych kolumn w nowych planszach/ogrodach dodajemy dziedziczone rośliny
if j < info[i]:
new_garden1[j].append(garden1[j][i])
new_garden2[j].append(garden2[j][i])
else:
new_garden1[j].append(garden2[j][i])
new_garden2[j].append(garden1[j][i])
return [new_garden1, calculate_yields(new_garden1)], [new_garden2, calculate_yields(new_garden2)]
# Funkcja do mutacji danej planszy/ogrodu
def mutation(garden, not_used):
new_garden = copy.deepcopy(garden)
for i in range(NUM_X):
x = random.randint(0, 11) # wybieramy, w którym wierszu w i-tej kolumnie zmieniamy roślinę na inną
other_plants = [plant for plant in plants if plant != new_garden[x][i]]
new_garden[x][i] = random.choice(other_plants)
return [new_garden, calculate_yields(new_garden)]
# Funkcja do generowania pierwszego pokolenia
def generate(n):
generation = []
for i in range(n * 3):
generation.append(generate_garden_with_yields())
generation.sort(reverse=True, key=lambda x: x[1])
return generation[:n]
# Funkcja do implementacji ruletki (sposobu wyboru) - sumuje wszystkie plony generacji
def sum_yields(x):
s = 0
for i in range(len(x)):
s += x[i][1]
return s
if __name__ == '__main__':
roulette = True
attemps = 1
population = 120
best = []
iter = 0
for a in range(attemps):
generation = generate(population)
print(generation[0][1])
while generation[0][1] != NUM_X*NUM_Y: # ile iteracji - nowych pokoleń
iter += 1
print(iter)
print(generation[0][1])
new_generation = generation[:(population // 7)] # dziedziczenie x najlepszych osobników
j = 0
while j < (
population - (
population // 7)): # dobór reszty osobników do pełnej liczby populacji danego pokolenia
if roulette: # zasada ruletki -> "2 rzuty kulką"
s = sum_yields(generation) # suma wszystkich plnów całego pokolenia
z = []
if s == 0: # wtedy każdy osobnik ma takie same szanse
z.append(random.randint(0, population - 1))
z.append(random.randint(0, population - 1))
else:
weights = [] # wagi prawdopodobieństwa dla każdego osobnika generacji
pos = [] # numery od 0 do 49 odpowiadające numerom osobnikom w generacji
for i in range(population):
weights.append(generation[i][1] / s)
pos.append(i)
z.append(random.choices(pos, weights)[0]) # wybranie osobnika według wag prawdopodobieństwa
z.append(random.choices(pos, weights)[0]) # wybranie osobnika według wag prawdopodobieństwa
else: # metoda rankingu
z = random.sample(range(0, int(population // 1.7)), 2)
# krzyzowanie 90% szans, mutacja 10% szans
function = [divide_gardens, mutation]
weight = [0.9, 0.1]
fun = random.choices(function, weight)[0]
h = fun(generation[z[0]][0], generation[z[1]][0])
if len(h[0]) == 2:
new_generation.append(h[0])
new_generation.append(h[1])
j += 2
else:
new_generation.append(h)
j += 1
new_generation.sort(reverse=True, key=lambda x: x[1]) # sortowanie malejąco listy według wartości plonów
generation = new_generation[:population]
best.append(generation[0])
best.sort(reverse=True, key=lambda x: x[1])
# Zapis do pliku
# for i in range(len(best)):
# print(best[i][1], calculate_yields(best[i][0]))
#
#
# with open(f'pole3_pop{population}_{iter}_{roulette}.json', 'w') as file: # zapis planszy/ogrodu do pliku json
# json.dump(best[0][0], file, indent=4)
#
# print("Dane zapisane do pliku")
#
# Odczyt z pliku
# with open(f'pole3_pop{population}_{iter}_{roulette}.json', 'r') as file:
# garden_data = json.load(file)
#
# print("Odczytane dane ogrodu:")
# for row in garden_data:
# print(row)
#
# print(calculate_yields(garden_data))
# if best[0][0] == garden_data:
# print("POPRAWNE: ", calculate_yields(garden_data), calculate_yields(best[0][0]))

104
Image.py Normal file
View File

@ -0,0 +1,104 @@
import pygame
import displayControler as dCon
import random
import neuralnetwork
import os
class Image:
def __init__(self):
self.plants_image_dict={}
self.tractor_image=None
self.garage_image=None
self.stone_image=None
self.gasStation_image=None
def load_images(self):
files_plants={
0:"borowka",
1:"kukurydza",
2:"pszenica",
3:"slonecznik",
4:"winogrono",
5:"ziemniak",
6:"dirt",
7:"mud",
8:"road"}
for index in files_plants:
if index >= 6:
plant_image = pygame.image.load("images/" + files_plants[index] + ".jpg")
else:
plant_image=pygame.image.load("images/plants/"+files_plants[index]+".jpg")
plant_image=pygame.transform.scale(plant_image,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
self.plants_image_dict[files_plants[index]]=plant_image
tractor_image=pygame.image.load("images/traktor.png")
tractor_image=pygame.transform.scale(tractor_image,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
garage=pygame.image.load("images/garage.png")
self.garage_image=pygame.transform.scale(garage,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
stone=pygame.image.load("images/stone.png")
self.stone_image=pygame.transform.scale(stone,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
gasStation=pygame.image.load("images/gasStation.png")
self.gasStation_image=pygame.transform.scale(gasStation,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
def return_random_plant(self):
x=random.randint(0,5) #disabled dirt and mud generation
keys=list(self.plants_image_dict.keys())
plant=keys[x]
return (plant,self.plants_image_dict[plant])
def return_plant(self,plant_name):
return (plant_name,self.plants_image_dict[plant_name])
def return_garage(self):
return self.garage_image
def return_stone(self):
return self.stone_image
def return_gasStation(self):
return self.gasStation_image
# losowanie zdjęcia z testowego datasetu bez powtórzeń
imagePathList = []
def getRandomImageFromDataBase():
label = random.choice(neuralnetwork.labels)
folderPath = f"dataset/test/{label}"
files = os.listdir(folderPath)
random_image = random.choice(files)
imgPath = os.path.join(folderPath, random_image)
while imgPath in imagePathList:
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
label = random.choice(neuralnetwork.labels)
folderPath = f"dataset/test/{label}"
files = os.listdir(folderPath)
random_image = random.choice(files)
imgPath = os.path.join(folderPath, random_image)
imagePathList.append(imgPath)
image = pygame.image.load(imgPath)
image=pygame.transform.scale(image,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
return image, label, imgPath
def getSpedifiedImageFromDatabase(label):
folderPath = f"dataset/test/{label}"
files = os.listdir(folderPath)
random_image = random.choice(files)
imgPath = os.path.join(folderPath, random_image)
while imgPath in imagePathList:
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
label = random.choice(neuralnetwork.labels)
folderPath = f"dataset/test/{label}"
files = os.listdir(folderPath)
random_image = random.choice(files)
imgPath = os.path.join(folderPath, random_image)
imagePathList.append(imgPath)
image = pygame.image.load(imgPath)
image=pygame.transform.scale(image,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
return image, label, imgPath

13
Node.py Normal file
View File

@ -0,0 +1,13 @@
class Node:
state = None #[{stan}]
parent = None #[Node]
action = None #[Forward/Right/Left]
def __init__(self, state):
self.state = state
def __lt__(self, other):
"""
Definicja metody __lt__ (less than), która jest wymagana do porównywania obiektów typu Node.
"""
return self.g + self.h < other.g + other.h

19
Osprzet.py Normal file
View File

@ -0,0 +1,19 @@
import Akcja
class Osprzet:
def __init__(self, id, marka, model, akcje = None):
self.id = id
self.marka = marka
self.model = model
if akcje is None:
self.akcje = []
else:
self.akcje = akcje
plug = Osprzet(1,'Bomet', 'U031')
siewnik = Osprzet(2, "Amazone", "12001-C")
rozsiewacz = Osprzet(3, 'John Deere', 'TF 1500', [Akcja.Akcja("zyznosc")])
opryskiwacz = Osprzet(4, 'John Deere', 'M720', [Akcja.Akcja("grzyb"), Akcja.Akcja("bakterie"), Akcja.Akcja("nawodnienie"), Akcja.Akcja("wzrost")])
header = Osprzet(5, 'John Deere', 'X350R')
#jak istnieją jakieś bardziej profesjonalne nazwy czy lepsze to śmiało zmieńcie

94
Pole.py Normal file
View File

@ -0,0 +1,94 @@
import displayControler as dCon
import Slot
import Colors
import pygame
import time
import Ui
import math
import random
import neuralnetwork
import Image
stoneList = [(3,3), (3,4), (3,5), (3,6), (4,6), (5,6), (6,6), (7,6), (8,6), (9,6), (10,6), (11,6), (12,6), (13,6), (14,6), (15,6), (16,6), (16,7), (16,8), (16,9)]
stoneFlag = False
class Pole:
def __init__(self,screen,image_loader, gasStation = (-1, -1)):
self.screen=screen
self.slot_dict={} #Slot are stored in dictionary with key being a Tuple of x and y coordinates so top left slot key is (0,0) and value is slot object
self.ui=Ui.Ui(screen)
self.image_loader=image_loader
self.gasStation=gasStation
def get_slot_from_cord(self,coordinates):
(x_axis,y_axis)=coordinates
return self.slot_dict[(x_axis,y_axis)]
def set_slot(self,coodrinates,slot): #set slot in these coordinates
(x_axis,y_axis)=coodrinates
self.slot_dict[(x_axis,y_axis)]=slot
def get_slot_dict(self): #returns whole slot_dict
return self.slot_dict
#Draw grid and tractor (new one)
def draw_grid(self, nn=False):
for x in range(0,dCon.NUM_X): #Draw all cubes in X axis
for y in range(0,dCon.NUM_Y): #Draw all cubes in Y axis
new_slot=Slot.Slot(x,y,Colors.BROWN,self.screen,self.image_loader) #Creation of empty slot
self.set_slot((x,y),new_slot) #Adding slots to dict
slot_dict=self.get_slot_dict()
for coordinates in slot_dict:
slot_dict[coordinates].draw()
garage=self.slot_dict[(0,0)]
garage.set_garage_image()
if stoneFlag:
for i in stoneList:
st=self.slot_dict[i]
st.set_stone_image()
if self.gasStation[0] != -1:
st=self.slot_dict[self.gasStation]
st.set_gasStation_image()
def randomize_colors(self, nn = False):
pygame.display.update()
time.sleep(3)
#self.ui.render_text("Randomizing Crops")
for coordinates in self.slot_dict:
if(stoneFlag):
if( coordinates in stoneList or coordinates == self.gasStation ):
continue
if(coordinates==(0,0)):
continue
else:
self.slot_dict[coordinates].set_random_plant(nn)
def setPlantsByList(self, plantList):
pygame.display.update()
time.sleep(3)
for coordinates in self.slot_dict:
if(coordinates==(0,0)):
continue
else:
self.slot_dict[coordinates].set_specifided_plant(plantList[coordinates[1]][coordinates[0]])
def change_color_of_slot(self,coordinates,color): #Coordinates must be tuple (x,y) (left top slot has cord (0,0) ), color has to be from defined in Colors.py or custom in RGB value (R,G,B)
self.get_slot_from_cord(coordinates).color_change(color)
def get_neighbor(self, slot, dx, dy):
neighbor_x = slot.x_axis + dx
neighbor_y = slot.y_axis + dy
return self.get_slot_from_cord((neighbor_x, neighbor_y))
def is_valid_move(self, coordinates):
return coordinates in self.slot_dict
def check_collision(self,mouse_x,mouse_y):
mouse_x=math.floor(mouse_x/dCon.CUBE_SIZE)
mouse_y=math.floor(mouse_y/dCon.CUBE_SIZE)
if(mouse_x<dCon.NUM_X):
if(mouse_y<dCon.NUM_Y):
collided=self.get_slot_from_cord((mouse_x,mouse_y))
return collided.print_status()
return ""

123
Roslina.py Normal file
View File

@ -0,0 +1,123 @@
import Stan
import Srodek
import random
class Roslina:
nazwa = None #[string]
stan = None #[Stan]
srodek = None #[List<Srodek>]
"""
Nawodnienie (update co 30s):
- pszenica: -8
- kukurydza: -7
- ziemniak: -6
- słonecznik: -5
- borówka: -4
- winogrono: -4
Żyzność (update co 30s):
- pszenica: -7
- kukurydza: -4
- ziemniak: -5
- słonecznik: -3
- borówka: -5
- winogrono: -4
Wzrost (update co 30s):
- pszenica: +8
- kukurydza: +4
- ziemniak: +5
- słonecznik: +3
- borówka: +5
- winogrono: +4
Koszt (0-15):
- pszenica: 7
- kukurydza: 9
- ziemniak: 2
- słonecznik: 5
- borówka: 3
- winogrono: 4
- szuter (ścieżka): 0
- błoto: 15
def __init__(self, nazwa, stan, srodek):
self.nazwa = nazwa
self.stan = stan
self.srodek = srodek
"""
def __init__(self, nazwa):
self.nazwa = nazwa
self.stan = Stan.Stan()
if nazwa == "dirt":
self.stan.koszt = 0
self.stan.nawodnienie = 100
elif nazwa == "mud":
self.stan.koszt = 15
self.stan.nawodnienie = 100
else:
self.stan.set_random()
if nazwa == "pszenica":
self.stan.koszt = 7
elif nazwa == "kukurydza":
self.stan.koszt = 9
elif nazwa == "ziemniak":
self.stan.koszt = 2
elif nazwa == "slonecznik":
self.stan.koszt = 5
elif nazwa == "borowka":
self.stan.koszt = 3
else: # winogrono
self.stan.koszt = 4
self.srodek = None
def checkSrodek(self):
#może wykorzystać AI do porównywania zdjęć
for i in self.srodek:
for j in self.stan.akcja.srodki:
if i == j:
return i
return False
def doAkcja(self):
# sprawdza jaki srodek do danej akcji i jaki z nich może być użyty przy tej roślinie
# robi akcje
# aktualizuje dane o stanie i zdjęcie w zależności od wykonanej czynności (benefits w klasie akcja) -> (self.stan.akcja.benefits)
x = self.checkSrodek()
# robi akcje
setattr(self.stan, self.stan.akcja.benefits[0], self.stan.akcja.benefits[1])
return
def isAkcja(self):
# sprawdza czy jakaś akcja musi być wykonana, jeżeli tak, to ją wywołuje
# sprawdza czy jeszcze coś trzeba zrobić
self.stan.checkStan()
while self.stan.akcja != None:
self.doAkcja()
self.stan.checkStan()
return
def return_stan(self):
return self.stan
def return_stan_for_tree(self):
return self.stan.return_stan_for_tree()
def get_hydrate_stats(self):
return self.stan.return_hydrate()
def report_status(self):
return f"Nazwa rosliny: {self.nazwa} "+self.stan.report_all()
def return_status_tree(self):
return self.stan.return_stan_for_tree()

107
Slot.py
View File

@ -1,22 +1,107 @@
import pygame
import displayControler as dCon
import Colors
import random
import Image
import Roslina
CUBE_SIZE=128
WIDTH = 1024
HEIGHT = 512
BLACK=(0,0,0)
BORDER_COLOR=BLACK
BORDER_THICKNESS=1 #Has to be INT value
class Slot:
def __init__(self,x_axis,y_axis,color,screen): #TODO crop and related to it things handling. for now as a place holder crop=>color
def __init__(self,x_axis,y_axis,color,screen,image_loader):
self.x_axis=x_axis
self.y_axis=y_axis
self.color=color
self.plant_image = None
self.plant=None
self.screen=screen
self.field=pygame.Rect(self.x_axis*CUBE_SIZE,self.y_axis*CUBE_SIZE,CUBE_SIZE,CUBE_SIZE)
self.field=pygame.Rect(self.x_axis*dCon.CUBE_SIZE,self.y_axis*dCon.CUBE_SIZE,dCon.CUBE_SIZE,dCon.CUBE_SIZE)
self.image_loader=image_loader
self.garage_image=None
self.label = None
self.imagePath = None
def draw(self):
pygame.draw.rect(self.screen,self.color,self.field,0) #Draw field
pygame.draw.rect(self.screen,BLACK,self.field,BORDER_THICKNESS) #Draw border
pygame.draw.rect(self.screen,Colors.BROWN,self.field,0) #Draw field
pygame.draw.rect(self.screen,Colors.BLACK,self.field,BORDER_THICKNESS) #Draw border
pygame.display.update()
def redraw_image(self, destroy = True):
if destroy:
self.mark_visited()
else:
self.screen.blit(self.plant_image, (self.x_axis * dCon.CUBE_SIZE, self.y_axis * dCon.CUBE_SIZE))
pygame.draw.rect(self.screen, Colors.BLACK, self.field, BORDER_THICKNESS)
def mark_visited(self):
plant,self.plant_image=self.image_loader.return_plant('road')
self.screen.blit(self.plant_image, (self.x_axis * dCon.CUBE_SIZE, self.y_axis * dCon.CUBE_SIZE))
pygame.draw.rect(self.screen, Colors.BLACK, self.field, BORDER_THICKNESS)
def color_change(self,color):
self.color=color
self.plant=color
self.draw()
def set_random_plant(self, nn=False):
if not nn:
(plant_name,self.plant_image)=self.random_plant()
self.plant=Roslina.Roslina(plant_name)
else:
self.plant_image, self.label, self.imagePath = self.random_plant_dataset()
# print(self.plant_image)
self.plant=Roslina.Roslina(self.label)
self.set_image()
def set_specifided_plant(self, plant):
self.plant_image, self.label, self.imagePath = self.specified_plant_dataset(plant)
self.plant=Roslina.Roslina(self.label)
self.set_image()
def set_image(self):
if self.plant_image is None:
self.plant_image = self.image_loader.return_random_plant()
self.screen.blit(self.plant_image, (self.x_axis * dCon.CUBE_SIZE, self.y_axis * dCon.CUBE_SIZE))
pygame.draw.rect(self.screen, Colors.BLACK, self.field, BORDER_THICKNESS)
def set_garage_image(self):
self.plant_image=self.image_loader.return_garage()
self.screen.blit(self.plant_image, (self.x_axis * dCon.CUBE_SIZE, self.y_axis * dCon.CUBE_SIZE))
pygame.draw.rect(self.screen, Colors.BLACK, self.field, BORDER_THICKNESS)
def set_stone_image(self):
self.plant_image=self.image_loader.return_stone()
self.screen.blit(self.plant_image, (self.x_axis * dCon.CUBE_SIZE, self.y_axis * dCon.CUBE_SIZE))
pygame.draw.rect(self.screen, Colors.BLACK, self.field, BORDER_THICKNESS)
def set_gasStation_image(self):
self.plant_image=self.image_loader.return_gasStation()
self.screen.blit(self.plant_image, (self.x_axis * dCon.CUBE_SIZE, self.y_axis * dCon.CUBE_SIZE))
pygame.draw.rect(self.screen, Colors.BLACK, self.field, BORDER_THICKNESS)
def random_plant(self): #Probably will not be used later only for demo purpouse
return self.image_loader.return_random_plant()
def random_plant_dataset(self):
return Image.getRandomImageFromDataBase()
def specified_plant_dataset(self, plant):
return Image.getSpedifiedImageFromDatabase(plant)
def return_plant(self):
return self.plant
def get_hydrate_stats(self):
return self.plant.get_hydrate_stats()
def print_status(self):
return f"wspolrzedne: (X:{self.x_axis} Y:{self.y_axis}) "+self.plant.report_status()
def irrigatePlant(self):
self.plant.stan.nawodnienie = 100
def setHydrate(self,index):
if(index==0):
self.plant.stan.nawodnienie=random.randint(0,60)
elif(index==1):
self.plant.stan.nawodnienie=random.randint(61,100)
elif(index==-1):
pass
def return_stan_for_tree(self):
return self.plant.return_stan_for_tree()

5
Srodek.py Normal file
View File

@ -0,0 +1,5 @@
class Srodek:
def __init__(self, id, nazwa, typ):
self.id = id
self.nazwa = nazwa
self.typ = typ

66
Stan.py Normal file
View File

@ -0,0 +1,66 @@
import Akcja
import random
class Stan:
nawodnienie = None #[int] 0-100 (0-60: trzeba podlać), spada w zaleznosci od rosliny: aktualizowane bedzie "w tle"
zyznosc = None #[int] 0-100 (0-60: trzeba użyźnić), spada w zaleznosci od rosliny: aktualizowane bedzie "w tle"
wzrost = None #[int] 0-100 (75-100: scinanie), wzrasta w zaleznosci od rosliny: aktualizowane bedzie "w tle"
choroba = None #[int] brak-0,choroba-1
akcja = None #[Akcja]
koszt = None #[int] 0-15, im więcej tym trudniej wjechać
def __init__(self, nawodnienie, zyznosc, wzrost, choroba):
self.nawodnienie = nawodnienie
self.zyznosc = zyznosc
self.wzrost = wzrost
self.choroba = choroba
def __init__(self):
self.nawodnienie=0
def set_random(self):
self.nawodnienie=random.randint(0,100)
self.zyznosc=random.randint(0,100)
self.wzrost=random.randint(0,100)
self.choroba=random.randint(0,1)
def checkStan(self):
# sprawdza stan rośliny i podejmuje akcje jeśli potrzebna
if self.nawodnienie <= 60:
self.akcja = Akcja.Akcja("nawodnienie")
return
elif self.zyznosc <= 60:
self.akcja = Akcja.Akcja("zyznosc")
return
elif self.wzrost >= 75:
self.akcja = Akcja.Akcja("wzrost")
return
elif self.choroba != "brak":
self.akcja = Akcja.Akcja(self.choroba)
return
else:
self.akcja = None
return
def return_hydrate(self):
return self.nawodnienie
def return_disease(self):
return self.choroba
def return_disease_as_string(self):
if(self.choroba==0):
return "Zdrowa"
if(self.choroba==1):
return "Chora"
def return_stan_for_tree(self):
return [self.nawodnienie,self.wzrost,self.choroba,self.zyznosc]
def report_all(self):
return f"Nawodnienie: {self.nawodnienie} Zyznosc: {self.zyznosc} Wzrost: {self.wzrost} Choroba: {self.return_disease_as_string()}"

290
Tractor.py Normal file
View File

@ -0,0 +1,290 @@
import time
import pygame
import random
import Pole
import displayControler as dCon
import Slot
import Osprzet
import Node
import Condition
import Drzewo
import neuralnetwork as nn
condition=Condition.Condition()
drzewo=Drzewo.Drzewo()
format_string = "{:<25}{:<25}{:<25}{:<10}{:<10}{:<10}{:<25}{:<15}{:<20}{:<10}{:<15}"
format_string_nn="{:<10}{:<20}{:<20}{:<15}{:<20}"
tab = [-1, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 1, 0, 1, 1,
0, 1, 0, 1, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
class Tractor:
DIRECTION_NORTH = 'N'
DIRECTION_SOUTH = 'S'
DIRECTION_WEST = 'W'
DIRECTION_EAST = 'E'
def __init__(self,slot,screen, osprzet,clock,bfs2_flag):
self.tractor_images = {
Tractor.DIRECTION_NORTH: pygame.transform.scale(pygame.image.load('images/traktorN.png'),
(dCon.CUBE_SIZE, dCon.CUBE_SIZE)),
Tractor.DIRECTION_SOUTH: pygame.transform.scale(pygame.image.load('images/traktorS.png'),
(dCon.CUBE_SIZE, dCon.CUBE_SIZE)),
Tractor.DIRECTION_WEST: pygame.transform.scale(pygame.image.load('images/traktorW.png'),
(dCon.CUBE_SIZE, dCon.CUBE_SIZE)),
Tractor.DIRECTION_EAST: pygame.transform.scale(pygame.image.load('images/traktor.png'),
(dCon.CUBE_SIZE, dCon.CUBE_SIZE))
}
self.direction = Tractor.DIRECTION_EAST # początkowy kierunek wschód
self.current_tractor_image = self.tractor_images[self.direction]
self.screen=screen
self.slot=slot
self.osprzet = osprzet
self.clock=clock
self.slot_hydrate_dict={}
self.bfs2_flag=bfs2_flag
self.waterLevel=random.randint(0,100)
def draw_tractor(self):
self.screen.blit(self.current_tractor_image, (self.slot.x_axis * dCon.CUBE_SIZE, self.slot.y_axis * dCon.CUBE_SIZE))
pygame.display.update()
def turn_left(self):
# zmiana kierunku w lewo
direction_map = {
Tractor.DIRECTION_EAST: Tractor.DIRECTION_NORTH,
Tractor.DIRECTION_NORTH: Tractor.DIRECTION_WEST,
Tractor.DIRECTION_WEST: Tractor.DIRECTION_SOUTH,
Tractor.DIRECTION_SOUTH: Tractor.DIRECTION_EAST
}
self.direction = direction_map[self.direction]
self.current_tractor_image = self.tractor_images[self.direction]
self.draw_tractor()
def tree_move(self, pole):
drzewo.treeLearn()
drzewo.plotTree()
self.snake_move_irrigation(pole, drzewo)
def get_attributes(self):
slot_attributes=self.slot.return_stan_for_tree()
climate_attributes=condition.return_condition()
attributes=[]
attributes=attributes+slot_attributes+[self.waterLevel]+climate_attributes
return attributes
def get_attributes_for_print(self):
slot_attributes=self.slot.return_plant().return_status_tree()
climate_attributes=condition.getCondition()
slot_attributes=slot_attributes+[self.waterLevel]
return slot_attributes+climate_attributes
def turn_right(self):
# zmiana kierunku w prawo
direction_map = {
Tractor.DIRECTION_EAST: Tractor.DIRECTION_SOUTH,
Tractor.DIRECTION_SOUTH: Tractor.DIRECTION_WEST,
Tractor.DIRECTION_WEST: Tractor.DIRECTION_NORTH,
Tractor.DIRECTION_NORTH: Tractor.DIRECTION_EAST
}
self.direction = direction_map[self.direction]
self.current_tractor_image = self.tractor_images[self.direction]
self.draw_tractor()
def move_forward(self, pole, destroy = True):
next_slot_coordinates = None
if self.direction == Tractor.DIRECTION_EAST:
next_slot_coordinates = (self.slot.x_axis + 1, self.slot.y_axis)
self.current_tractor_image = self.tractor_images[self.direction]
elif self.direction == Tractor.DIRECTION_WEST:
next_slot_coordinates = (self.slot.x_axis - 1, self.slot.y_axis)
self.current_tractor_image = self.tractor_images[self.direction]
elif self.direction == Tractor.DIRECTION_SOUTH:
next_slot_coordinates = (self.slot.x_axis, self.slot.y_axis + 1)
self.current_tractor_image = self.tractor_images[self.direction]
elif self.direction == Tractor.DIRECTION_NORTH:
next_slot_coordinates = (self.slot.x_axis, self.slot.y_axis - 1)
self.current_tractor_image = self.tractor_images[self.direction]
# sprawdzenie czy następny slot jest dobry
self.do_move_if_valid(pole,next_slot_coordinates, destroy)
self.clock.tick(10)
def do_move_if_valid(self,pole, next_slot_coordinates, destroy = True):
if next_slot_coordinates and pole.is_valid_move(next_slot_coordinates):
next_slot = pole.get_slot_from_cord(next_slot_coordinates)
self.slot.redraw_image(destroy)
self.slot = next_slot
self.draw_tractor()
return True
else:
return False
def random_move(self, pole):
self.clock.tick(2)
# losowanie skrętu
turn_direction = random.choice([self.turn_left, self.turn_right])
turn_direction()
self.clock.tick(5)
# wykonanie ruchu do przodu z uwzględnieniem aktualnej orientacji
self.move_forward(pole)
def reset_pos(self,pole):
self.do_move_if_valid(pole,(0,0))
def initial_move(self,pole):
if (self.bfs2_flag==True):
index=0
for y in range (0,dCon.NUM_Y):
if(y%2==0):
for x in range(0,dCon.NUM_X):
if(pole.is_valid_move((x,y))):
pole.get_slot_from_cord((x,y)).setHydrate(tab[index])
self.snake_move(pole,x,y)
index=index+1
else:
for x in range(dCon.NUM_X,-1,-1):
if(pole.is_valid_move((x,y))):
pole.get_slot_from_cord((x,y)).setHydrate(tab[index])
self.snake_move(pole,x,y)
index=index+1
else:
for y in range (0,dCon.NUM_Y):
if(y%2==0):
for x in range(0,dCon.NUM_X):
self.snake_move(pole,x,y)
else:
for x in range(dCon.NUM_X,-1,-1):
self.snake_move(pole,x,y)
def snake_move_irrigation(self, pole, drzewo):
headers=['Wspolrzedne','Czy podlac','Poziom nawodnienia','Wzrost','Choroba','Zyznosc','Poziom wody w traktorze','Temperatura','Opady','Pora Roku','Aktualny czas']
print(format_string.format(*headers))
initPos = (self.slot.x_axis, self.slot.y_axis)
counter = 0
for i in range(initPos[1], dCon.NUM_Y):
for j in range(initPos[0], dCon.NUM_X):
attributes=self.get_attributes()
decision = drzewo.makeDecision(attributes)
self.pretty_print_tree([str("({:02d}, {:02d})").format(self.slot.x_axis, self.slot.y_axis),decision,*self.get_attributes_for_print()])
if decision == "Tak":
self.slot.irrigatePlant()
counter += 1
condition.cycle()
pygame.time.delay(50)
self.waterLevel=random.randint(0,100)
#condition.getCondition()
self.move_forward(pole, False)
if i % 2 == 0 and i != dCon.NUM_Y - 1:
self.turn_right()
self.move_forward(pole, False)
self.turn_right()
elif i != dCon.NUM_Y - 1:
self.turn_left()
self.move_forward(pole, False)
self.turn_left()
print("podlanych slotów: ", str(counter))
def snake_move_predict_plant(self, pole, model, headers, actions = None):
print(format_string_nn.format(*headers))
initPos = (self.slot.x_axis, self.slot.y_axis)
count = 0
for i in range(initPos[1], dCon.NUM_Y):
for j in range(initPos[0], dCon.NUM_X):
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
if self.slot.imagePath != None:
predictedLabel = nn.predictLabel(self.slot.imagePath, model)
#print(str("Coords: ({:02d}, {:02d})").format(self.slot.x_axis, self.slot.y_axis), "real:", self.slot.label, "predicted:", predictedLabel, "correct" if (self.slot.label == predictedLabel) else "incorrect", 'nawożę za pomocą:', nn.fertilizer[predictedLabel])
# print(format_string_nn.format(f"{self.slot.x_axis,self.slot.y_axis}",self.slot.label,predictedLabel,"correct" if (self.slot.label == predictedLabel) else "incorrect",nn.fertilizer[predictedLabel]))
for a in actions:
a(predictedLabel)
if self.slot.label != predictedLabel:
# self.slot.mark_visited()
count += 1
self.move_forward(pole, False)
if i % 2 == 0 and i != dCon.NUM_Y - 1:
self.turn_right()
self.move_forward(pole, False)
self.turn_right()
elif i != dCon.NUM_Y - 1:
self.turn_left()
self.move_forward(pole, False)
self.turn_left()
print(f"Dobrze rozpoznanych roślin: {20*12-count}, źle rozpoznanych roślin: {count}")
def fertilize_slot(self, predictedLabel):
print(format_string_nn.format(f"{self.slot.x_axis,self.slot.y_axis}",self.slot.label,predictedLabel,"correct" if (self.slot.label == predictedLabel) else "incorrect",nn.fertilizer[predictedLabel]))
if self.slot.label != predictedLabel:
self.slot.mark_visited()
def irigate_slot_NN(self, predictedLabel):
attributes=self.get_attributes()
decision = drzewo.makeDecision(attributes)
print(format_string_nn.format(f"{self.slot.x_axis,self.slot.y_axis}",self.slot.label,predictedLabel,"correct" if (self.slot.label == predictedLabel) else "incorrect",decision))
condition.cycle()
self.waterLevel = random.randint(0, 100)
def snake_move(self,pole,x,y):
next_slot_coordinates=(x,y)
if(self.do_move_if_valid(pole,next_slot_coordinates)):
if (x,y) not in Pole.stoneList:
if x == 0 and y == 0:
hydrateIndex = -1
elif pole.get_slot_from_cord((x,y)).get_hydrate_stats() < 60:
hydrateIndex = 0
else:
hydrateIndex = 1
self.slot_hydrate_dict[(x,y)]= hydrateIndex #Budowanie slownika slotow z poziomem nawodnienia dla traktorka
self.clock.tick(10)
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
def move_by_root(self, root, pole, actions = None):
for move in root:
self.slot.redraw_image()
if move[1] == 'forward':
self.move_forward(pole)
if move[1] == 'right':
self.turn_right()
if move[1] == 'left':
self.turn_left()
for a in actions:
a()
self.clock.tick(3)
#to tak zrobiłam już na później, może się przyda
def change_osprzet(self, new_osprzet):
self.osprzet = new_osprzet
def print_osprzet_info(self):
print("ID:", self.osprzet.id)
print("Marka:", self.osprzet.marka)
print("Model:", self.osprzet.model)
if self.osprzet.akcje:
print("Akcje:")
for akcja in self.osprzet.akcje:
print("- Typ:", akcja.typ)
else:
print("Brak akcji przypisanych do tego sprzętu.")
def pretty_print_tree(self,attributes):
print(format_string.format(*attributes))
def irrigateSlot(self):
try:
self.slot.irrigatePlant()
except:
pass

42
Ui.py Normal file
View File

@ -0,0 +1,42 @@
import pygame
import displayControler as dCon
import Colors
class Ui:
def __init__(self,screen):
self.screen=screen
self.font='freesansbold.ttf' #Feel free to change it :D
if(dCon.NUM_Y<7):
self.font_size=int(15)
self.line=20
self.first_line=20
if(dCon.NUM_Y>=7):
self.font_size=int(30)
self.line=30
self.first_line=30
def render_text(self,string_to_print):
font=pygame.font.Font(self.font,self.font_size)
text=font.render(string_to_print,True,Colors.BLACK,Colors.WHITE)
textRect=text.get_rect()
textRect.center=(dCon.getGameWidth() // 2,dCon.getScreenHeihgt() // 2)
self.screen.blit(text,textRect)
def render_text_to_console(self,string_to_print):
font=pygame.font.Font(self.font,self.font_size)
string_to_print=str(string_to_print)
self.break_string_to_console(string_to_print)
for string in self.to_print:
text=font.render(string,True,Colors.BLACK,Colors.WHITE)
textRect=text.get_rect()
textRect.center=(dCon.getGameWidth()+350/2,self.line)
textRect.scale_by(x=350,y=100)
self.screen.blit(text,textRect)
self.line=self.line+self.first_line
def clear_console(self):
self.line=self.first_line
pygame.draw.rect(self.screen,(0,0,0) , pygame.Rect(dCon.returnConsoleCoordinate(), 0, dCon.getConsoleWidth(), dCon.getScreenHeihgt()), 0)
def break_string_to_console(self,string_to_print):
self.to_print=string_to_print.split(" ")

37
displayControler.py Normal file
View File

@ -0,0 +1,37 @@
CUBE_SIZE = 64
NUM_X = 20
NUM_Y = 12
#returns true if tractor can move to specified slot
def isValidMove(x, y):
if x < 0 or y < 0:
return False
if x > NUM_X - 1 or y > NUM_Y - 1:
return False
return True
def getGameWidth():
return NUM_X * CUBE_SIZE
def returnConsoleCoordinate():
return NUM_X * CUBE_SIZE
def getScreenHeihgt():
return NUM_Y * CUBE_SIZE
def getScreenWidth(show_console):
screen_width=getGameWidth()
if(show_console):
screen_width=screen_width+350
return screen_width
def getConsoleWidth():
return 350
def getConsoleWidthCenter():
return getScreenWidth()+getConsoleWidth()/2

BIN
images/dirt.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

BIN
images/garage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
images/gasStation.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
images/mud.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

BIN
images/plants/borowka.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

BIN
images/plants/kukurydza.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

BIN
images/plants/pszenica.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 KiB

BIN
images/plants/winogrono.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

BIN
images/plants/ziemniak.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 MiB

BIN
images/road.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
images/stone.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 KiB

BIN
images/traktorN.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
images/traktorS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
images/traktorW.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

95
main.py
View File

@ -1,94 +1,3 @@
import pygame
import Slot
import random
import time
pygame.init()
BLACK = (0, 0, 0)
BROWN = (139, 69, 19)
WHITE = (255, 255, 255)
RED=(255,0,0)
GREEN=(0,255,0)
CUBE_SIZE = 128
NUM_X = 8
NUM_Y = 4
WIDTH = 1024
HEIGHT = 512
screen = pygame.display.set_mode((WIDTH, HEIGHT))
screen.fill(WHITE)
pygame.display.update()
SLOT_DICT={} #Slot are stored in dictionary with key being a Tuple of x and y coordinates so top left slot key is (0,0) and value is slot object
"""#Draw grid and tractor (old one)
def draw_grid():
for x in range(0, 8):
pygame.draw.line(screen, BLACK, (x*CUBE_SIZE, 0), (x*CUBE_SIZE, HEIGHT)) #We got 8 lines in Y axis so to draw them we use x from range <0,7) to make slot manage easier
for y in range(0, 4):
pygame.draw.line(screen, BLACK, (0, y*CUBE_SIZE), (WIDTH, y*CUBE_SIZE)) #We got 4 lines in X axis so to draw them we use y from range <0,4) to make slot manage easier
# Draw tractor
tractor_image = pygame.image.load('images/traktor.png')
tractor_image = pygame.transform.scale(tractor_image, (CUBE_SIZE, CUBE_SIZE))
screen.blit(tractor_image, (CUBE_SIZE - 128, CUBE_SIZE - 128))"""
def draw_tractor(): #TODO? I think we should move draw_tractor to tractor class in the future
tractor_image = pygame.image.load('images/traktor.png')
tractor_image = pygame.transform.scale(tractor_image, (CUBE_SIZE, CUBE_SIZE))
screen.blit(tractor_image, (CUBE_SIZE - 128, CUBE_SIZE - 128))
pygame.display.update()
#Draw grid and tractor (new one)
def draw_grid():
for x in range(0,WIDTH//CUBE_SIZE): #We got 8 cubes in X axis so we use for from 0 to 7 do draw them all
for y in range(0,HEIGHT//CUBE_SIZE): #We got 4 cubes in Y axis so we use for from 0 to 3 to draw them all
new_slot=Slot.Slot(x,y,BROWN,screen) #Creation of empty slot
SLOT_DICT[(x,y)]=new_slot #Adding slots to dict
for entity in SLOT_DICT:
SLOT_DICT[entity].draw() #For each slot in dictionary draw it on the screen
draw_tractor()
def change_color_of_slot(coordinates,color): #Coordinates must be tuple (x,y) x from range 0,7 and y in range 0,3 (left top slot has cord (0,0) ), color has to be from defined or custom in RGB value (R,G,B)
SLOT_DICT[coordinates].color_change(color)
def random_color():
x=random.randint(0,3)
switcher={0:BROWN,
1:GREEN,
2:RED,
3:WHITE}
return switcher[x]
#Demo purpose, can be reused for photos of crops in the future(?)
def randomize_colors():
font=pygame.font.Font('freesansbold.ttf',32)
text=font.render('Randomizing crops',True,BLACK,WHITE)
textRect=text.get_rect()
textRect.center=(WIDTH//2,HEIGHT//2)
screen.blit(text,textRect)
pygame.display.update()
time.sleep(3)
for coordinates in SLOT_DICT:
SLOT_DICT[coordinates].color_change(random_color())
draw_tractor()
def init_demo(): #Demo purpose
draw_grid()
time.sleep(2)
randomize_colors()
#Main program
init_demo()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
import App
App.init(demo=True)#DEMO=TRUE WILL INIT DEMO MODE WITH RANDOM COLOR GEN

BIN
model_2_crops.pth Normal file

Binary file not shown.

BIN
model_500_hidden.pth Normal file

Binary file not shown.

114
neuralnetwork.py Normal file
View File

@ -0,0 +1,114 @@
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import Compose, Lambda, ToTensor
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
from PIL import Image
import random
imageSize = (128, 128)
labels = ['carrot','corn', 'potato', 'tomato'] # musi być w kolejności alfabetycznej
fertilizer = {labels[0]: 'kompost', labels[1]: 'saletra amonowa', labels[2]: 'superfosfat', labels[3]:'obornik kurzy'}
#labels = ['corn','tomato'] #uncomment this two lines for 2 crops only
#fertilizer = {labels[0]: 'kompost', labels[1]: 'saletra amonowa'}
torch.manual_seed(42)
#device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device = torch.device("cpu")
# device = torch.device("mps") if torch.backends.mps.is_available() else torch.device('cpu')
# print(device)
def getTransformation():
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
transforms.Resize(imageSize),
Lambda(lambda x: x.flatten())])
return transform
def getDataset(train=True):
transform = getTransformation()
if (train):
trainset = datasets.ImageFolder(root='dataset/train', transform=transform)
return trainset
else:
testset = datasets.ImageFolder(root='dataset/test', transform=transform)
return testset
def train(model, dataset, n_iter=100, batch_size=256):
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = nn.NLLLoss()
dl = DataLoader(dataset, batch_size=batch_size)
model.train()
for epoch in range(n_iter):
for images, targets in dl:
optimizer.zero_grad()
out = model(images.to(device))
loss = criterion(out, targets.to(device))
loss.backward()
optimizer.step()
if epoch % 10 == 0:
print('epoch: %3d loss: %.4f' % (epoch, loss))
return model
def accuracy(model, dataset):
model.eval()
correct = sum([(model(images.to(device)).argmax(dim=1) == targets.to(device)).sum()
for images, targets in DataLoader(dataset, batch_size=256)])
return correct.float() / len(dataset)
def getModel():
hidden_size = 500
model = nn.Sequential(
nn.Linear(imageSize[0] * imageSize[1] * 3, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, len(labels)),
nn.LogSoftmax(dim=-1)
).to(device)
return model
def saveModel(model, path):
print("Saving model")
torch.save(model.state_dict(), path)
def loadModel(path):
print("Loading model")
model = getModel()
model.load_state_dict(torch.load(path, map_location=torch.device('cpu'))) # musiałem tutaj dodać to ładowanie z mapowaniem na cpu bo u mnie CUDA nie działa wy pewnie możecie to usunąć
return model
def trainNewModel(n_iter=100, batch_size=256):
trainset = getDataset(True)
model = getModel()
model = train(model, trainset)
return model
def predictLabel(imagePath, model):
image = Image.open(imagePath).convert("RGB")
image = preprocess_image(image)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
with torch.no_grad():
model.eval() # Ustawienie modelu w tryb ewaluacji
output = model(image)
# Znalezienie indeksu klasy o największej wartości prawdopodobieństwa
predicted_class = torch.argmax(output).item()
return labels[predicted_class]
# Znalezienie indeksu klasy o największej wartości prawdopodobieństwa
predicted_class = torch.argmax(output).item()
return labels[predicted_class]
def preprocess_image(image):
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
transform = getTransformation()
image = transform(image).unsqueeze(0) # Add batch dimension
image = image.to(device) # Move the image tensor to the same device as the model
return image

View File

@ -0,0 +1,266 @@
[
[
"tomato",
"corn",
"tomato",
"tomato",
"corn",
"tomato",
"tomato",
"corn",
"carrot",
"potato",
"potato",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato"
],
[
"corn",
"carrot",
"potato",
"potato",
"carrot",
"potato",
"potato",
"carrot",
"potato",
"potato",
"carrot",
"corn",
"tomato",
"corn",
"carrot",
"corn",
"tomato",
"corn",
"tomato",
"corn"
],
[
"carrot",
"potato",
"potato",
"carrot",
"corn",
"carrot",
"potato",
"carrot",
"potato",
"carrot",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato"
],
[
"potato",
"potato",
"carrot",
"corn",
"tomato",
"corn",
"carrot",
"corn",
"carrot",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn"
],
[
"potato",
"carrot",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato"
],
[
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn"
],
[
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato"
],
[
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn"
],
[
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"carrot",
"corn",
"tomato"
],
[
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"carrot",
"potato",
"tomato",
"potato"
],
[
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"carrot",
"corn",
"carrot",
"corn",
"carrot",
"potato",
"potato",
"tomato",
"potato"
],
[
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"corn",
"tomato",
"potato",
"potato",
"carrot",
"corn",
"tomato"
]
]

266
pole3_pop120_365_True.json Normal file
View File

@ -0,0 +1,266 @@
[
[
"potato",
"carrot",
"carrot",
"potato",
"potato",
"carrot",
"carrot",
"potato",
"tomato",
"potato",
"carrot",
"potato",
"carrot",
"potato",
"carrot",
"carrot",
"potato",
"potato",
"potato",
"carrot"
],
[
"tomato",
"potato",
"carrot",
"potato",
"tomato",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"carrot",
"carrot",
"carrot",
"carrot",
"carrot",
"carrot",
"potato",
"potato",
"carrot",
"potato"
],
[
"corn",
"carrot",
"corn",
"carrot",
"potato",
"carrot",
"carrot",
"corn",
"tomato",
"corn",
"carrot",
"potato",
"potato",
"carrot",
"carrot",
"corn",
"carrot",
"potato",
"potato",
"tomato"
],
[
"tomato",
"potato",
"carrot",
"corn",
"tomato",
"corn",
"carrot",
"carrot",
"corn",
"carrot",
"potato",
"carrot",
"carrot",
"corn",
"carrot",
"carrot",
"potato",
"potato",
"tomato",
"tomato"
],
[
"tomato",
"potato",
"carrot",
"carrot",
"corn",
"carrot",
"carrot",
"potato",
"tomato",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"carrot",
"potato",
"tomato",
"tomato",
"potato",
"potato"
],
[
"potato",
"tomato",
"potato",
"potato",
"tomato",
"corn",
"carrot",
"potato",
"potato",
"tomato",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"potato",
"tomato",
"potato",
"carrot",
"carrot"
],
[
"potato",
"potato",
"tomato",
"tomato",
"corn",
"carrot",
"carrot",
"potato",
"tomato",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"carrot",
"carrot",
"potato",
"carrot",
"carrot",
"potato"
],
[
"carrot",
"potato",
"tomato",
"potato",
"carrot",
"carrot",
"potato",
"potato",
"tomato",
"tomato",
"potato",
"carrot",
"potato",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"corn",
"carrot"
],
[
"carrot",
"potato",
"tomato",
"potato",
"carrot",
"carrot",
"carrot",
"potato",
"tomato",
"potato",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"carrot",
"carrot",
"potato",
"tomato",
"corn"
],
[
"potato",
"tomato",
"tomato",
"potato",
"carrot",
"potato",
"potato",
"carrot",
"potato",
"potato",
"carrot",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"corn",
"tomato",
"potato",
"tomato"
],
[
"potato",
"tomato",
"corn",
"tomato",
"potato",
"potato",
"potato",
"potato",
"carrot",
"carrot",
"carrot",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"carrot",
"corn",
"tomato",
"potato"
],
[
"potato",
"potato",
"carrot",
"corn",
"carrot",
"potato",
"potato",
"potato",
"carrot",
"carrot",
"carrot",
"potato",
"carrot",
"carrot",
"potato",
"carrot",
"corn",
"carrot",
"corn",
"tomato"
]
]

View File

@ -0,0 +1,266 @@
[
[
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"potato",
"potato",
"carrot",
"potato"
],
[
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"potato",
"potato",
"potato"
],
[
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"potato",
"carrot"
],
[
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato"
],
[
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"corn",
"corn",
"tomato",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot"
],
[
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato"
],
[
"corn",
"corn",
"tomato",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"corn",
"corn",
"potato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot"
],
[
"tomato",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato"
],
[
"carrot",
"potato",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"carrot"
],
[
"potato",
"potato",
"corn",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato"
],
[
"potato",
"carrot",
"tomato",
"corn",
"tomato",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"corn",
"corn",
"tomato",
"carrot",
"carrot",
"tomato",
"carrot"
],
[
"carrot",
"tomato",
"carrot",
"tomato",
"carrot",
"tomato",
"corn",
"tomato",
"carrot",
"tomato",
"corn",
"corn",
"tomato",
"corn",
"tomato",
"carrot",
"tomato",
"tomato",
"carrot",
"tomato"
]
]

24
readme.txt Normal file
View File

@ -0,0 +1,24 @@
Required packages:
pygame,matplotlib,sklearn,pandas
How to install:
pip install pygame
pip install matplotlib
pip install scikit-learn
pip install pandas
How to run:
For BFS3:
-in App.py: -change bfs3_flag to True (other flags need to be disabled) -ensure that in App.py in BFS3 you give goalTreasure
-in Image.py change range in function return_random_plant to (0,5)
For Astar:
in App.py change Astar to True (other flags need to be disabled)
-in Image.py change range in function return_random_plant to (0,7)
For Astar2:
-in App.py change Astar2 flag to True (other flags need to be disabled)
-in Image.py change range in function return_random_plant to (0,7)
For Tree:
-in App.py change TreeFlag to True (other flags need to be disabled)
-in Image.py change range in function return_random_plant to (0,5)
For neuralnetwork:
-in App.py change nnFlag to True (other flags need to be disabled)
For final_show (neuralnetwork+tree+genetic algorithm)
-in App.py change finalFlag to True (other flags need to be disabled)

Binary file not shown.

Binary file not shown.

BIN
testModels/modelMPS.pth Normal file

Binary file not shown.

BIN
testModels/modelMPS650.pth Normal file

Binary file not shown.

BIN
testModels/modelMPS_AL.pth Normal file

Binary file not shown.

87
treeData.py Normal file
View File

@ -0,0 +1,87 @@
tab = []
def iter(odp, i):
if i == 0:
j = ""
for k in range(0, 101, 28):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 1:
j = ""
for k in range(0, 101, 28):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 2:
j = ""
for k in range(2):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 3:
j = ""
for k in range(0, 101, 34):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 4:
j = ""
for k in range(0, 101, 40):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 5:
j = ""
for k in range(0, 4, 2):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 6:
j = ""
for k in range(0, 4, 2):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 7:
j = ""
for k in range(0, 4, 2):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 8:
j=""
for k in range(4):
odp += f"{k},"
odp = iter(odp, i + 1)
j = str(k)
odp = odp[:-(len(j) + 1)]
return odp
if i == 9:
global licznik
x = odp.split(",")
if (int(x[0]) > 60 or int(x[1]) > 90 or int(x[2]) == 1 or int(x[3]) > 70 or int(x[4]) <= 10 or int(x[5]) == 0 or int(x[5]) == 4 or int(x[6]) == 2 or int(x[6]) == 3 or int(x[7]) == 0 or int(x[8]) == 1):
odp += "0"
else:
odp += "1"
print(odp)
tab.append(odp)
licznik += 1
return odp[:-1]
iter("", 0)