From 580fbd9d2e918e286f593d415aa28dabc6c72aad Mon Sep 17 00:00:00 2001 From: Aleksandra Jonas Date: Mon, 15 Jun 2020 10:48:24 +0000 Subject: [PATCH] Zaktualizuj 'Traktorek/ran.py' --- Traktorek/ran.py | 308 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 217 insertions(+), 91 deletions(-) diff --git a/Traktorek/ran.py b/Traktorek/ran.py index 68586a7..664694b 100644 --- a/Traktorek/ran.py +++ b/Traktorek/ran.py @@ -1,58 +1,157 @@ -import pygame -import sys -import random -import NataliaWisniewskaDrzewoDecyzyjne -from Tractor import Tractor +import pygame, sys +from traktor import Traktor +import matplotlib.pyplot as plt +from tensorflow.keras.preprocessing import image +from tensorflow.keras.models import load_model +from tensorflow.keras.applications import MobileNetV2 +from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions +import numpy as np +import os, random +from algorytm_genetyczny import Gen +import drzewo_decyzyjne_n as drzewko +from drzewo_decyzyjne_o import Tree + +os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' class Game(object): + def __init__(self): - # Config - self.max_tps = 2.0 - self.res = (720, 720) + + self.gen = Gen(self) + + # nat + self.nawadnianie = [] + + # ola + self.stan = [] self.fields = [] - self.randomize_field() - self.nawadnianie = [] - # Initialization + + self.neighbours() + + # planszę przedstawiam za pomocą punktów 25 pól (współrzędne środka) + self.punkty_pola = [[22, 22], [22, 166], [22, 310], [22, 454], [22, 598], # pierwsza kolumna + [166, 22], [166, 166], [166, 310], [166, 454], [166, 598], # druga kolumna + [310, 22], [310, 166], [310, 310], [310, 454], [310, 598], # trzecia kolumna + [454, 22], [454, 166], [454, 310], [454, 454], [454, 598], # czwarta kolumna + [598, 22], [598, 166], [598, 310], [598, 454], [598, 598]] # 5 kolumna + + # tworzę listę etykiet warzyw, które mogą pojawić się na polu + self.warzywa_etykiety = [] + + self.warzywa_etykiety_sciezka = './warzywa_etykiety' + + # losowo przypisuję do każdego pola etykietę + for _ in self.punkty_pola: + self.warzywa_etykiety.append( + './warzywa_etykiety/' + random.choice(os.listdir(self.warzywa_etykiety_sciezka))) + + # ładuję model sieci neutronowej + self.model = load_model('neural_model.h5') + + pygame.init() + self.res = (720, 720) self.screen = pygame.display.set_mode(self.res) - pygame.display.set_caption('Traktorek') - self.clock = pygame.time.Clock() - self.dt = 0.0 - my_tree = drzewoDecyzyjne.build_tree(drzewoDecyzyjne.training_data) - self.player = Tractor(self) + + self.player = Traktor(self) + + self.rozpoznawanie_planszy() + self.randomize_field() + + # gen + # sadzonki do zasadzenia + self.sadzonka = self.gen.algorytm() + + # nat + drzewko.build_tree(drzewko.training_data) + + # ola + self.tree = Tree() + self.tree.Algorithm() + while True: - # Handle events + + pole = int(self.player.y // 144 * 5 + self.player.x // 144) + for event in pygame.event.get(): if event.type == pygame.QUIT: - sys.exit(0) - elif event.type == pygame.K_ESCAPE: + pygame.quit() sys.exit(0) - # Ticking - self.dt += self.clock.tick() / 1000.0 - while self.dt > 1 / self.max_tps: - self.tick() - self.dt -= 1 / self.max_tps + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_UP: + self.player.y -= 144 + if self.player.y < 0: + self.player.y = 0 + elif event.key == pygame.K_DOWN: + self.player.y += 144 + print(pole) + if self.player.y > 720: + self.player.y = 598 + elif event.key == pygame.K_RIGHT: + self.player.x += 144 + if self.player.x > 720: + self.player.x = 598 + elif event.key == pygame.K_LEFT: + self.player.x -= 144 + if self.player.x < 0: + self.player.x = 0 + elif event.key == pygame.K_SPACE: + # sieci neuronowe + # dla obecnego położenia klienta rozpoznaję jakie rośnie tam warzywo + obecne_polozenie_agenta = [self.player.x, self.player.y] + self.player.obecne_pole = self.punkty_pola.index(obecne_polozenie_agenta) + temp = self.player.obecne_pole + img_path = self.warzywa_etykiety[temp] + img = image.load_img(img_path, target_size=(224, 224)) + x = image.img_to_array(img) + x = np.expand_dims(x, axis=0) + x = preprocess_input(x) + plt.imshow(img) + preds = self.model.predict(x) + preds = np.asarray(preds) + plt.show() + + elif event.key == pygame.K_s: + # algorytm genetyczny + # dla każdego pustego pola sadzę warzywo, które najlepiej się przyjmie względem sąsiadujących + if pole in self.gen.index_gen: + self.fields[pole] = self.sadzonka[self.gen.index_gen.index(pole)] + print('zasadzono', self.sadzonka[self.gen.index_gen.index(pole)]) + self.gen.index_gen.remove(pole) + elif event.key == pygame.K_p: + # drzewo decyzyjne + # dla każdego pola decyduje czy należy je podlać + wynik = drzewko.finalAnswer(self.nawadnianie[pole], drzewko.my_tree) + if (wynik == 's'): + print('należy podlać pole') + else: + print('nie podlewać pola ') + elif event.key == pygame.K_g: + # drzewo decyzyjne + # dla danego pola sprawdza stan gleby + s = self.stan[pole] + print(self.tree.Solution(s)) + + pygame.display.update() - # Rendering self.screen.fill((0, 0, 0)) self.draw() pygame.display.flip() - def tick(self): - self.player.tick() - + # plansza def draw(self): - self.screen.fill((0, 0, 0)) + self.screen.fill((108, 142, 191)) self.draw_field() self.draw_net() self.player.draw() pygame.display.update() + # krata def draw_net(self): color = (255, 255, 255) for i in range(1, 5): @@ -62,89 +161,116 @@ class Game(object): # linia pionowa pygame.draw.line(self.screen, color, (krat, 0), (krat, 720), 1) + def draw_field(self): + for x in range(25): + self.screen.fill((255, 234, 234), (144 * (x % 5), 144 * (x // 5), 144 * (x % 5 + 1), 144 * (x // 5 + 1))) + + #sąsiedzi + def neighbours(self): + self.neighbours = list(range(25)) + self.neighbours[0] = [1, 5] + self.neighbours[4] = [3, 9] + self.neighbours[20] = [15, 21] + self.neighbours[24] = [19, 23] + for x in range(1, 4): + self.neighbours[x] = [x - 1, x + 5, x + 1] + for x in range(5, 16, 5): + self.neighbours[x] = [x - 5, x + 1, x + 5] + for x in range(9, 20, 5): + self.neighbours[x] = [x - 5, x - 1, x + 5] + for x in range(21, 24): + self.neighbours[x] = [x - 1, x - 5, x + 1] + for x in [6, 7, 8, 11, 12, 13, 16, 17, 18]: + self.neighbours[x] = [x - 5, x - 1, x + 1, x + 5] + + # rozpoznawanie warzyw na każdym polu + def rozpoznawanie_planszy(self): + for _ in range(25): + temp = _ + img_path = self.warzywa_etykiety[temp] + img = image.load_img(img_path, target_size=(224, 224)) + x = image.img_to_array(img) + x = np.expand_dims(x, axis=0) + x = preprocess_input(x) + + preds = self.model.predict(x) + preds = np.asarray(preds) + + szacunek = preds.max() + ind = np.where(preds == szacunek) + + if ind == 0: + self.fields.append('rzodkiewa') + if ind == 1: + self.fields.append('papryka') + if ind == 2: + self.fields.append('pomidor') + if ind == 3: + self.fields.append('marchew') + if ind == 4: + self.fields.append('salata') + if ind == 5: + self.fields.append('pietrucha') + if ind == 6: + self.fields.append('puste') + + # generowanie dodatkowych własności dla każdego pola w oparciu o rosnącą tam roślinę def randomize_field(self): + chwasty_list = list(range(1, 11)) + waga_ch = [0.3, 0.2, 0.15, 0.1, 0.05, 0.05, 0.05, 0.04, 0.03, 0.03] + podlanie_list = list(range(1, 11)) + waga_po = [0.02, 0.05, 0.05, 0.05, 0.05, 0.08, 0.1, 0.15, 0.15, 0.3] + ph_list = list(range(1, 11)) + waga_ph = [0.01, 0.01, 0.02, 0.03, 0.07, 0.37, 0.4, 0.05, 0.03, 0.01] for x in range(25): temp = [] # nasiona - temp.append(random.choice(["żyto", "jęczmień", "owies", "marchew", "rzodkiew", "pietruszka", "puste"])) - # gleba - temp.append(random.choice([True, False])) - # woda - temp.append(random.choice(['s', 'n'])) + temp1 = [] + temp1.append(random.choices(chwasty_list, waga_ch)[0]) + woda = random.choices(podlanie_list, waga_po)[0] + temp1.append(woda) + temp1.append(random.choices(ph_list, waga_ph)[0]) + + self.stan.append(temp1) + # ile dni temu pole bylo podlewane temp.append(random.randrange(7)) - # czy ma padac - pada = random.choice(['t', 'n']) - temp.append(pada) - # kiedy padalo - kiedyPada = random.randrange(9) - temp.append(kiedyPada) + ind = 2 - # nawoz - temp.append(random.choice([True, False])) - # # growth rate - # temp.append(random) - # # cost + co ile dni nalezy podlewac dana uprawe - if temp[0] == "żyto": - temp.append(10) + temp.append(ind) + #co ile dni nalezy podlewac dana uprawe + if self.fields[x] == "rzodkiewa": temp.append(4) - elif temp[0] == "jęczmień": - temp.append(12) + elif self.fields[x] == "papryka": temp.append(3) - elif temp[0] == "owies": - temp.append(8) + elif self.fields[x] == "pomidor": temp.append(2) - elif temp[0] == "marchew": - temp.append(14) + elif self.fields[x] == "marchew": temp.append(5) - elif temp[0] == "rzodkiew": - temp.append(7) + elif self.fields[x] == "sałata": temp.append(5) - elif temp[0] == "pietruszka": - temp.append(6) + elif self.fields[x] == "pietruszka": temp.append(1) - elif temp[0] == "puste": - temp.append(2) + elif self.fields[x] == "puste": temp.append(6) else: temp.append(0) - self.fields.append(temp) + # czy ma padac + pada = random.choice(['t', 'n']) + temp.append(pada) - self.nawadnianie.append([temp[3], temp[8], temp[4], temp[5], temp[2]]) - i=0 - print('\nPODLEWANIE: \n') + # kiedy padalo + kiedyPada = random.randrange(9) + temp.append(kiedyPada) - while i<25: - wynik = drzewoDecyzyjne.finalAnswer(self.nawadnianie[i], drzewoDecyzyjne.my_tree) - #print(self.nawadnianie[i]) - #print(wynik) - if (wynik == 's'): - print('należy podlać pole ' + str(i)) + # woda + if woda <= 5: + temp.append('s') else: - print('nie podlewać pola ' + str(i)) - i=i+1 - - def draw_field(self): - for x in range(25): - self.screen.fill(self.color(x), (144 * (x % 5), 144 * (x // 5), 144 * (x % 5 + 1), 144 * (x // 5 + 1))) - - def color(self, z): - if self.fields[z][0] == 'owies': - return (255, 200, 55) - elif self.fields[z][0] == 'jęczmień': - return (170, 150, 40) - elif self.fields[z][0] == 'żyto': - return (100, 215, 80) - elif self.fields[z][0] == 'marchew': - return (224, 60, 14) - elif self.fields[z][0] == 'rzodkiew': - return (142, 24, 104) - elif self.fields[z][0] == 'pietruszka': - return (254, 247, 246) - else: - return (0,0,0) + temp.append('n') + self.nawadnianie.append(temp) if __name__ == "__main__":