diff --git a/.idea/Traktor AI.iml b/.idea/Traktor AI.iml index 078ddf5..858c4d5 100644 --- a/.idea/Traktor AI.iml +++ b/.idea/Traktor AI.iml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8d93904 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/source/NN/__pycache__/model.cpython-39.pyc b/source/NN/__pycache__/model.cpython-39.pyc new file mode 100644 index 0000000..60d7965 Binary files /dev/null and b/source/NN/__pycache__/model.cpython-39.pyc differ diff --git a/source/NN/__pycache__/neural_network.cpython-311.pyc b/source/NN/__pycache__/neural_network.cpython-311.pyc index 268eb3a..a66d89d 100644 Binary files a/source/NN/__pycache__/neural_network.cpython-311.pyc and b/source/NN/__pycache__/neural_network.cpython-311.pyc differ diff --git a/source/NN/__pycache__/neural_network.cpython-39.pyc b/source/NN/__pycache__/neural_network.cpython-39.pyc new file mode 100644 index 0000000..e7987c2 Binary files /dev/null and b/source/NN/__pycache__/neural_network.cpython-39.pyc differ diff --git a/source/NN/neural_network.py b/source/NN/neural_network.py index 3202aa4..8152f40 100644 --- a/source/NN/neural_network.py +++ b/source/NN/neural_network.py @@ -7,6 +7,7 @@ import matplotlib.pyplot as plt from NN.model import * from PIL import Image import pygame +from area.constants import GREY device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') @@ -84,16 +85,22 @@ def load_image(image_path): testImage = testImage.unsqueeze(0) return testImage +#display the image for prediction next to the field def display_image(screen, image_path, position): image = pygame.image.load(image_path) image = pygame.transform.scale(image, (250, 250)) screen.blit(image, position) +#display result of the guessed image (text under the image) def display_result(screen, position, predicted_class): font = pygame.font.Font(None, 30) displayed_text = font.render("The predicted image is: "+str(predicted_class), 1, (255,255,255)) screen.blit(displayed_text, position) +def clear_text_area(win, x, y, width, height, color=GREY): + pygame.draw.rect(win, color, (x, y, width, height)) + pygame.display.update() + def guess_image(model, image_tensor): with torch.no_grad(): testOutput = model(image_tensor) diff --git a/source/__pycache__/astar.cpython-311.pyc b/source/__pycache__/astar.cpython-311.pyc index c791e81..1adf802 100644 Binary files a/source/__pycache__/astar.cpython-311.pyc and b/source/__pycache__/astar.cpython-311.pyc differ diff --git a/source/__pycache__/astar.cpython-39.pyc b/source/__pycache__/astar.cpython-39.pyc index d9b59f2..2075401 100644 Binary files a/source/__pycache__/astar.cpython-39.pyc and b/source/__pycache__/astar.cpython-39.pyc differ diff --git a/source/__pycache__/bfs.cpython-311.pyc b/source/__pycache__/bfs.cpython-311.pyc index 94f1cb7..5eee655 100644 Binary files a/source/__pycache__/bfs.cpython-311.pyc and b/source/__pycache__/bfs.cpython-311.pyc differ diff --git a/source/__pycache__/genetic.cpython-311.pyc b/source/__pycache__/genetic.cpython-311.pyc new file mode 100644 index 0000000..6a92b8b Binary files /dev/null and b/source/__pycache__/genetic.cpython-311.pyc differ diff --git a/source/__pycache__/genetic.cpython-39.pyc b/source/__pycache__/genetic.cpython-39.pyc new file mode 100644 index 0000000..31f9ad7 Binary files /dev/null and b/source/__pycache__/genetic.cpython-39.pyc differ diff --git a/source/__pycache__/ground.cpython-311.pyc b/source/__pycache__/ground.cpython-311.pyc index 071c593..37829e1 100644 Binary files a/source/__pycache__/ground.cpython-311.pyc and b/source/__pycache__/ground.cpython-311.pyc differ diff --git a/source/__pycache__/ground.cpython-39.pyc b/source/__pycache__/ground.cpython-39.pyc index d3c6d44..358a7ba 100644 Binary files a/source/__pycache__/ground.cpython-39.pyc and b/source/__pycache__/ground.cpython-39.pyc differ diff --git a/source/__pycache__/main.cpython-311.pyc b/source/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000..6bf2826 Binary files /dev/null and b/source/__pycache__/main.cpython-311.pyc differ diff --git a/source/__pycache__/plant.cpython-39.pyc b/source/__pycache__/plant.cpython-39.pyc index c7fc95f..c904c3a 100644 Binary files a/source/__pycache__/plant.cpython-39.pyc and b/source/__pycache__/plant.cpython-39.pyc differ diff --git a/source/__pycache__/tile.cpython-311.pyc b/source/__pycache__/tile.cpython-311.pyc index 25b2aa6..57aecac 100644 Binary files a/source/__pycache__/tile.cpython-311.pyc and b/source/__pycache__/tile.cpython-311.pyc differ diff --git a/source/__pycache__/tile.cpython-39.pyc b/source/__pycache__/tile.cpython-39.pyc index a03d927..fba915a 100644 Binary files a/source/__pycache__/tile.cpython-39.pyc and b/source/__pycache__/tile.cpython-39.pyc differ diff --git a/source/area/__pycache__/field.cpython-311.pyc b/source/area/__pycache__/field.cpython-311.pyc index df05e7f..9321d91 100644 Binary files a/source/area/__pycache__/field.cpython-311.pyc and b/source/area/__pycache__/field.cpython-311.pyc differ diff --git a/source/area/__pycache__/field.cpython-39.pyc b/source/area/__pycache__/field.cpython-39.pyc index 3badf32..347309b 100644 Binary files a/source/area/__pycache__/field.cpython-39.pyc and b/source/area/__pycache__/field.cpython-39.pyc differ diff --git a/source/area/__pycache__/tractor.cpython-311.pyc b/source/area/__pycache__/tractor.cpython-311.pyc index eea7c32..78d9928 100644 Binary files a/source/area/__pycache__/tractor.cpython-311.pyc and b/source/area/__pycache__/tractor.cpython-311.pyc differ diff --git a/source/area/field.py b/source/area/field.py index 25c1c7b..b08c028 100644 --- a/source/area/field.py +++ b/source/area/field.py @@ -6,6 +6,9 @@ from area.constants import WIDTH,FIELD_WIDTH,TILE_SIZE,GREY,ROWS,COLS from tile import Tile from ground import Dirt +from genetic import genetic_algorithm +import os + tiles = [] fieldX = (WIDTH-FIELD_WIDTH)/2 @@ -20,7 +23,7 @@ def positionFieldElements(): t.y += fieldY -def createTiles(): +''' def createTiles(): for y in range(0, COLS): for x in range(0, ROWS): tile = Tile(x*TILE_SIZE, y*TILE_SIZE) @@ -30,8 +33,47 @@ def createTiles(): tile.randomizeContent() tiles.append(tile) positionFieldElements() + return tiles ''' + +def createTiles(): + best = genetic_algorithm(50, 20, 0.7, 10) + + for y in range(COLS): + for x in range (ROWS): + tile = Tile(x * TILE_SIZE, y * TILE_SIZE) + dirt = Dirt(random.randint(1, 100), random.randint(1, 100)) + dirt.pests_and_weeds() + + crop = best[y][x] + if crop == 'apple': + tile.image = "resources/images/sampling.png" + photo_path = random.choice(os.listdir("resources/images/plant_photos/apples")) + tile.photo = os.path.join("resources/images/plant_photos/apples", photo_path) + elif crop == 'cauliflower': + tile.image = "resources/images/sampling.png" + photo_path = random.choice(os.listdir("resources/images/plant_photos/cauliflowers")) + tile.photo = os.path.join("resources/images/plant_photos/cauliflowers", photo_path) + elif crop == 'radish': + tile.image = "resources/images/sampling.png" + photo_path = random.choice(os.listdir("resources/images/plant_photos/radishes")) + tile.photo = os.path.join("resources/images/plant_photos/radishes", photo_path) + elif crop == 'wheat': + tile.image = "resources/images/sampling.png" + photo_path = random.choice(os.listdir("resources/images/plant_photos/wheats")) + tile.photo = os.path.join("resources/images/plant_photos/wheats", photo_path) + elif crop == 'rock_dirt': + tile.image = "resources/images/rock_dirt.png" + dirt.set_ocstacle(True) + else: + tile.image = "resources/images/dirt.png" + tile.ground = "resources/images/background.jpg" + + tile.ground = dirt + tiles.append(tile) + positionFieldElements() return tiles + def createField(win): createTiles() for t in tiles: diff --git a/source/area/tractor.py b/source/area/tractor.py index 7416043..26868e5 100644 --- a/source/area/tractor.py +++ b/source/area/tractor.py @@ -1,5 +1,6 @@ +from NN.neural_network import clear_text_area from crop_protection_product import CropProtectionProduct -from area.constants import TILE_SIZE, DIRECTION_EAST, DIRECTION_SOUTH, DIRECTION_WEST, DIRECTION_NORTH +from area.constants import TILE_SIZE, DIRECTION_EAST, DIRECTION_SOUTH, DIRECTION_WEST, DIRECTION_NORTH, WIDTH from area.field import fieldX, fieldY, tiles import pygame import time @@ -38,16 +39,19 @@ class Tractor: self.image = pygame.image.load('resources/images/tractor_left.png').convert_alpha() - def work_on_field(self, tile, ground, plant1): + def work_on_field(self, screen, tile, ground, plant1): + results = [] if plant1 is None: tile.randomizeContent() # sprobuj zasadzic cos print("Tarctor planted something") + results.append("Tarctor planted something") elif plant1.growth_level == 100: tile.plant = None ground.nutrients_level -= 40 ground.water_level -= 40 print("Tractor collected something") + results.append("Tractor collected something") else: plant1.try_to_grow(50,50) #mozna dostosowac jeszcze ground.nutrients_level -= 11 @@ -61,6 +65,7 @@ class Tractor: elif plant1.plant_type == self.spinosad.plant_type: t = "Tractor used Spinosad" print(t) + results.append(t) ground.pest = False if ground.weed: # traktor pozbywa siÄ™ chwastow @@ -71,13 +76,21 @@ class Tractor: elif plant1.plant_type == self.metazachlor.plant_type: t = "Tractor used Metazachlor" print(t) + results.append(t) ground.weed = False if ground.water_level < plant1.water_requirements: ground.water_level += 20 print("Tractor watered the plant") + results.append("Tractor watered the plant") if ground.nutrients_level < plant1.nutrients_requirements: ground.nutrients_level += 20 print("Tractor added some nutrients") + results.append("Tractor added some nutrients") + + clear_text_area(screen, WIDTH-90, 100, 400, 100) + for idx, result in enumerate(results): + display_work_results(screen, result, (WIDTH-90, 100 + idx * 30)) + @@ -135,27 +148,58 @@ class Tractor: def draw_tractor(self, win): - imageTractor = pygame.transform.scale(self.image, (TILE_SIZE, TILE_SIZE)) win.blit(imageTractor, (self.rect.x, self.rect.y)) pygame.display.flip() + + def store_tile_image(self, tile): + return pygame.image.load(tile.image).convert_alpha() + + def restore_tile_image(self, screen, tile): + image = pygame.image.load(tile.image).convert_alpha() + image = pygame.transform.scale(image, (TILE_SIZE, TILE_SIZE)) + screen.blit(image, (tile.x, tile.y)) + pygame.display.update() + + + #translates move_list generated by bfs into the actual movement: def do_actions(tractor, WIN, move_list): - trail = pygame.image.load("resources/images/background.jpg").convert_alpha() - trail = pygame.transform.scale(trail, (TILE_SIZE, TILE_SIZE)) + # trail = pygame.image.load("resources/images/background.jpg").convert_alpha() + # trail = pygame.transform.scale(trail, (TILE_SIZE, TILE_SIZE)) + tile_images = {} + for tile in tiles: + tile_images[(tile.x, tile.y)] = tractor.store_tile_image(tile) pygame.display.update() for move in move_list: - WIN.blit(trail, (tractor.rect.x, tractor.rect.y, TILE_SIZE, TILE_SIZE)) + # WIN.blit(trail, (tractor.rect.x, tractor.rect.y, TILE_SIZE, TILE_SIZE)) + current_tile = None + for tile in tiles: + if tile.x == tractor.rect.x and tile.y == tractor.rect.y: + current_tile = tile + break + if current_tile: + tractor.restore_tile_image(WIN, current_tile) + if move == "move": tractor.move() elif move == "rotate_right": tractor.rotate_to_right() elif move == "rotate_left": tractor.rotate_to_left() + tractor.draw_tractor(WIN) pygame.display.update() - time.sleep(1) + time.sleep(0.35) +#displays results of the "work_on_field" function next to the field: +def display_work_results(screen, text, position): + font = pygame.font.Font(None, 30) + displayed_text = font.render(text, 1, (255,255,255)) + screen.blit(displayed_text, position) + pygame.display.update() + + diff --git a/source/astar.py b/source/astar.py index 51634b3..bf346a0 100644 --- a/source/astar.py +++ b/source/astar.py @@ -79,6 +79,8 @@ def goal_test(elem, goalstate): def tile_cost(tile): if tile.image == "resources/images/sampling.png": return 100 + if tile.image == "resources/images/rock_dirt.png": + return 1000 else: return 1 @@ -89,7 +91,7 @@ def heuristic(current_x, current_y, end_x, end_y): # actions(string): move, rotate_to_left, rotate_to_right # main search function: -def a_star(istate, succ, goaltest, tractor): +def a_star(istate, succ_astar, goaltest): fringe = [] explored = set() node = Node(0, istate.get_x(), istate.get_y(), istate.get_direction(), None, None, 0) @@ -107,7 +109,7 @@ def a_star(istate, succ, goaltest, tractor): explored.add(elem) - for (action, state) in succ(temp, tractor): + for (action, state) in succ_astar(temp): fringe_tuple = [] explored_tuple = [] diff --git a/source/bfs.py b/source/bfs.py index eb6e0ee..2d645e7 100644 --- a/source/bfs.py +++ b/source/bfs.py @@ -158,7 +158,43 @@ def succ(elem, tractor): return actions_states + + #its the copy of successor function for A* only - tractor can ride through stones if there is no other way: +def succ_astar(elem): + actions_states = [] + temp = copy.copy(elem.get_direction()) + + if temp == 1: + temp = 4 + else: + temp -= 1 + actions_states.append(("rotate_left", (elem.get_x(), elem.get_y(), temp))) + temp = copy.copy(elem.get_direction()) + if temp == 4: + temp = 1 + else: + temp += 1 + actions_states.append(("rotate_right", (elem.get_x(), elem.get_y(), temp))) + + temp_move_east = elem.get_x() + TILE_SIZE + temp_move_west = elem.get_x() - TILE_SIZE + temp_move_north = elem.get_y() - TILE_SIZE + temp_move_south = elem.get_y() + TILE_SIZE + + if Tractor.can_it_move_node(elem) == "move east": + actions_states.append(("move", (temp_move_east, elem.get_y(), elem.get_direction()))) + + elif Tractor.can_it_move_node(elem) == "move west": + actions_states.append(("move", (temp_move_west, elem.get_y(), elem.get_direction()))) + + elif Tractor.can_it_move_node(elem) == "move north": + actions_states.append(("move", (elem.get_x(), temp_move_north, elem.get_direction()))) + + elif Tractor.can_it_move_node(elem) == "move south": + actions_states.append(("move", (elem.get_x(), temp_move_south, elem.get_direction()))) + + return actions_states #returns list of actions def get_moves(elem): diff --git a/source/genetic.py b/source/genetic.py new file mode 100644 index 0000000..8b2873e --- /dev/null +++ b/source/genetic.py @@ -0,0 +1,98 @@ +import random + +def make_population(population_s, field_s): + population = [] + crops = ['apple', 'cauliflower', 'radish', 'wheat', 'rock_dirt', 'dirt'] + + for _ in range(population_s): + i = [] + for _ in range(field_s): + row = random.choices(crops, k=field_s) + i.append(row) + population.append(i) + return population + +def calculate_fitness(individual): + cost = 0 + for i in range(len(individual)): + for j in range(len(individual[i])): + crop = individual[i][j] + neighbors = [ + individual[x][y] + for x in range(max(0, i-1), min(len(individual), i+2)) + for y in range(max(0, j-1), min(len(individual), j+2)) + if (x,y) != (i,j) + ] + for n in neighbors: + if crop == 'wheat' and n == 'apple': + cost += 2 + elif crop == 'cauliflower' and n == 'radish': + cost += 4 + + fitness = 1/(1+cost) + return fitness + +def select_parents(population, fitnesses): + fitnesses_sum = sum(fitnesses) + selection_parts = [fitness / fitnesses_sum for fitness in fitnesses] + parents = random.choices(population, weights=selection_parts, k=2) + return parents + +def crossover(parent_1, parent_2): + crossover_point = random.randint(1, (len(parent_1)-1)) + child_1 = parent_1[:crossover_point] + parent_2[crossover_point:] + child_2 = parent_2[:crossover_point] + parent_1[crossover_point:] + return child_1, child_2 + +def mutation(individual, chance): + crops = ['apple', 'cauliflower', 'radish', 'wheat', 'rock_dirt', 'dirt'] + if random.random() < chance: + row = random.randint(0, len(individual) - 1) + column = random.randint(0, len(individual[0]) - 1) + individual[row][column] = random.choice(crops) + return individual + +def genetic_algorithm(population_s, field_s, chance, limit): + population = make_population(population_s, field_s) + + best_fitness = 0 + count = 0 + + while best_fitness < 1: + fitnesses = [calculate_fitness(individual) for individual in population] + new_population = [] + + for _ in range(population_s // 2): + parent_1, parent_2 = select_parents(population, fitnesses) + + p1c = calculate_fitness(parent_1) + p2c = calculate_fitness(parent_2) + print("p1c: ",p1c,"\np2c: ",p2c) + + child_1, child_2 = crossover(parent_1, parent_2) + child_1 = mutation(child_1, chance) + child_2 = mutation(child_2, chance) + new_population.append(child_1) + new_population.append(child_2) + + combined_population = population + new_population + combined_population = sorted(combined_population, key=calculate_fitness, reverse=True) + + population = combined_population[:population_s] + + current_best_fitness = calculate_fitness(population[0]) + if current_best_fitness > best_fitness: + best_fitness = current_best_fitness + count = 0 + else: + count += 1 + + if count >= limit: + break + + best_child = max(population, key=calculate_fitness) + + bsf = calculate_fitness(best_child) + print("bsf: ", bsf) + + return best_child diff --git a/source/ground.py b/source/ground.py index 5f13386..a755c5c 100644 --- a/source/ground.py +++ b/source/ground.py @@ -20,7 +20,10 @@ class Dirt: elif i == 4: self.weed = True self.pest = True - elif i == 5: - self.obstacle = True + '''elif i == 5: + self.obstacle = True''' + + def set_ocstacle(self, obstacle_status): + self.obstacle = obstacle_status # add init, getters,setters diff --git a/source/main.py b/source/main.py index cf13d41..7e22d63 100644 --- a/source/main.py +++ b/source/main.py @@ -5,15 +5,18 @@ import pandas as pd import joblib from area.constants import WIDTH, HEIGHT, TILE_SIZE from area.field import drawWindow -from area.tractor import Tractor, do_actions +from area.tractor import Tractor, do_actions, display_work_results from area.field import tiles, fieldX, fieldY from area.field import get_tile_coordinates, get_tile_index from ground import Dirt from plant import Plant -from bfs import graphsearch, Istate, succ +from bfs import graphsearch, Istate, succ_astar, succ from astar import a_star -from NN.neural_network import load_model, load_image, guess_image, display_image, display_result -from PIL import Image +from NN.neural_network import load_model, load_image, guess_image, display_image, display_result, clear_text_area +from PIL import Image +from genetic import genetic_algorithm + +from area.field import createTiles pygame.init() WIN_WIDTH = WIDTH + 300 @@ -26,39 +29,13 @@ def main(): window = drawWindow(WIN) pygame.display.update() -#getting coordinates of our "goal tile": - tile_index = get_tile_index() - tile_x, tile_y = get_tile_coordinates(tile_index) - if tile_x is not None and tile_y is not None: - print(f"Coordinates of tile {tile_index} are: ({tile_x}, {tile_y})") - else: print("Such tile does not exist") - - #mark the goal tile: - tiles[tile_index].image = "resources/images/sampling_goal.png" - image = pygame.image.load(tiles[tile_index].image).convert() - image = pygame.transform.scale(image, (TILE_SIZE, TILE_SIZE)) - WIN.blit(image, (tiles[tile_index].x, tiles[tile_index].y)) - pygame.display.flip() - - -#graphsearch activation: - istate = Istate(170, 100, 2) #initial state - - goaltest = [] - goaltest.append(tile_x) #final state (consists of x and y because direction doesnt matter) - goaltest.append(tile_y) +#Tractor initialization: tractor = Tractor(0*TILE_SIZE, 0*TILE_SIZE, 2, None, None) tractor.rect.x += fieldX - tractor.rect.y += fieldY - tractor.tractor_start = ((istate.get_x(), istate.get_y())) - #tractor.tractor_start = ((istate.get_x(), istate.get_y(), istate.get_direction)) - tractor.tractor_end = ((goaltest[0], goaltest[1])) - - #moves = (graphsearch(istate, succ, goaltest, tractor)) - moves = (a_star(istate, succ, goaltest, tractor)) - print(moves) - + tractor.rect.y += fieldY + tractor.tractor_start = ((170, 100)) + istate = Istate(170, 100, 2) #initial state #main loop: @@ -68,8 +45,34 @@ def main(): run = False time.sleep(1) - # movement based on route-planning (test): + #getting coordinates of our "goal tile": + tile_index = get_tile_index() + tile_x, tile_y = get_tile_coordinates(tile_index) + if tile_x is not None and tile_y is not None: + print(f"Coordinates of tile {tile_index} are: ({tile_x}, {tile_y})") + else: print("Such tile does not exist") + #mark the goal tile: + tiles[tile_index].image = "resources/images/sampling_goal.png" + image = pygame.image.load(tiles[tile_index].image).convert() + image = pygame.transform.scale(image, (TILE_SIZE, TILE_SIZE)) + WIN.blit(image, (tiles[tile_index].x, tiles[tile_index].y)) + pygame.display.flip() + + + tractor.tractor_end = ((tile_x, tile_y)) + goaltest = [] #final state (consists of x and y because direction doesnt matter) + goaltest.append(tile_x) + goaltest.append(tile_y) + goaltest[0] = tile_x + goaltest[1]=tile_y + + #moves = (graphsearch(istate, succ, goaltest, tractor)) #<-------BFS + moves = (a_star(istate, succ_astar, goaltest)) + print(moves) + + + # movement based on route-planning: tractor.draw_tractor(WIN) time.sleep(1) if moves != False: @@ -85,6 +88,7 @@ def main(): image_tensor = load_image(image_path) prediction = guess_image(load_model(), image_tensor) + clear_text_area(WIN, WIDTH - 50, 600, 400, 50) display_result(WIN, (WIDTH - 50 , 600), prediction) #display text under the photo pygame.display.update() print(f"The predicted image is: {prediction}") @@ -97,8 +101,9 @@ def main(): goalTile.ground=d1 #getting the name and type of the recognized plant: p1.update_name(prediction) - - #decission tree test: + + +#decission tree test: if d1.pest: pe = 1 else: @@ -127,19 +132,71 @@ def main(): t3 = True t4 = False + weather_n = random.randint(1, 4) + if weather_n == 1: + h1 = True + h2 = False + h3 = False + h4 = False + else: + h1 = False + if weather_n == 2: + h2 = True + h3 = False + h4 = False + else: + h2 = False + if weather_n == 3: + h3 = True + h4 = False + else: + h3 = False + h4 = True + + season_n = random.randint(1,4) + if season_n == 1: + s1 = True + s2 = False + s3 = False + s4 = False + temp_n = random.randint(0,22) + else: + s1 = False + if season_n == 2: + s2 = True + s3 = False + s4 = False + temp_n = random.randint(0,22) + else: + s2 = False + if season_n == 3: + s3 = True + s4 = False + temp_n = random.randint(20,39) + else: + s3 = False + s4 = True + temp_n = random.randint(-20, 10) + + anomaly_n = random.randint(1, 10) + if anomaly_n == 1: + a1 = True + else: + a1 = False dane = { - 'anomalies': [True], - 'temp': [17], - 'water': [d1.water_level], - 'nutri': [d1.nutrients_level], - 'pests': [pe], - 'weeds': [we], - 'ripeness': [p1.growth_level], - 'season_autumn': [True], 'season_spring': [False], 'season_summer': [False], 'season_winter': [False], - 'weather_heavyCloudy': [False], 'weather_partCloudy': [False], 'weather_precipitation': [False], - 'weather_sunny': [True], - 'type_cereal': [t1], 'type_fruit': [t2], 'type_none': [t3], 'type_vegetable': [t4] + 'anomalies': [a1], + 'temp': [temp_n], + 'water': [d1.water_level], + 'nutri': [d1.nutrients_level], + 'pests': [pe], + 'weeds': [we], + 'ripeness': [p1.growth_level], + 'season_autumn': [s1], 'season_spring': [s2], 'season_summer': [s3], 'season_winter': [s4], + 'weather_heavyCloudy': [h1], 'weather_partCloudy': [h2], 'weather_precipitation': [h3], + 'weather_sunny': [h4], + 'type_cereal': [t1], 'type_fruit': [t2], 'type_none': [t3], 'type_vegetable': [t4] } + df = pd.DataFrame(dane) df.to_csv('model_data.csv', index=False) @@ -150,8 +207,20 @@ def main(): #work on field: if predykcje == 'work': - tractor.work_on_field(goalTile, d1, p1) - time.sleep(50) + tractor.work_on_field(WIN, goalTile, d1, p1) + + #update the initial state for the next target: + istate = Istate(tile_x, tile_y, tractor.direction) + + #old goalTile is displayed with a black border - to show that it was an old target: + tiles[tile_index].image = "resources/images/sampling_old_goal.png" + image = pygame.image.load(tiles[tile_index].image).convert() + image = pygame.transform.scale(image, (TILE_SIZE, TILE_SIZE)) + WIN.blit(image, (tiles[tile_index].x, tiles[tile_index].y)) + pygame.display.flip() + tractor.draw_tractor(WIN) + + time.sleep(2) print("\n") diff --git a/source/model_data.csv b/source/model_data.csv index 8212e0f..e52cdaf 100644 --- a/source/model_data.csv +++ b/source/model_data.csv @@ -1,2 +1,2 @@ anomalies,temp,water,nutri,pests,weeds,ripeness,season_autumn,season_spring,season_summer,season_winter,weather_heavyCloudy,weather_partCloudy,weather_precipitation,weather_sunny,type_cereal,type_fruit,type_none,type_vegetable -True,17,32,2,0,0,54,True,False,False,False,False,False,False,True,True,False,False,False +True,17,72,73,0,0,60,True,False,False,False,False,False,False,True,False,True,False,False diff --git a/source/resources/images/plant_photos/apples/5243790-apples-c-rex.jpg b/source/resources/images/plant_photos/apples/5243790-apples-c-rex.jpg new file mode 100644 index 0000000..366e00c Binary files /dev/null and b/source/resources/images/plant_photos/apples/5243790-apples-c-rex.jpg differ diff --git a/source/resources/images/plant_photos/apples/91FfdTLrL7L.jpg b/source/resources/images/plant_photos/apples/91FfdTLrL7L.jpg new file mode 100644 index 0000000..0341b3c Binary files /dev/null and b/source/resources/images/plant_photos/apples/91FfdTLrL7L.jpg differ diff --git a/source/resources/images/plant_photos/apples/apple.jpeg b/source/resources/images/plant_photos/apples/apple.jpeg new file mode 100644 index 0000000..3fa9f54 Binary files /dev/null and b/source/resources/images/plant_photos/apples/apple.jpeg differ diff --git a/source/resources/images/plant_photos/apples/fruits-apple-tree-parkland-358x256.jpg b/source/resources/images/plant_photos/apples/fruits-apple-tree-parkland-358x256.jpg new file mode 100644 index 0000000..00ed786 Binary files /dev/null and b/source/resources/images/plant_photos/apples/fruits-apple-tree-parkland-358x256.jpg differ diff --git a/source/resources/images/plant_photos/apples/images.jpeg b/source/resources/images/plant_photos/apples/images.jpeg new file mode 100644 index 0000000..cdb77ba Binary files /dev/null and b/source/resources/images/plant_photos/apples/images.jpeg differ diff --git a/source/resources/images/plant_photos/cauliflowers/0008247_amazing-cauliflower-plant_550.jpeg b/source/resources/images/plant_photos/cauliflowers/0008247_amazing-cauliflower-plant_550.jpeg new file mode 100644 index 0000000..703892d Binary files /dev/null and b/source/resources/images/plant_photos/cauliflowers/0008247_amazing-cauliflower-plant_550.jpeg differ diff --git a/source/resources/images/plant_photos/cauliflowers/cauliflower-growing-in-raised-bed-garden.png b/source/resources/images/plant_photos/cauliflowers/cauliflower-growing-in-raised-bed-garden.png new file mode 100644 index 0000000..d18c8b8 Binary files /dev/null and b/source/resources/images/plant_photos/cauliflowers/cauliflower-growing-in-raised-bed-garden.png differ diff --git a/source/resources/images/plant_photos/cauliflowers/ccc.jpeg b/source/resources/images/plant_photos/cauliflowers/ccc.jpeg new file mode 100644 index 0000000..bef5c33 Binary files /dev/null and b/source/resources/images/plant_photos/cauliflowers/ccc.jpeg differ diff --git a/source/resources/images/plant_photos/cauliflowers/how-to-grow-cauliflower-1403494-03-2bd8fd57ddc24aff98fff1c092c84586.jpg b/source/resources/images/plant_photos/cauliflowers/how-to-grow-cauliflower-1403494-03-2bd8fd57ddc24aff98fff1c092c84586.jpg new file mode 100644 index 0000000..9e32e40 Binary files /dev/null and b/source/resources/images/plant_photos/cauliflowers/how-to-grow-cauliflower-1403494-03-2bd8fd57ddc24aff98fff1c092c84586.jpg differ diff --git a/source/resources/images/plant_photos/radishes/imawes.jpeg b/source/resources/images/plant_photos/radishes/imawes.jpeg new file mode 100644 index 0000000..43acb54 Binary files /dev/null and b/source/resources/images/plant_photos/radishes/imawes.jpeg differ diff --git a/source/resources/images/plant_photos/radishes/imewges.jpeg b/source/resources/images/plant_photos/radishes/imewges.jpeg new file mode 100644 index 0000000..963dc6c Binary files /dev/null and b/source/resources/images/plant_photos/radishes/imewges.jpeg differ diff --git a/source/resources/images/plant_photos/radishes/radd.jpeg b/source/resources/images/plant_photos/radishes/radd.jpeg new file mode 100644 index 0000000..4e091bf Binary files /dev/null and b/source/resources/images/plant_photos/radishes/radd.jpeg differ diff --git a/source/resources/images/plant_photos/wheats/01cf52ec-8cf0-48ed-b55b-64c6fefbe9bf.png b/source/resources/images/plant_photos/wheats/01cf52ec-8cf0-48ed-b55b-64c6fefbe9bf.png new file mode 100644 index 0000000..9023274 Binary files /dev/null and b/source/resources/images/plant_photos/wheats/01cf52ec-8cf0-48ed-b55b-64c6fefbe9bf.png differ diff --git a/source/resources/images/plant_photos/wheats/0f6acdc3-fb9f-4aac-a670-28606e6c71ae.jpg b/source/resources/images/plant_photos/wheats/0f6acdc3-fb9f-4aac-a670-28606e6c71ae.jpg new file mode 100644 index 0000000..d0e00ab Binary files /dev/null and b/source/resources/images/plant_photos/wheats/0f6acdc3-fb9f-4aac-a670-28606e6c71ae.jpg differ diff --git a/source/resources/images/plant_photos/wheats/1a940558-0168-48a4-b68d-944dcdf47b3e.png b/source/resources/images/plant_photos/wheats/1a940558-0168-48a4-b68d-944dcdf47b3e.png new file mode 100644 index 0000000..2c9f6c3 Binary files /dev/null and b/source/resources/images/plant_photos/wheats/1a940558-0168-48a4-b68d-944dcdf47b3e.png differ diff --git a/source/resources/images/plant_photos/wheats/1b5fca6a-50be-45d4-8156-4e143c36b3bb.jpg b/source/resources/images/plant_photos/wheats/1b5fca6a-50be-45d4-8156-4e143c36b3bb.jpg new file mode 100644 index 0000000..5a4e2de Binary files /dev/null and b/source/resources/images/plant_photos/wheats/1b5fca6a-50be-45d4-8156-4e143c36b3bb.jpg differ diff --git a/source/resources/images/plant_photos/wheats/1c76aa4d-11f4-47d1-8bdd-2cb78deeeccf.jpg b/source/resources/images/plant_photos/wheats/1c76aa4d-11f4-47d1-8bdd-2cb78deeeccf.jpg new file mode 100644 index 0000000..09edf5c Binary files /dev/null and b/source/resources/images/plant_photos/wheats/1c76aa4d-11f4-47d1-8bdd-2cb78deeeccf.jpg differ diff --git a/source/resources/images/plant_photos/wheats/Triticum_monococcum_IMG_3029.jpg b/source/resources/images/plant_photos/wheats/Triticum_monococcum_IMG_3029.jpg new file mode 100644 index 0000000..1fe28d1 Binary files /dev/null and b/source/resources/images/plant_photos/wheats/Triticum_monococcum_IMG_3029.jpg differ diff --git a/source/resources/images/plant_photos/wheats/pexels-photo-12801993.jpeg b/source/resources/images/plant_photos/wheats/pexels-photo-12801993.jpeg new file mode 100644 index 0000000..a69c53a Binary files /dev/null and b/source/resources/images/plant_photos/wheats/pexels-photo-12801993.jpeg differ diff --git a/source/resources/images/sampling_old_goal.png b/source/resources/images/sampling_old_goal.png new file mode 100644 index 0000000..a66819b Binary files /dev/null and b/source/resources/images/sampling_old_goal.png differ