AI_PROJECT/App.py

190 lines
20 KiB
Python
Raw Normal View History

import pygame
import Colors
import Tractor
import Pole
import time
import displayControler as dCon
import Image
2024-03-23 21:00:08 +01:00
import Osprzet
import Ui
import BFS
2024-04-25 22:56:18 +02:00
import AStar
2024-05-25 02:00:19 +02:00
import neuralnetwork
import json
bfs1_flag=False
bfs2_flag=False #Change this lines to show different bfs implementation
2024-04-25 22:56:18 +02:00
bfs3_flag=False
Astar = False
Astar2 = False
if bfs3_flag or Astar or Astar2:
2024-04-25 22:56:18 +02:00
Pole.stoneFlag = True
2024-05-25 02:00:19 +02:00
TreeFlag=False
nnFlag=False
2024-05-26 18:41:55 +02:00
newModel=False
finalFlag = True
pygame.init()
show_console=True
screen = pygame.display.set_mode((dCon.getScreenWidth(show_console), dCon.getScreenHeihgt()))
FPS=5
clock=pygame.time.Clock()
image_loader=Image.Image()
image_loader.load_images()
goalTreasure = AStar.getRandomGoalTreasure() # nie wiem czy to najlepsze miejsce, obecnie pole zawiera pole gasStation, które służy do renderowania odpowiedniego zdjęcia
pole=Pole.Pole(screen,image_loader, goalTreasure)
2024-05-25 02:00:19 +02:00
pole.draw_grid(nnFlag) #musi byc tutaj wywołane ponieważ inicjalizuje sloty do slownika
ui=Ui.Ui(screen)
2024-03-23 21:00:08 +01:00
#Tractor creation
traktor_slot = pole.get_slot_from_cord((0, 0))
traktor = Tractor.Tractor(traktor_slot, screen, Osprzet.opryskiwacz,clock,bfs2_flag)
2024-03-23 21:00:08 +01:00
def init_demo(): #Demo purpose
old_info=""
traktor.draw_tractor()
time.sleep(2)
if not finalFlag:
pole.randomize_colors(nnFlag)
else:
population = 120
iterat = 2500
roulette = True
with open(f'pole_pop{population}_iter{iterat}_{roulette}.json', 'r') as file:
garden_data = json.load(file)
pole.setPlantsByList(garden_data)
traktor.draw_tractor()
start_flag=True
while True:
clock.tick(FPS)
if(start_flag):
#ui.render_text_to_console(string_to_print="Przejazd inicjalizujacy- traktor sprawdza poziom nawodnienia")
if not bfs1_flag:
time.sleep(2)
else:
traktor.initial_move(pole)
traktor.reset_pos(pole)
clock.tick(20)
ui.clear_console()
clock.tick(20)
#ui.render_text_to_console("Obliczanie sciezki przy uzyciu BFS")
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
if(bfs1_flag):
bfsRoot1 = BFS.BFS1({"x": 0, "y": 0, "direction": "E", "hydradeIndex": traktor.slot_hydrate_dict})
#displayControler: NUM_X: 6, NUM_Y: 3 (klasyczne) CHANGE THIS BY HAND
bfsRoot1.reverse()
#print_to_console("Traktor porusza sie obliczona sciezka BFS")
traktor.move_by_root(bfsRoot1, pole, [traktor.irrigateSlot])
if(bfs2_flag):
bfsRoot2 = [[{'x': 2, 'y': 2, 'direction': 'N', 'hydradeIndex': {(0, 0): -1, (1, 0): 1, (2, 0): 1, (3, 0): 1, (4, 0): 1, (5, 0): 1, (6, 0): 1, (7, 0): 1, (8, 0): 1, (9, 0): 1, (0, 1): 1, (1, 1): 1, (2, 1): 0, (3, 1): 1, (4, 1): 1, (5, 1): 1, (6, 1): 1, (7, 1): 1, (8, 1): 1, (9, 1): 1, (0, 2): 1, (1, 2): 1, (2, 2): 1, (3, 2): 1, (4, 2): 1, (5, 2): 1, (6, 2): 1, (7, 2): 1, (8, 2): 1, (9, 2): 1, (0, 3): 1, (1, 3): 1, (2, 3): 1, (3, 3): 1, (4, 3): 1, (5, 3): 1, (6, 3): 1, (7, 3): 1, (8, 3): 1, (9, 3): 1, (0, 4): 1, (1, 4): 1, (2, 4): 1, (3, 4): 1, (4, 4): 1, (5, 4): 1, (6, 4): 1, (7, 4): 1, (8, 4): 1, (9, 4): 1}}, 'forward'], [{'x': 2, 'y': 2, 'direction': 'E', 'hydradeIndex': {(0, 0): -1, (1, 0): 1, (2, 0): 1, (3, 0): 1, (4, 0): 1, (5, 0): 1, (6, 0): 1, (7, 0): 1, (8, 0): 1, (9, 0): 1, (0, 1): 1, (1, 1): 1, (2, 1): 0, (3, 1): 1, (4, 1): 1, (5, 1): 1, (6, 1): 1, (7, 1): 1, (8, 1): 1, (9, 1): 1, (0, 2): 1, (1, 2): 1, (2, 2): 1, (3, 2): 1, (4, 2): 1, (5, 2): 1, (6, 2): 1, (7, 2): 1, (8, 2): 1, (9, 2): 1, (0, 3): 1, (1, 3): 1, (2, 3): 1, (3, 3): 1, (4, 3): 1, (5, 3): 1, (6, 3): 1, (7, 3): 1, (8, 3): 1, (9, 3): 1, (0, 4): 1, (1, 4): 1, (2, 4): 1, (3, 4): 1, (4, 4): 1, (5, 4): 1, (6, 4): 1, (7, 4): 1, (8, 4): 1, (9, 4): 1}}, 'left'], [{'x': 1, 'y': 2, 'direction': 'E', 'hydradeIndex': {(0, 0): -1, (1, 0): 1, (2, 0): 1, (3, 0): 1, (4, 0): 1, (5, 0): 1, (6, 0): 1, (7, 0): 1, (8, 0): 1, (9, 0): 1, (0, 1): 1, (1, 1): 1, (2, 1): 0, (3, 1): 1, (4, 1): 1, (5, 1): 1, (6, 1): 1, (7, 1): 1, (8, 1): 1, (9, 1): 1, (0, 2): 1, (1, 2): 1, (2, 2): 0, (3, 2): 1, (4, 2): 1, (5, 2): 1, (6, 2): 1, (7, 2): 1, (8, 2): 1, (9, 2): 1, (0, 3): 1, (1, 3): 1, (2, 3): 1, (3, 3): 1, (4, 3): 1, (5, 3): 1, (6, 3): 1, (7, 3): 1, (8, 3): 1, (9, 3): 1, (0, 4): 1, (1, 4): 1, (2, 4): 1, (3, 4): 1, (4, 4): 1, (5, 4): 1, (6, 4): 1, (7, 4): 1, (8, 4): 1, (9, 4): 1}}, 'forward'], [{'x': 0, 'y': 2, 'direction': 'E', 'hydradeIndex': {(0, 0): -1, (1, 0): 1, (2, 0): 1, (3, 0): 1, (4, 0): 1, (5, 0): 1, (6, 0): 1, (7, 0): 1, (8, 0): 1, (9, 0): 1, (0, 1): 1, (1, 1): 1, (2, 1): 0, (3, 1): 1, (4, 1): 1, (5, 1): 1, (6, 1): 1, (7, 1): 1, (8, 1): 1, (9, 1): 1, (0, 2): 1, (1, 2): 1, (2, 2): 0, (3, 2): 1, (4, 2): 1, (5, 2): 1, (6, 2): 1, (7, 2): 1, (8, 2): 1, (9, 2): 1, (0, 3): 1, (1, 3): 1, (2, 3): 1, (3, 3): 1, (4, 3): 1, (5, 3): 1, (6, 3): 1, (7, 3): 1, (8, 3): 1, (9, 3): 1, (0, 4): 1, (1, 4): 1, (2, 4): 1, (3, 4): 1, (4, 4): 1, (5, 4): 1, (6, 4): 1, (7, 4): 1, (8, 4): 1, (9, 4): 1}}, 'forward'], [{'x': 0, 'y': 2, 'direction': 'N', 'hydradeIndex': {(0, 0): -1, (1, 0): 1, (2, 0): 1, (3, 0): 1, (4, 0): 1, (5, 0): 1, (6, 0): 1, (7, 0): 1, (8, 0): 1, (9, 0): 1, (0, 1): 1, (1, 1): 1, (2, 1): 0, (3, 1): 1, (4, 1): 1, (5, 1): 1, (6, 1): 1, (7, 1): 1, (8, 1): 1, (9, 1): 1, (0, 2): 1, (1, 2): 1, (2, 2): 0, (3, 2): 1, (4, 2): 1, (5, 2): 1, (6, 2): 1, (7, 2): 1, (8, 2): 1, (9, 2): 1, (0, 3): 1, (1, 3): 1, (2, 3): 1, (3, 3): 1, (4, 3): 1, (5, 3): 1, (6, 3): 1, (7, 3): 1, (8, 3): 1, (9, 3): 1, (0, 4): 1, (1, 4): 1, (2, 4): 1, (3, 4): 1, (4, 4): 1, (5, 4): 1, (6, 4): 1, (7, 4): 1, (8, 4): 1, (9, 4): 1}}, 'right'], [{'x': 0, 'y': 3, 'direction': 'N', 'hydradeIndex': {(0, 0): -1, (1, 0): 1, (2, 0): 1, (3, 0): 1, (4, 0): 1, (5, 0): 1, (6, 0): 1, (7, 0): 1, (8, 0): 1, (9, 0): 1, (0, 1): 1, (1, 1): 1, (2, 1): 0, (3, 1): 1, (4, 1): 1, (5, 1): 1, (6, 1): 1, (7, 1): 1, (8, 1): 1, (9, 1): 1, (0, 2): 0, (1, 2): 1, (2, 2): 0, (3, 2): 1, (4, 2): 1, (5, 2): 1, (6, 2): 1, (7, 2): 1, (8, 2): 1, (9, 2): 1, (0, 3): 1, (1, 3): 1, (2, 3): 1, (3, 3): 1, (4, 3): 1, (5, 3): 1, (6, 3): 1, (7, 3): 1, (8, 3): 1, (9, 3): 1, (0, 4): 1, (1, 4): 1, (2, 4): 1, (3, 4): 1, (4, 4): 1, (5, 4): 1, (6, 4): 1, (7, 4): 1, (8, 4): 1, (9, 4): 1}}, 'forward'], [{'x': 0, 'y': 3, 'direction': 'W', 'hydradeIndex': {(0, 0): -1, (1, 0): 1, (2, 0): 1, (3, 0): 1, (4, 0): 1, (5, 0): 1, (6, 0): 1, (7, 0): 1, (8, 0): 1, (9, 0): 1, (0, 1): 1, (1, 1): 1, (2, 1): 0, (3, 1): 1, (4, 1): 1, (5, 1): 1, (6, 1): 1, (7, 1): 1, (8, 1): 1, (9, 1): 1, (0, 2): 0, (1, 2): 1, (2, 2): 0, (3, 2): 1, (4, 2): 1, (5, 2): 1, (6, 2): 1, (7, 2): 1, (8
#displayControler: NUM_X: 10, NUM_Y: 5 (klasyczne - duże) CHANGE THIS IN DCON !!!
bfsRoot2.reverse()
print_to_console("Traktor porusza sie obliczona sciezka BFS")
traktor.move_by_root(bfsRoot2, pole, [traktor.irrigateSlot])
if(bfs3_flag):
bfsRoot3 = BFS.BFS3({'x': 0, 'y': 0, 'direction': "E"},goalTreasure)
#displayControler: NUM_X: 20, NUM_Y: 12 (skarb) CHANGE THIS IN DCON BY HAND!!!!!!!!
bfsRoot3.reverse()
print_to_console("Traktor porusza sie obliczona sciezka BFS")
traktor.move_by_root(bfsRoot3, pole, [traktor.irrigateSlot])
2024-04-25 22:56:18 +02:00
if (Astar):
aStarRoot,cost_list,total_cost= AStar.A_star({'x': 0, 'y': 0, 'direction': "E"}, pole, goalTreasure)
2024-04-25 22:56:18 +02:00
if aStarRoot:
print("Pełna ścieżka agenta:")
2024-04-25 22:56:18 +02:00
aStarRoot.reverse()
cost_list.reverse()
i=0
for node in aStarRoot:
state = node[0].state # Pobranie stanu z obiektu Node
action = node[1] # Pobranie akcji
print("Współrzędne pola:", state['x'], state['y'], "- Akcja:",action,"- Koszt: ",cost_list[i])
i=i+1
2024-04-25 22:56:18 +02:00
print_to_console("Traktor porusza się obliczoną ścieżką A*")
traktor.move_by_root(aStarRoot, pole, [traktor.irrigateSlot])
print("Koszt:", total_cost)
2024-04-25 22:56:18 +02:00
else:
print_to_console("Nie można znaleźć ścieżki A*") # Wyświetl komunikat, jeśli nie znaleziono ścieżki
if (Astar2):
aStarRoot2,cost_list, total_cost= AStar.A_star2({'x': 0, 'y': 0, 'direction': "E"}, pole, goalTreasure)
if aStarRoot2:
print("Pełna ścieżka agenta:")
aStarRoot2.reverse()
cost_list.reverse()
i=0
for node in aStarRoot2:
state = node[0].state # Pobranie stanu z obiektu Node
action = node[1] # Pobranie akcji
print("Współrzędne pola:", state['x'], state['y'], "- Akcja:",action,"- Koszt: ",cost_list[i])
i=i+1
print_to_console("Traktor porusza się obliczoną ścieżką A*")
traktor.move_by_root(aStarRoot2, pole, [traktor.irrigateSlot])
print("Koszt:", total_cost)
else:
print_to_console("Nie można znaleźć ścieżki A*") # Wyświetl komunikat, jeśli nie znaleziono ścieżki
if(TreeFlag):
traktor.move_forward(pole)
traktor.tree_move(pole)
2024-05-25 02:00:19 +02:00
if(nnFlag):
global model
if (newModel):
print_to_console("uczenie sieci neuronowej")
model = neuralnetwork.trainNewModel()
2024-05-26 18:41:55 +02:00
neuralnetwork.saveModel(model, 'model.pth')
print_to_console("sieć nuronowa nauczona")
2024-05-25 02:00:19 +02:00
print('model został wygenerowany')
else:
model = neuralnetwork.loadModel('model_500_hidden.pth')
2024-05-25 02:00:19 +02:00
print_to_console("model został załądowny")
testset = neuralnetwork.getDataset(False)
print(neuralnetwork.accuracy(model, testset))
traktor.snake_move_predict_plant(pole, model, headers=['Coords','Real plant','Predicted plant','Result','Fertilizer'], actions=[traktor.fertilize_slot])
if(finalFlag):
pass
model = neuralnetwork.loadModel('model_500_hidden.pth')
Tractor.drzewo.treeLearn()
traktor.snake_move_predict_plant(pole, model, headers=['Coords','Real plant','Predicted plant','Result','Water decision'], actions=[traktor.irigate_slot_NN])
start_flag=False
# demo_move()
old_info=get_info(old_info)
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
def init(demo):
pygame.display.update()
if(demo==True):
init_demo()
#TODO: Implement
def print_to_console(text):
clock.tick(5)
ui.clear_console()
clock.tick(5)
ui.render_text_to_console(text)
def demo_move():
2024-03-23 21:00:08 +01:00
current_slot = traktor.slot
if current_slot:
current_slot.redraw_image() # Przerysowanie obrazu dla aktualnego slotu
traktor.random_move(pole)
def get_info(old_info):
try:
(x,y)=pygame.mouse.get_pos()
new_info=pole.check_collision(x,y)
if(old_info!=new_info):
print(new_info)
return new_info
except:
pass