Compare commits
No commits in common. "master" and "Reprezentacja_wiedzy" have entirely different histories.
master
...
Reprezenta
@ -4,7 +4,7 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.10 (Traktor)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (Traktor)" project-jdk-type="Python SDK" />
|
||||
</project>
|
@ -1,27 +0,0 @@
|
||||
import torch.nn as nn
|
||||
import torch
|
||||
import torch.nn.functional as F
|
||||
|
||||
|
||||
class Conv_Neural_Network_Model(nn.Module):
|
||||
def __init__(self, num_classes=5,hidden_layer1 = 512,hidden_layer2 = 256):
|
||||
super(Conv_Neural_Network_Model, self).__init__()
|
||||
|
||||
self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=1)
|
||||
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
|
||||
self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1)
|
||||
|
||||
self.fc1 = nn.Linear(64*25*25,hidden_layer1)
|
||||
self.fc2 = nn.Linear(hidden_layer1,hidden_layer2)
|
||||
self.out = nn.Linear(hidden_layer2,num_classes)
|
||||
|
||||
def forward(self, x):
|
||||
x = self.pool1(F.relu(self.conv1(x)))
|
||||
x = self.pool1(F.relu(self.conv2(x)))
|
||||
x = x.view(-1, 64*25*25) #<----flattening the image
|
||||
x = self.fc1(x)
|
||||
x = torch.relu(x)
|
||||
x = self.fc2(x)
|
||||
x = torch.relu(x)
|
||||
x = self.out(x)
|
||||
return F.log_softmax(x, dim=-1)
|
@ -1,127 +0,0 @@
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
from torch.utils.data import DataLoader
|
||||
from torchvision import datasets, transforms, utils
|
||||
from torchvision.transforms import Compose, Lambda, ToTensor
|
||||
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')
|
||||
|
||||
#data transform to tensors:
|
||||
data_transformer = transforms.Compose([
|
||||
transforms.Resize((100, 100)),
|
||||
transforms.ToTensor(),
|
||||
transforms.Normalize((0.5, 0.5, 0.5 ), (0.5, 0.5, 0.5))
|
||||
])
|
||||
|
||||
|
||||
#loading data:
|
||||
train_set = datasets.ImageFolder(root='resources/train', transform=data_transformer)
|
||||
test_set = datasets.ImageFolder(root='resources/test', transform=data_transformer)
|
||||
|
||||
|
||||
#to mozna nawet przerzucic do funkcji train:
|
||||
# train_loader = DataLoader(train_set, batch_size=64, shuffle=True)
|
||||
#test_loader = DataLoader(test_set, batch_size=32, shuffle=True)
|
||||
|
||||
|
||||
#function for training model
|
||||
def train(model, dataset, iter=100, batch_size=64):
|
||||
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
|
||||
criterion = nn.NLLLoss()
|
||||
train_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
|
||||
model.train()
|
||||
|
||||
for epoch in range(iter):
|
||||
for inputs, labels in train_loader:
|
||||
optimizer.zero_grad()
|
||||
output = model(inputs.to(device))
|
||||
loss = criterion(output, labels.to(device))
|
||||
loss.backward()
|
||||
optimizer.step()
|
||||
if epoch % 10 == 0:
|
||||
print('epoch: %3d loss: %.4f' % (epoch, loss))
|
||||
|
||||
#function for getting accuracy
|
||||
def accuracy(model, dataset):
|
||||
model.eval()
|
||||
with torch.no_grad():
|
||||
correct = sum([
|
||||
(model(inputs.to(device)).argmax(dim=1) == labels.to(device)).sum()
|
||||
for inputs, labels in DataLoader(dataset, batch_size=64, shuffle=True)
|
||||
])
|
||||
|
||||
return correct.float() / len(dataset)
|
||||
|
||||
|
||||
# model = Conv_Neural_Network_Model()
|
||||
# model.to(device)
|
||||
|
||||
#loading the already saved model:
|
||||
# model.load_state_dict(torch.load('CNN_model.pth'))
|
||||
# model.eval()
|
||||
|
||||
# #training the model:
|
||||
# train(model, train_set)
|
||||
# print(f"Accuracy of the network is: {100*accuracy(model, test_set)}%")
|
||||
# torch.save(model.state_dict(), 'CNN_model.pth')
|
||||
|
||||
|
||||
|
||||
def load_model():
|
||||
model = Conv_Neural_Network_Model()
|
||||
model.load_state_dict(torch.load('CNN_model.pth', map_location=torch.device('cpu')))
|
||||
model.eval()
|
||||
return model
|
||||
|
||||
|
||||
def load_image(image_path):
|
||||
testImage = Image.open(image_path).convert('RGB')
|
||||
testImage = data_transformer(testImage)
|
||||
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)
|
||||
_, predicted = torch.max(testOutput, 1)
|
||||
predicted_class = train_set.classes[predicted.item()]
|
||||
return predicted_class
|
||||
|
||||
|
||||
|
||||
#TEST - loading the image and getting results:
|
||||
# testImage_path = 'resources/images/plant_photos/1c76aa4d-11f4-47d1-8bdd-2cb78deeeccf.jpg'
|
||||
# testImage = Image.open(testImage_path)
|
||||
# testImage = data_transformer(testImage)
|
||||
# testImage = testImage.unsqueeze(0)
|
||||
# testImage = testImage.to(device)
|
||||
|
||||
# model.load_state_dict(torch.load('CNN_model.pth'))
|
||||
# model.to(device)
|
||||
# model.eval()
|
||||
|
||||
# testOutput = model(testImage)
|
||||
# _, predicted = torch.max(testOutput, 1)
|
||||
# predicted_class = train_set.classes[predicted.item()]
|
||||
# print(f'The predicted class is: {predicted_class}')
|
@ -12,9 +12,6 @@ GROUND = ""
|
||||
# path to ground image
|
||||
GREY = (20, 17, 17, 255)
|
||||
|
||||
DIRECTION_NORTH = 1
|
||||
DIRECTION_EAST = 2
|
||||
DIRECTION_SOUTH = 3
|
||||
DIRECTION_WEST = 4
|
||||
|
||||
|
||||
|
||||
|
@ -1,16 +1,12 @@
|
||||
# create a field here : 1: add tiles, 2: place them
|
||||
import pygame
|
||||
import random
|
||||
|
||||
from area.constants import WIDTH,FIELD_WIDTH,TILE_SIZE,GREY,ROWS,COLS
|
||||
from area.constants import WIDTH,HEIGHT,FIELD_WIDTH,FIELD_HEIGHT,TILE_SIZE,GREY,ROWS,COLS
|
||||
from area.tractor import Tractor
|
||||
from tile import Tile
|
||||
from ground import Dirt
|
||||
|
||||
from genetic import genetic_algorithm
|
||||
import os
|
||||
|
||||
tiles = []
|
||||
|
||||
tractor = Tractor(0*TILE_SIZE, 0*TILE_SIZE)
|
||||
fieldX = (WIDTH-FIELD_WIDTH)/2
|
||||
# in center of the screen
|
||||
fieldY = 100
|
||||
@ -21,58 +17,16 @@ def positionFieldElements():
|
||||
for t in tiles:
|
||||
t.x += fieldX
|
||||
t.y += fieldY
|
||||
tractor.x += fieldX
|
||||
tractor.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)
|
||||
dirt = Dirt(random.randint(1, 100), random.randint(1, 100))
|
||||
dirt.pests_and_weeds()
|
||||
tile.ground = dirt
|
||||
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()
|
||||
@ -81,24 +35,11 @@ def createField(win):
|
||||
image = pygame.transform.scale(image, (TILE_SIZE, TILE_SIZE))
|
||||
win.blit(image, (t.x, t.y))
|
||||
pygame.display.flip()
|
||||
|
||||
imageTractor = pygame.image.load(tractor.image).convert_alpha()
|
||||
imageTractor = pygame.transform.scale(imageTractor, (TILE_SIZE, TILE_SIZE))
|
||||
win.blit(imageTractor, (tractor.x, tractor.y))
|
||||
pygame.display.flip()
|
||||
|
||||
def drawWindow(win):
|
||||
win.fill(GREY)
|
||||
createField(win)
|
||||
pygame.display.flip()
|
||||
|
||||
|
||||
def get_tile_coordinates(index):
|
||||
if index < len(tiles):
|
||||
tile = tiles[index]
|
||||
return tile.x, tile.y
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_tile_index():
|
||||
valid_indices = []
|
||||
for index, tile in enumerate(tiles):
|
||||
if tile.image=="resources/images/sampling.png":
|
||||
valid_indices.append(index)
|
||||
return random.choice(valid_indices)
|
@ -1,15 +1,9 @@
|
||||
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, WIDTH
|
||||
from area.field import fieldX, fieldY, tiles
|
||||
import pygame
|
||||
import time
|
||||
|
||||
|
||||
class Tractor:
|
||||
x = None
|
||||
y = None
|
||||
direction = None #direction takes values in the range of 1 to 4 (1->North, 2->East etc...)
|
||||
image = None
|
||||
cypermetryna = CropProtectionProduct("pests", "cereal")
|
||||
diflufenikan = CropProtectionProduct("weeds", "cereal")
|
||||
@ -19,39 +13,21 @@ class Tractor:
|
||||
metazachlor = CropProtectionProduct("weeds", "vegetable")
|
||||
# etc
|
||||
|
||||
def __init__(self, x, y, direction, tractor_start, tractor_end):
|
||||
def __init__(self, x, y):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.image = 'resources/images/tractor.png'
|
||||
|
||||
self.rect = pygame.Rect(x, y, TILE_SIZE, TILE_SIZE)
|
||||
|
||||
self.direction = direction
|
||||
self.image = pygame.image.load('resources/images/tractor_right.png').convert_alpha()
|
||||
|
||||
self.tractor_start = tractor_start #important for bfs - prevents from spawning obstacles on these positions
|
||||
self.tractor_end = tractor_end #
|
||||
|
||||
if (self.direction==1):
|
||||
self.image = pygame.image.load('resources/images/tractor_up.png').convert_alpha()
|
||||
elif (self.direction==3):
|
||||
self.image = pygame.image.load('resources/images/tractor_down.png').convert_alpha()
|
||||
elif (self.direction==4):
|
||||
self.image = pygame.image.load('resources/images/tractor_left.png').convert_alpha()
|
||||
|
||||
|
||||
def work_on_field(self, screen, tile, ground, plant1):
|
||||
results = []
|
||||
def work_on_field(self, tile, ground, plant1):
|
||||
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
|
||||
@ -65,7 +41,6 @@ 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
|
||||
@ -76,130 +51,10 @@ 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))
|
||||
|
||||
|
||||
|
||||
|
||||
def move(self):
|
||||
if self.direction == DIRECTION_EAST:
|
||||
self.rect.x += TILE_SIZE
|
||||
|
||||
elif self.direction == DIRECTION_WEST:
|
||||
self.rect.x -= TILE_SIZE
|
||||
|
||||
elif self.direction == DIRECTION_NORTH:
|
||||
self.rect.y -= TILE_SIZE
|
||||
|
||||
elif self.direction == DIRECTION_SOUTH:
|
||||
self.rect.y += TILE_SIZE
|
||||
|
||||
|
||||
def rotate_to_right(self):
|
||||
if self.direction == 4:
|
||||
self.direction = 1
|
||||
else:
|
||||
self.direction += 1
|
||||
self.image = pygame.transform.rotate(self.image, -90)
|
||||
|
||||
|
||||
def rotate_to_left(self):
|
||||
if self.direction == 1:
|
||||
self.direction = 4
|
||||
else:
|
||||
self.direction -= 1
|
||||
self.image = pygame.transform.rotate(self.image, 90)
|
||||
|
||||
#checks if we can move further and if we won't get out of boundaries - for bfs:
|
||||
def can_it_move_node(node):
|
||||
if node.get_direction() == DIRECTION_EAST and node.get_x() + TILE_SIZE < 830: #last tile on the west has y:797
|
||||
return "move east"
|
||||
elif node.get_direction() == DIRECTION_WEST and node.get_x() - TILE_SIZE >=fieldX:
|
||||
return "move west"
|
||||
elif node.get_direction() == DIRECTION_NORTH and node.get_y() - TILE_SIZE >=fieldY:
|
||||
return "move north"
|
||||
elif node.get_direction() == DIRECTION_SOUTH and node.get_y() + TILE_SIZE < 760: #last tile on the south has y:727
|
||||
return "move south"
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
#checks if there's an obstacle on the given coordinates (important for bfs):
|
||||
def is_obstacle(self, x, y):
|
||||
for tile in tiles:
|
||||
if tile.x == x and tile.y == y:
|
||||
ground = tile.ground
|
||||
if ground.obstacle and self.tractor_start != (x, y) and self.tractor_end != (x,y):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
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))
|
||||
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))
|
||||
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(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()
|
||||
|
||||
|
||||
|
132
source/astar.py
@ -1,132 +0,0 @@
|
||||
from area.constants import TILE_SIZE, ROWS
|
||||
import copy
|
||||
import heapq
|
||||
from area.field import tiles, fieldX, fieldY
|
||||
from bfs import get_moves
|
||||
|
||||
class Node:
|
||||
|
||||
def __init__(self, priority, x, y, direction, parent, action, cost=0):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.direction = direction
|
||||
self.action = action
|
||||
self.parent = parent
|
||||
self.cost = cost
|
||||
self.priority = priority
|
||||
|
||||
|
||||
def __int__(self):
|
||||
return self.priority
|
||||
|
||||
# getters and setters:
|
||||
|
||||
def get_parent(self):
|
||||
return self.parent
|
||||
|
||||
def set_parent(self, _parent):
|
||||
self.parent = _parent
|
||||
|
||||
def get_action(self):
|
||||
return self.action
|
||||
|
||||
def set_action(self, _action):
|
||||
self.parent = _action
|
||||
|
||||
def get_x(self):
|
||||
return self.x
|
||||
|
||||
def set_x(self, _x):
|
||||
self.x = _x
|
||||
|
||||
def get_y(self):
|
||||
return self.y
|
||||
|
||||
def set_y(self, _y):
|
||||
self.y = _y
|
||||
|
||||
def get_direction(self):
|
||||
return self.direction
|
||||
|
||||
def set_direction(self, _direction):
|
||||
self.parent = _direction
|
||||
|
||||
def get_cost(self):
|
||||
return self.cost
|
||||
|
||||
def set_cost(self, _cost):
|
||||
self.cost = _cost
|
||||
|
||||
def get_priority(self):
|
||||
return self.priority
|
||||
|
||||
def set_priority(self, _priority):
|
||||
self.priority = _priority
|
||||
|
||||
def __lt__(self, other):
|
||||
return self.get_priority() < other.get_priority()
|
||||
|
||||
def copy(self):
|
||||
return copy.copy(self)
|
||||
|
||||
|
||||
def goal_test(elem, goalstate):
|
||||
if elem.get_x() == goalstate[0] and elem.get_y() == goalstate[1]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
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
|
||||
|
||||
def heuristic(current_x, current_y, end_x, end_y):
|
||||
return abs(end_x - current_x) + abs(end_y - current_y)
|
||||
# State as a tuple (x,y,direction)
|
||||
|
||||
# actions(string): move, rotate_to_left, rotate_to_right
|
||||
|
||||
# main search function:
|
||||
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)
|
||||
heapq.heappush(fringe, node)
|
||||
|
||||
while True:
|
||||
|
||||
if not fringe:
|
||||
return False
|
||||
|
||||
elem = heapq.heappop(fringe)
|
||||
temp = copy.copy(elem)
|
||||
if goal_test(elem, goaltest) is True: # jesli True zwroc ciag akcji
|
||||
return get_moves(elem)
|
||||
|
||||
explored.add(elem)
|
||||
|
||||
for (action, state) in succ_astar(temp):
|
||||
fringe_tuple = []
|
||||
explored_tuple = []
|
||||
|
||||
for node in fringe:
|
||||
fringe_tuple.append((node.get_x(), node.get_y(), node.get_direction()))
|
||||
for node in explored:
|
||||
explored_tuple.append((node.get_x(), node.get_y(), node.get_direction()))
|
||||
|
||||
|
||||
tile = int((temp.get_y() - fieldY) / TILE_SIZE) * ROWS + int((temp.get_x() - fieldX) / TILE_SIZE)
|
||||
cost = temp.cost + tile_cost(tiles[tile])
|
||||
priority = cost + heuristic(state[0], state[1], goaltest[0], goaltest[1])
|
||||
|
||||
x = Node(priority, state[0], state[1], state[2], elem, action, cost)
|
||||
|
||||
if state not in fringe_tuple and state not in explored_tuple:
|
||||
heapq.heappush(fringe, x)
|
||||
|
||||
elif state in fringe_tuple and elem.get_priority() < priority:
|
||||
elem.set_priority(priority)
|
207
source/bfs.py
@ -1,207 +0,0 @@
|
||||
from area.constants import TILE_SIZE
|
||||
import copy
|
||||
from area.tractor import Tractor
|
||||
|
||||
class Istate:
|
||||
|
||||
def __init__(self, x, y, direction ):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.direction = direction
|
||||
|
||||
|
||||
def get_x(self):
|
||||
return self.x
|
||||
|
||||
def set_x(self, _x):
|
||||
self.x = _x
|
||||
|
||||
def get_y(self):
|
||||
return self.y
|
||||
|
||||
def set_y(self, _y):
|
||||
self.y = _y
|
||||
|
||||
def get_direction(self):
|
||||
return self.direction
|
||||
|
||||
def set_direction(self, _direction):
|
||||
self.parent = _direction
|
||||
|
||||
class Node:
|
||||
|
||||
def __init__(self, x, y, direction, parent, action):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.direction = direction
|
||||
self.action = action
|
||||
self.parent = parent
|
||||
|
||||
|
||||
|
||||
#getters and setters:
|
||||
|
||||
def get_parent(self):
|
||||
return self.parent
|
||||
|
||||
def set_parent(self, _parent):
|
||||
self.parent = _parent
|
||||
|
||||
def get_action(self):
|
||||
return self.action
|
||||
|
||||
def set_action(self, _action):
|
||||
self.parent = _action
|
||||
|
||||
def get_x(self):
|
||||
return self.x
|
||||
|
||||
def set_x(self, _x):
|
||||
self.x = _x
|
||||
|
||||
def get_y(self):
|
||||
return self.y
|
||||
|
||||
def set_y(self, _y):
|
||||
self.y = _y
|
||||
|
||||
def get_direction(self):
|
||||
return self.direction
|
||||
|
||||
def set_direction(self, _direction):
|
||||
self.parent = _direction
|
||||
|
||||
def copy(self):
|
||||
return copy.copy(self)
|
||||
|
||||
|
||||
def goal_test(elem, goalstate):
|
||||
if elem.get_x() == goalstate[0] and elem.get_y() == goalstate[1]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
#State as a tuple (x,y,direction)
|
||||
|
||||
#actions(string): move, rotate_to_left, rotate_to_right
|
||||
|
||||
#main search function:
|
||||
def graphsearch(istate, succ, goaltest, tractor):
|
||||
|
||||
fringe = []
|
||||
explored = []
|
||||
node = Node(istate.get_x(), istate.get_y(), istate.get_direction(), None, None)
|
||||
fringe.append(node)
|
||||
|
||||
while True:
|
||||
|
||||
if not fringe:
|
||||
return False
|
||||
|
||||
elem = fringe.pop(0)
|
||||
temp = copy.copy(elem)
|
||||
if goal_test(elem, goaltest) is True: #jesli True zwroc ciag akcji
|
||||
return get_moves(elem)
|
||||
|
||||
explored.append(elem)
|
||||
|
||||
for (action, state) in succ(temp, tractor): #dla wszystkich mozliwych stanow i akcjach otrzymanych dla danego wierzcholka
|
||||
fringe_tuple = []
|
||||
explored_tuple = []
|
||||
|
||||
for node in fringe:
|
||||
fringe_tuple.append((node.get_x(), node.get_y(), node.get_direction()))
|
||||
for node in explored:
|
||||
explored_tuple.append((node.get_x(), node.get_y(), node.get_direction()))
|
||||
|
||||
|
||||
if state not in fringe_tuple and state not in explored_tuple:
|
||||
x = Node(state[0], state[1], state[2], elem, action)
|
||||
fringe.append(x)
|
||||
|
||||
|
||||
#funkcja nastepnika - jakie akcje sa mozlwie na danym polu i jaki bedzie stan po wykonaniu tych akcji
|
||||
def succ(elem, tractor):
|
||||
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" and not Tractor.is_obstacle(tractor, temp_move_east, elem.get_y()):
|
||||
actions_states.append(("move", (temp_move_east, elem.get_y(), elem.get_direction())))
|
||||
|
||||
elif Tractor.can_it_move_node(elem) == "move west" and not Tractor.is_obstacle(tractor, temp_move_west, elem.get_y()):
|
||||
actions_states.append(("move", (temp_move_west, elem.get_y(), elem.get_direction())))
|
||||
|
||||
elif Tractor.can_it_move_node(elem) == "move north" and not Tractor.is_obstacle(tractor,elem.get_x(), temp_move_north):
|
||||
actions_states.append(("move", (elem.get_x(), temp_move_north, elem.get_direction())))
|
||||
|
||||
elif Tractor.can_it_move_node(elem) == "move south" and not Tractor.is_obstacle(tractor, elem.get_x(), temp_move_south):
|
||||
actions_states.append(("move", (elem.get_x(), temp_move_south, elem.get_direction())))
|
||||
|
||||
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):
|
||||
move_list = []
|
||||
while (elem.get_parent() != None):
|
||||
move_list.append(elem.get_action())
|
||||
elem = elem.get_parent()
|
||||
move_list.reverse()
|
||||
return move_list
|
||||
|
@ -1,45 +0,0 @@
|
||||
import pandas as pd
|
||||
from sklearn.model_selection import train_test_split
|
||||
import joblib
|
||||
from sklearn.tree import DecisionTreeClassifier, plot_tree
|
||||
import matplotlib.pyplot as plt
|
||||
dtype_dict = {
|
||||
'season': str,
|
||||
'anomalies': bool,
|
||||
'weather': str,
|
||||
'temp': int,
|
||||
'water': int,
|
||||
'nutri': int,
|
||||
'pests': int,
|
||||
'weeds': int,
|
||||
'type': str,
|
||||
'ripeness': int,
|
||||
'target_column': str
|
||||
}
|
||||
# Wczytaj dane z pliku CSV
|
||||
data = pd.read_csv('resources/dataset.csv', header=0, dtype=dtype_dict)
|
||||
#print(data)
|
||||
X = data.drop('target_column', axis=1)
|
||||
y = data['target_column']
|
||||
X = pd.get_dummies(X)
|
||||
# X.to_csv('model_data1.csv', index=False)
|
||||
|
||||
|
||||
# Podział danych na zbiór treningowy i testowy
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
||||
|
||||
# Dopasowanie modelu drzewa decyzyjnego
|
||||
model = DecisionTreeClassifier()
|
||||
model.fit(X_train, y_train)
|
||||
|
||||
|
||||
fig = plt.figure(figsize=(25, 20))
|
||||
_ = plot_tree(model, feature_names=X.columns, class_names=model.classes_, filled=True)
|
||||
plt.savefig('drzewo_decyzyjne.png')
|
||||
plt.show()
|
||||
|
||||
# 'model' to wcześniej wytrenowany model drzewa decyzyjnego
|
||||
joblib.dump(model, 'model.pkl')
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 258 KiB |
@ -1,98 +0,0 @@
|
||||
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
|
@ -12,7 +12,7 @@ class Dirt:
|
||||
# add a couple new properties
|
||||
|
||||
def pests_and_weeds(self):
|
||||
i = random.randint(1, 20) # 5% szans na szkodniki, 10% na chwasty, 5 na obydwa 5 na kamien
|
||||
i = random.randint(1, 20) # 5% szans na szkodniki, 10% na chwasty, 5 na obydwa 15 na kamien
|
||||
if i == 1:
|
||||
self.pest = True
|
||||
elif i == 2 or i == 3:
|
||||
@ -20,10 +20,7 @@ class Dirt:
|
||||
elif i == 4:
|
||||
self.weed = True
|
||||
self.pest = True
|
||||
'''elif i == 5:
|
||||
self.obstacle = True'''
|
||||
|
||||
def set_ocstacle(self, obstacle_status):
|
||||
self.obstacle = obstacle_status
|
||||
elif i == 5 or i == 6 or i == 7:
|
||||
self.obstacle = True
|
||||
|
||||
# add init, getters,setters
|
||||
|
220
source/main.py
@ -1,26 +1,14 @@
|
||||
import pygame
|
||||
import time
|
||||
import random
|
||||
import pandas as pd
|
||||
import joblib
|
||||
from area.constants import WIDTH, HEIGHT, TILE_SIZE
|
||||
|
||||
from area.constants import WIDTH, HEIGHT
|
||||
from area.field import drawWindow
|
||||
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 area.tractor import Tractor
|
||||
from area.field import tiles
|
||||
from ground import Dirt
|
||||
from plant import Plant
|
||||
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, clear_text_area
|
||||
from PIL import Image
|
||||
from genetic import genetic_algorithm
|
||||
|
||||
from area.field import createTiles
|
||||
|
||||
pygame.init()
|
||||
WIN_WIDTH = WIDTH + 300
|
||||
WIN = pygame.display.set_mode((WIN_WIDTH, HEIGHT))
|
||||
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
|
||||
pygame.display.set_caption('Intelligent tractor')
|
||||
|
||||
|
||||
@ -28,200 +16,24 @@ def main():
|
||||
run = True
|
||||
window = drawWindow(WIN)
|
||||
pygame.display.update()
|
||||
|
||||
|
||||
#Tractor initialization:
|
||||
tractor = Tractor(0*TILE_SIZE, 0*TILE_SIZE, 2, None, None)
|
||||
tractor.rect.x += fieldX
|
||||
tractor.rect.y += fieldY
|
||||
tractor.tractor_start = ((170, 100))
|
||||
istate = Istate(170, 100, 2) #initial state
|
||||
|
||||
|
||||
#main loop:
|
||||
while run:
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
run = False
|
||||
time.sleep(1)
|
||||
run = False
|
||||
|
||||
#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:
|
||||
do_actions(tractor, WIN, moves)
|
||||
|
||||
|
||||
#guessing the image under the tile:
|
||||
goalTile = tiles[tile_index]
|
||||
image_path = goalTile.photo
|
||||
display_image(WIN, goalTile.photo, (WIDTH-20 , 300)) #displays photo next to the field
|
||||
pygame.display.update()
|
||||
|
||||
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}")
|
||||
|
||||
|
||||
p1 = Plant('wheat', 'cereal', random.randint(1,100), random.randint(1,100), random.randint(1,100))
|
||||
goalTile.plant = p1
|
||||
#small test:
|
||||
time.sleep(2)
|
||||
tile1 = tiles[0]
|
||||
p1 = Plant('wheat', 'cereal', random.randint(1,100), random.randint(1,100), random.randint(1,100))
|
||||
d1 = Dirt(random.randint(1, 100), random.randint(1,100))
|
||||
d1.pests_and_weeds()
|
||||
goalTile.ground=d1
|
||||
#getting the name and type of the recognized plant:
|
||||
p1.update_name(prediction)
|
||||
|
||||
|
||||
#decission tree test:
|
||||
if d1.pest:
|
||||
pe = 1
|
||||
else:
|
||||
pe = 0
|
||||
if d1.weed:
|
||||
we = 1
|
||||
else:
|
||||
we = 0
|
||||
if p1.plant_type == 'cereal':
|
||||
t1 = True
|
||||
t2 = False
|
||||
t3 = False
|
||||
t4 = False
|
||||
else:
|
||||
t1 = False
|
||||
if p1.plant_type == 'fruit':
|
||||
t2 = True
|
||||
t3 = False
|
||||
t4 = False
|
||||
else:
|
||||
t2 = False
|
||||
if p1.plant_type == 'vegetable':
|
||||
t4 = True
|
||||
t3 = False
|
||||
else:
|
||||
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': [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)
|
||||
|
||||
model = joblib.load('model.pkl')
|
||||
nowe_dane = pd.read_csv('model_data.csv')
|
||||
predykcje = model.predict(nowe_dane)
|
||||
print(predykcje)
|
||||
|
||||
#work on field:
|
||||
if predykcje == 'work':
|
||||
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)
|
||||
tile1.ground=d1
|
||||
t1 = Tractor(10, 10)
|
||||
t1.work_on_field(tile1, d1, p1)
|
||||
time.sleep(3)
|
||||
print("\n")
|
||||
|
||||
|
||||
# in loop move tractor
|
||||
|
||||
main()
|
||||
|
BIN
source/model.pkl
@ -1,2 +0,0 @@
|
||||
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,72,73,0,0,60,True,False,False,False,False,False,False,True,False,True,False,False
|
|
@ -19,19 +19,7 @@ class Plant:
|
||||
else:
|
||||
print("Unable to grow due to bad condition of the ground")
|
||||
|
||||
def update_name(self, predicted_class):
|
||||
if predicted_class == "Apple":
|
||||
self.name = "apple"
|
||||
self.plant_type = 'fruit'
|
||||
# more properties
|
||||
|
||||
elif predicted_class == "Radish":
|
||||
self.name = "radish"
|
||||
self.plant_type = 'vegetable'
|
||||
|
||||
elif predicted_class == "Cauliflower":
|
||||
self.name = "cauliflower"
|
||||
self.plant_type = 'vegetable'
|
||||
|
||||
elif predicted_class == "Wheat":
|
||||
self.name = "wheat"
|
||||
self.plant_type = 'cereal'
|
||||
# add init, getters,setters
|
||||
|
@ -1,301 +0,0 @@
|
||||
season,anomalies,weather,temp,water,nutri,pests,weeds,type,ripeness,target_column
|
||||
winter,False,precipitation,5,44,17,1,0,vegetable,76,doNothing
|
||||
spring,False,heavyCloudy,12,22,83,0,0,cereal,83,work
|
||||
summer,False,sunny,25,85,84,0,0,cereal,85,work
|
||||
summer,False,precipitation,24,24,67,0,0,none,0,work
|
||||
spring,False,sunny,4,44,35,1,0,vegetable,96,work
|
||||
summer,False,partCloudy,33,78,54,0,1,cereal,89,work
|
||||
winter,False,heavyCloudy,-1,27,87,1,1,cereal,1,doNothing
|
||||
autumn,True,sunny,15,45,99,1,1,cereal,49,doNothing
|
||||
autumn,False,partCloudy,20,54,81,0,1,none,0,work
|
||||
winter,False,heavyCloudy,-5,50,49,0,1,fruit,42,doNothing
|
||||
summer,False,heavyCloudy,35,95,31,1,1,none,0,work
|
||||
summer,False,partCloudy,36,14,42,0,1,vegetable,96,work
|
||||
summer,False,precipitation,31,62,45,1,0,vegetable,3,work
|
||||
summer,True,precipitation,35,35,41,1,0,none,0,doNothing
|
||||
summer,True,heavyCloudy,35,33,97,0,0,fruit,76,work
|
||||
autumn,False,sunny,3,24,62,1,1,vegetable,21,work
|
||||
winter,False,partCloudy,-18,80,37,0,0,cereal,24,doNothing
|
||||
spring,True,precipitation,21,15,58,1,0,fruit,49,doNothing
|
||||
autumn,False,precipitation,16,62,75,1,0,fruit,69,work
|
||||
winter,False,heavyCloudy,-11,69,9,0,1,none,0,doNothing
|
||||
autumn,False,sunny,21,6,24,0,0,vegetable,99,work
|
||||
summer,False,heavyCloudy,23,1,33,0,0,none,0,work
|
||||
autumn,False,sunny,18,80,42,0,0,vegetable,47,work
|
||||
summer,False,partCloudy,35,69,38,1,0,vegetable,40,work
|
||||
summer,False,heavyCloudy,27,98,34,0,1,vegetable,20,work
|
||||
winter,False,heavyCloudy,-3,9,3,0,1,none,0,doNothing
|
||||
summer,False,heavyCloudy,26,79,28,1,0,fruit,20,work
|
||||
spring,False,precipitation,3,9,53,0,1,vegetable,30,doNothing
|
||||
autumn,False,sunny,6,31,1,1,0,fruit,31,work
|
||||
autumn,False,sunny,8,2,70,1,0,vegetable,54,work
|
||||
spring,False,precipitation,8,21,1,1,0,fruit,92,doNothing
|
||||
autumn,False,heavyCloudy,11,4,32,1,1,fruit,63,work
|
||||
winter,True,precipitation,-10,57,67,1,1,cereal,43,doNothing
|
||||
winter,False,precipitation,-13,90,14,1,1,fruit,29,doNothing
|
||||
autumn,True,precipitation,10,68,46,0,0,fruit,18,doNothing
|
||||
spring,False,heavyCloudy,8,41,55,1,1,fruit,12,work
|
||||
winter,False,heavyCloudy,-10,24,25,0,0,vegetable,32,doNothing
|
||||
spring,False,heavyCloudy,0,40,6,0,0,none,0,work
|
||||
autumn,False,sunny,22,7,88,0,1,vegetable,71,work
|
||||
spring,True,precipitation,0,56,21,0,0,cereal,46,doNothing
|
||||
autumn,False,sunny,13,37,49,0,1,vegetable,94,work
|
||||
summer,False,precipitation,20,14,39,0,0,cereal,97,work
|
||||
autumn,False,heavyCloudy,18,74,38,1,0,vegetable,32,work
|
||||
autumn,False,heavyCloudy,2,100,70,0,0,none,0,work
|
||||
autumn,False,precipitation,19,30,16,0,1,cereal,17,work
|
||||
summer,False,sunny,26,94,83,1,1,fruit,25,work
|
||||
autumn,False,heavyCloudy,14,91,62,0,0,vegetable,25,work
|
||||
autumn,False,partCloudy,12,34,98,0,0,none,0,work
|
||||
spring,True,heavyCloudy,5,64,50,0,0,vegetable,31,doNothing
|
||||
summer,True,heavyCloudy,30,60,55,0,0,none,0,doNothing
|
||||
summer,False,sunny,22,35,2,0,1,vegetable,20,work
|
||||
spring,False,sunny,21,87,22,0,1,cereal,45,work
|
||||
winter,False,heavyCloudy,-2,48,83,0,1,vegetable,3,doNothing
|
||||
winter,False,heavyCloudy,-15,55,6,0,1,none,0,doNothing
|
||||
summer,False,heavyCloudy,35,5,68,1,0,vegetable,79,work
|
||||
summer,True,heavyCloudy,35,99,35,1,0,fruit,79,doNothing
|
||||
winter,False,sunny,-1,35,57,1,0,vegetable,80,doNothing
|
||||
summer,True,precipitation,31,55,73,0,1,vegetable,24,doNothing
|
||||
autumn,True,precipitation,21,26,84,0,0,vegetable,49,doNothing
|
||||
winter,False,precipitation,-8,13,30,1,0,none,0,doNothing
|
||||
autumn,False,heavyCloudy,20,58,15,1,0,cereal,56,work
|
||||
spring,False,partCloudy,12,25,61,1,1,vegetable,11,work
|
||||
winter,False,partCloudy,-14,58,54,0,1,none,0,doNothing
|
||||
autumn,False,sunny,6,4,96,1,0,cereal,42,work
|
||||
summer,False,sunny,29,74,98,0,1,vegetable,22,work
|
||||
summer,False,sunny,32,83,90,1,0,none,0,work
|
||||
summer,True,sunny,33,11,11,0,1,fruit,45,work
|
||||
spring,False,sunny,3,54,13,1,1,none,0,work
|
||||
autumn,False,heavyCloudy,20,67,97,0,0,cereal,68,doNothing
|
||||
spring,False,sunny,5,35,54,0,0,vegetable,37,work
|
||||
summer,False,precipitation,31,44,68,1,0,vegetable,9,work
|
||||
winter,False,heavyCloudy,-11,59,18,1,1,cereal,11,doNothing
|
||||
summer,False,precipitation,30,32,57,1,1,fruit,18,work
|
||||
summer,False,sunny,27,31,54,0,1,vegetable,67,work
|
||||
summer,False,precipitation,29,70,73,1,0,fruit,71,work
|
||||
spring,False,sunny,18,67,22,1,0,fruit,64,work
|
||||
spring,False,partCloudy,13,40,18,1,0,fruit,7,work
|
||||
summer,False,precipitation,23,24,6,1,0,vegetable,90,work
|
||||
autumn,False,heavyCloudy,1,59,84,0,0,none,0,work
|
||||
spring,False,precipitation,2,47,99,0,0,vegetable,83,doNothing
|
||||
summer,False,precipitation,32,9,94,1,0,cereal,18,work
|
||||
winter,False,partCloudy,-14,56,74,1,1,fruit,24,doNothing
|
||||
winter,False,sunny,-5,100,55,0,0,cereal,57,doNothing
|
||||
summer,False,sunny,30,99,99,1,1,cereal,31,work
|
||||
winter,True,precipitation,-13,56,58,1,0,none,0,doNothing
|
||||
spring,False,precipitation,1,24,21,1,1,none,0,work
|
||||
spring,False,heavyCloudy,2,38,56,0,0,fruit,9,work
|
||||
winter,False,partCloudy,-7,60,71,0,0,cereal,70,doNothing
|
||||
autumn,False,precipitation,2,71,2,0,1,cereal,26,doNothing
|
||||
autumn,False,sunny,19,99,7,1,1,none,0,work
|
||||
spring,False,sunny,8,41,35,0,1,vegetable,89,work
|
||||
winter,False,sunny,-14,58,94,0,1,vegetable,29,doNothing
|
||||
summer,True,precipitation,30,3,58,1,0,none,0,doNothing
|
||||
winter,False,precipitation,8,17,76,1,0,vegetable,47,doNothing
|
||||
spring,True,precipitation,20,38,65,0,1,cereal,49,doNothing
|
||||
winter,False,partCloudy,-4,8,10,0,1,cereal,74,doNothing
|
||||
autumn,False,sunny,2,100,7,1,1,none,0,work
|
||||
autumn,False,partCloudy,17,88,89,0,1,vegetable,17,work
|
||||
autumn,False,partCloudy,16,76,54,1,0,vegetable,98,work
|
||||
spring,False,sunny,2,14,25,0,1,vegetable,8,work
|
||||
spring,False,precipitation,5,34,1,1,0,none,0,work
|
||||
autumn,False,heavyCloudy,9,20,28,0,0,cereal,88,work
|
||||
autumn,False,heavyCloudy,20,17,84,0,0,cereal,15,work
|
||||
winter,False,heavyCloudy,-18,43,33,0,1,cereal,31,doNothing
|
||||
autumn,False,partCloudy,2,1,3,1,1,cereal,86,work
|
||||
summer,False,heavyCloudy,34,58,23,0,0,cereal,27,work
|
||||
summer,False,precipitation,31,22,14,0,1,fruit,33,work
|
||||
winter,False,sunny,-5,98,51,1,0,none,0,doNothing
|
||||
winter,False,precipitation,-17,74,78,1,0,none,0,doNothing
|
||||
summer,False,precipitation,29,3,54,0,0,none,0,work
|
||||
autumn,False,precipitation,7,45,29,1,1,cereal,52,doNothing
|
||||
spring,False,sunny,7,21,30,0,1,fruit,38,work
|
||||
summer,False,heavyCloudy,28,73,75,1,1,none,0,work
|
||||
summer,False,heavyCloudy,32,49,43,0,0,vegetable,74,work
|
||||
autumn,True,precipitation,0,99,66,0,0,none,0,doNothing
|
||||
summer,True,partCloudy,32,46,99,0,1,none,0,work
|
||||
autumn,False,heavyCloudy,21,26,44,1,0,none,0,work
|
||||
summer,True,precipitation,30,28,89,1,1,cereal,65,doNothing
|
||||
autumn,False,heavyCloudy,20,100,46,1,0,fruit,25,work
|
||||
winter,False,partCloudy,-3,78,63,1,0,vegetable,18,doNothing
|
||||
spring,False,partCloudy,22,8,86,1,1,none,0,work
|
||||
winter,False,partCloudy,2,34,30,1,0,fruit,95,doNothing
|
||||
summer,True,partCloudy,31,35,26,0,0,fruit,3,work
|
||||
winter,False,partCloudy,9,80,24,1,1,vegetable,67,doNothing
|
||||
winter,False,heavyCloudy,-19,85,14,1,1,vegetable,33,doNothing
|
||||
autumn,False,partCloudy,3,15,6,0,0,vegetable,11,work
|
||||
winter,False,partCloudy,10,20,62,1,1,fruit,90,doNothing
|
||||
autumn,False,precipitation,11,93,90,1,0,vegetable,87,work
|
||||
summer,False,partCloudy,22,79,60,1,1,none,0,work
|
||||
winter,True,precipitation,-6,55,88,1,0,vegetable,64,doNothing
|
||||
winter,False,precipitation,-13,31,62,0,1,fruit,70,doNothing
|
||||
autumn,False,precipitation,20,90,2,1,1,fruit,73,work
|
||||
winter,False,heavyCloudy,9,100,76,1,1,cereal,41,doNothing
|
||||
summer,False,partCloudy,30,8,90,1,1,cereal,15,work
|
||||
winter,False,heavyCloudy,4,27,77,1,1,vegetable,99,doNothing
|
||||
summer,False,partCloudy,33,67,34,0,0,cereal,44,work
|
||||
summer,True,precipitation,34,28,100,1,0,vegetable,64,work
|
||||
winter,True,precipitation,-9,34,88,1,1,cereal,5,doNothing
|
||||
spring,False,heavyCloudy,10,33,54,1,0,fruit,63,work
|
||||
spring,False,precipitation,0,77,32,0,0,fruit,100,doNothing
|
||||
autumn,False,sunny,3,7,59,1,0,cereal,62,work
|
||||
winter,False,heavyCloudy,-2,50,37,0,0,vegetable,51,doNothing
|
||||
summer,False,partCloudy,33,74,88,1,1,fruit,49,work
|
||||
spring,False,sunny,14,14,29,1,1,none,0,work
|
||||
summer,False,heavyCloudy,24,98,18,1,0,vegetable,99,work
|
||||
winter,False,heavyCloudy,-15,52,38,0,1,vegetable,66,doNothing
|
||||
spring,True,partCloudy,9,62,24,0,1,fruit,67,doNothing
|
||||
spring,False,precipitation,2,87,100,1,0,vegetable,39,doNothing
|
||||
spring,False,precipitation,16,94,45,0,0,vegetable,35,work
|
||||
winter,False,precipitation,5,41,82,0,1,fruit,80,doNothing
|
||||
spring,False,partCloudy,13,49,4,1,0,cereal,97,work
|
||||
winter,False,partCloudy,-17,24,42,1,1,fruit,71,doNothing
|
||||
spring,False,heavyCloudy,20,45,71,1,1,vegetable,58,work
|
||||
winter,False,precipitation,-8,78,81,1,1,fruit,8,doNothing
|
||||
spring,False,partCloudy,5,31,82,0,1,fruit,18,work
|
||||
autumn,False,sunny,6,75,85,0,0,fruit,18,doNothing
|
||||
spring,False,precipitation,14,9,1,1,0,none,0,work
|
||||
winter,False,heavyCloudy,2,37,5,1,1,cereal,1,doNothing
|
||||
summer,False,precipitation,20,44,28,1,1,none,0,work
|
||||
winter,False,partCloudy,-4,97,90,1,1,vegetable,94,doNothing
|
||||
summer,True,precipitation,26,46,55,1,0,cereal,91,doNothing
|
||||
spring,False,sunny,15,97,67,1,1,none,0,work
|
||||
summer,False,partCloudy,33,40,14,1,0,none,0,work
|
||||
spring,False,partCloudy,4,23,51,0,0,vegetable,8,work
|
||||
summer,False,sunny,20,66,76,1,1,vegetable,71,work
|
||||
winter,False,sunny,-11,2,98,0,1,vegetable,29,doNothing
|
||||
spring,False,sunny,9,67,74,0,0,none,0,work
|
||||
autumn,False,precipitation,17,23,94,1,1,none,0,work
|
||||
autumn,False,heavyCloudy,22,65,69,0,1,fruit,79,work
|
||||
winter,False,heavyCloudy,-2,35,82,1,1,cereal,20,doNothing
|
||||
winter,True,heavyCloudy,-10,1,73,1,0,fruit,77,doNothing
|
||||
autumn,False,sunny,4,58,71,1,1,fruit,94,work
|
||||
summer,False,sunny,32,44,20,1,1,vegetable,48,work
|
||||
summer,False,heavyCloudy,31,68,37,1,0,cereal,42,work
|
||||
winter,False,heavyCloudy,-1,69,34,0,0,none,0,doNothing
|
||||
spring,False,heavyCloudy,10,27,43,1,1,vegetable,49,work
|
||||
summer,False,partCloudy,26,86,12,0,1,none,0,work
|
||||
winter,True,precipitation,5,62,62,1,1,cereal,85,doNothing
|
||||
winter,False,partCloudy,9,29,83,1,0,vegetable,14,doNothing
|
||||
spring,False,sunny,8,22,33,0,1,cereal,23,work
|
||||
summer,False,partCloudy,34,38,2,1,1,fruit,29,work
|
||||
autumn,False,heavyCloudy,2,65,91,1,1,vegetable,49,work
|
||||
spring,False,sunny,3,73,32,0,0,fruit,61,work
|
||||
spring,False,precipitation,7,68,70,0,0,none,0,work
|
||||
winter,False,partCloudy,10,68,2,0,0,cereal,80,doNothing
|
||||
winter,False,precipitation,-16,89,7,0,0,fruit,92,doNothing
|
||||
winter,False,precipitation,0,31,49,0,1,cereal,18,doNothing
|
||||
spring,False,heavyCloudy,7,44,86,1,1,none,0,work
|
||||
summer,False,sunny,24,1,75,0,1,none,0,work
|
||||
summer,True,heavyCloudy,39,3,100,1,0,cereal,30,work
|
||||
winter,False,heavyCloudy,2,88,69,1,1,cereal,79,doNothing
|
||||
spring,False,heavyCloudy,16,100,21,0,1,cereal,57,work
|
||||
autumn,True,heavyCloudy,1,17,62,0,1,cereal,92,doNothing
|
||||
autumn,False,sunny,1,69,54,0,0,cereal,62,work
|
||||
autumn,False,sunny,17,62,84,0,1,vegetable,18,work
|
||||
summer,False,heavyCloudy,24,57,84,0,1,vegetable,1,work
|
||||
spring,False,partCloudy,8,80,61,0,0,none,0,work
|
||||
autumn,False,heavyCloudy,1,93,79,0,0,fruit,62,work
|
||||
winter,False,sunny,-4,51,33,1,0,none,0,doNothing
|
||||
autumn,False,precipitation,4,51,73,1,1,fruit,57,doNothing
|
||||
autumn,True,heavyCloudy,5,88,81,0,1,fruit,25,doNothing
|
||||
summer,False,precipitation,30,26,45,0,0,none,0,work
|
||||
winter,False,partCloudy,3,88,46,1,0,none,0,doNothing
|
||||
autumn,False,heavyCloudy,8,20,34,0,1,fruit,62,work
|
||||
spring,False,partCloudy,15,34,33,0,0,vegetable,16,work
|
||||
winter,False,heavyCloudy,-20,80,25,1,0,vegetable,45,doNothing
|
||||
spring,False,precipitation,6,34,78,1,0,cereal,6,doNothing
|
||||
spring,True,heavyCloudy,3,97,65,1,0,fruit,21,doNothing
|
||||
summer,False,precipitation,34,49,65,1,0,vegetable,10,work
|
||||
summer,True,precipitation,26,29,2,0,0,cereal,56,doNothing
|
||||
autumn,False,partCloudy,10,3,19,0,0,vegetable,67,work
|
||||
spring,False,sunny,19,60,71,0,1,cereal,5,work
|
||||
winter,False,partCloudy,5,11,66,0,0,none,0,doNothing
|
||||
winter,False,heavyCloudy,-13,86,29,1,1,cereal,98,doNothing
|
||||
summer,False,precipitation,33,19,2,1,1,cereal,78,work
|
||||
spring,False,precipitation,13,6,40,0,0,cereal,49,work
|
||||
summer,False,partCloudy,31,15,70,1,0,cereal,100,work
|
||||
spring,False,heavyCloudy,8,40,1,0,0,cereal,83,work
|
||||
spring,False,partCloudy,10,77,95,1,1,fruit,85,work
|
||||
spring,False,partCloudy,3,96,32,1,1,fruit,16,work
|
||||
winter,False,sunny,-11,24,5,1,0,none,0,doNothing
|
||||
summer,True,heavyCloudy,34,14,11,0,0,vegetable,36,doNothing
|
||||
summer,True,precipitation,34,69,54,1,0,none,0,doNothing
|
||||
spring,True,precipitation,21,92,44,0,0,fruit,34,doNothing
|
||||
spring,False,sunny,10,58,14,1,1,none,0,work
|
||||
spring,False,partCloudy,9,22,68,0,0,vegetable,85,work
|
||||
winter,False,precipitation,-20,62,18,0,1,vegetable,78,doNothing
|
||||
spring,False,sunny,10,51,7,1,1,none,0,work
|
||||
autumn,True,heavyCloudy,19,89,2,1,0,cereal,6,doNothing
|
||||
winter,False,heavyCloudy,-6,99,10,0,1,fruit,70,doNothing
|
||||
spring,False,sunny,2,84,49,1,0,none,0,work
|
||||
summer,False,heavyCloudy,27,11,32,0,1,cereal,22,work
|
||||
summer,False,partCloudy,27,55,39,1,1,none,0,work
|
||||
winter,False,heavyCloudy,-13,53,1,1,1,none,0,doNothing
|
||||
summer,False,partCloudy,27,15,78,1,1,cereal,43,work
|
||||
winter,False,partCloudy,-4,79,5,0,0,vegetable,1,doNothing
|
||||
winter,False,sunny,-1,6,31,0,0,fruit,13,doNothing
|
||||
summer,True,precipitation,31,86,32,0,1,fruit,98,doNothing
|
||||
winter,False,precipitation,-2,96,89,1,1,cereal,57,doNothing
|
||||
spring,False,sunny,18,28,92,1,0,fruit,20,work
|
||||
summer,False,precipitation,27,90,37,1,0,cereal,55,work
|
||||
summer,False,heavyCloudy,32,41,3,0,0,cereal,35,work
|
||||
autumn,False,precipitation,2,31,90,1,0,cereal,7,doNothing
|
||||
winter,False,partCloudy,-9,74,28,1,1,fruit,72,doNothing
|
||||
summer,False,partCloudy,23,8,99,0,1,none,0,work
|
||||
spring,False,heavyCloudy,8,85,29,0,0,none,0,work
|
||||
winter,False,sunny,-6,67,100,1,1,fruit,25,doNothing
|
||||
winter,False,partCloudy,10,88,85,1,1,cereal,68,doNothing
|
||||
spring,False,sunny,20,99,73,0,0,vegetable,18,work
|
||||
spring,False,sunny,12,52,22,0,0,none,0,work
|
||||
winter,False,sunny,-18,16,57,0,0,vegetable,69,doNothing
|
||||
winter,False,partCloudy,-13,17,10,0,0,vegetable,93,doNothing
|
||||
summer,False,partCloudy,23,18,24,0,1,fruit,7,work
|
||||
spring,False,partCloudy,2,50,95,1,1,vegetable,49,work
|
||||
summer,False,partCloudy,23,51,40,1,0,none,0,work
|
||||
summer,False,partCloudy,28,61,28,1,0,cereal,61,work
|
||||
summer,False,precipitation,25,37,20,1,0,vegetable,18,work
|
||||
spring,False,sunny,11,48,62,0,0,fruit,94,work
|
||||
spring,True,heavyCloudy,1,85,91,0,0,none,0,doNothing
|
||||
autumn,False,partCloudy,21,13,92,1,0,vegetable,66,work
|
||||
autumn,False,precipitation,2,25,95,0,0,cereal,18,doNothing
|
||||
autumn,False,precipitation,0,50,32,0,1,vegetable,92,doNothing
|
||||
winter,False,partCloudy,-18,27,2,0,1,none,0,doNothing
|
||||
autumn,False,precipitation,7,49,6,0,0,fruit,92,doNothing
|
||||
autumn,False,precipitation,19,21,48,1,0,cereal,93,work
|
||||
autumn,False,precipitation,7,54,12,0,0,none,0,work
|
||||
spring,False,sunny,1,25,30,1,0,fruit,20,work
|
||||
autumn,False,partCloudy,9,80,44,0,0,vegetable,49,work
|
||||
summer,False,heavyCloudy,20,95,36,0,1,fruit,11,work
|
||||
winter,False,partCloudy,-17,3,9,1,1,vegetable,94,doNothing
|
||||
winter,False,partCloudy,-15,62,35,0,1,fruit,51,doNothing
|
||||
summer,False,sunny,35,6,24,0,0,cereal,94,work
|
||||
summer,False,partCloudy,34,95,37,1,0,vegetable,86,work
|
||||
summer,True,precipitation,36,25,83,1,0,fruit,87,work
|
||||
spring,False,heavyCloudy,12,29,32,0,0,cereal,86,work
|
||||
winter,False,sunny,-15,44,70,0,0,fruit,82,doNothing
|
||||
winter,False,heavyCloudy,3,23,18,1,1,fruit,60,doNothing
|
||||
summer,False,precipitation,20,71,73,1,0,cereal,3,work
|
||||
winter,False,precipitation,-4,90,10,1,1,cereal,51,doNothing
|
||||
autumn,False,sunny,4,70,73,1,1,cereal,15,work
|
||||
winter,False,heavyCloudy,10,81,76,1,1,vegetable,80,doNothing
|
||||
spring,False,partCloudy,2,2,22,1,1,vegetable,21,work
|
||||
spring,False,precipitation,17,4,67,1,0,cereal,69,work
|
||||
spring,False,heavyCloudy,10,48,55,0,1,cereal,100,work
|
||||
autumn,False,precipitation,3,29,41,0,1,none,0,work
|
||||
spring,False,precipitation,13,58,27,0,1,fruit,16,work
|
||||
summer,False,partCloudy,28,85,14,0,1,none,0,work
|
||||
summer,True,heavyCloudy,30,19,15,0,1,vegetable,49,doNothing
|
||||
summer,True,heavyCloudy,30,74,21,1,0,cereal,16,doNothing
|
||||
summer,False,heavyCloudy,33,38,35,0,0,vegetable,91,work
|
||||
spring,False,partCloudy,1,68,59,1,1,vegetable,14,work
|
||||
summer,False,precipitation,22,41,14,0,1,cereal,48,work
|
||||
autumn,False,precipitation,8,66,44,0,0,cereal,65,doNothing
|
||||
spring,False,sunny,7,35,72,1,0,fruit,92,work
|
||||
summer,False,heavyCloudy,24,36,81,0,1,cereal,6,work
|
||||
winter,False,heavyCloudy,-5,26,27,0,0,cereal,78,doNothing
|
||||
summer,False,sunny,27,45,40,1,0,fruit,57,work
|
||||
spring,False,precipitation,8,30,79,1,1,none,0,work
|
||||
winter,False,sunny,7,76,71,0,1,fruit,75,doNothing
|
||||
winter,False,precipitation,9,49,5,1,0,fruit,7,doNothing
|
|
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 245 KiB |
Before Width: | Height: | Size: 281 KiB |
Before Width: | Height: | Size: 234 KiB |
Before Width: | Height: | Size: 190 KiB |
Before Width: | Height: | Size: 266 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 542 KiB |
Before Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 1.8 MiB |
Before Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 542 KiB |
Before Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 743 KiB |
Before Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 743 KiB |
Before Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 130 KiB |
Before Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 130 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 9.7 KiB |
BIN
source/resources/images/plant_photos/pexels-dxt-73640.jpg
Normal file
After Width: | Height: | Size: 2.2 MiB |
After Width: | Height: | Size: 341 KiB |
Before Width: | Height: | Size: 197 KiB |
BIN
source/resources/images/plant_photos/pexels-pixabay-144248.jpg
Normal file
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 305 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 9.7 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 245 KiB |
Before Width: | Height: | Size: 281 KiB |
Before Width: | Height: | Size: 234 KiB |
Before Width: | Height: | Size: 190 KiB |
Before Width: | Height: | Size: 266 KiB |
Before Width: | Height: | Size: 1.8 MiB |
Before Width: | Height: | Size: 197 KiB |
Before Width: | Height: | Size: 104 KiB |
Before Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 191 KiB |
Before Width: | Height: | Size: 193 KiB |
Before Width: | Height: | Size: 189 KiB |
Before Width: | Height: | Size: 191 KiB |