From fc757097395b4db5b6f3d468cef039441784cb85 Mon Sep 17 00:00:00 2001 From: Kosterix08 Date: Tue, 11 Jun 2024 18:14:54 +0200 Subject: [PATCH] using decisiontree to predict --- app.py | 18 +++++++++-- classes/agent.py | 2 ++ classes/data/data_initializer.py | 53 +++++++++++++++++++++++++------- classes/data/klient.py | 52 +++++++++++++++++++------------ classes/data/rachunek.py | 2 +- classes/data/zamowenie.py | 6 ++-- database/clients.xml | 35 +++++++++++++++++++-- decisiontree.py | 42 +++++++++++++++++-------- 8 files changed, 159 insertions(+), 51 deletions(-) diff --git a/app.py b/app.py index 2a952ab..6e7c6d9 100644 --- a/app.py +++ b/app.py @@ -11,11 +11,16 @@ import threading import time import random from classes.data.klient import Klient +from classes.data.klient import Klient +import xml.etree.ElementTree as ET +from decisiontree import predict_client + pygame.init() window = pygame.display.set_mode((prefs.WIDTH, prefs.HEIGHT)) pygame.display.set_caption("Game Window") table_coords = [(4, 4), (4, prefs.GRID_SIZE-5), (prefs.GRID_SIZE-5, 4), (prefs.GRID_SIZE-5, prefs.GRID_SIZE-5)] +from classes.data.data_initializer import clients chosen_coords = random.choice(table_coords) chosen_index = random.randint(0, len(table_coords)-1) @@ -117,6 +122,7 @@ def watekDlaSciezkiAgenta(): time.sleep(1) def watekDlaSciezkiKlienta(): + assigned = False time.sleep(3) while True: if len(path2) > 0: @@ -132,10 +138,18 @@ def watekDlaSciezkiKlienta(): x, y = element2 klient.moveto(x, y) - if klient.current_cell == cells[klientx_target][klienty_target]: + if not assigned and klient.current_cell == cells[klientx_target][klienty_target]: klient.przyStoliku = True klient.stolik = klient.current_cell - + random_client_data = random.choice(clients) + prediction = predict_client(random_client_data) + print("\nClient data:") + print(random_client_data) + print("Prediction (Adult):", prediction) + assigned = True + + if assigned: + break time.sleep(1) diff --git a/classes/agent.py b/classes/agent.py index 440a314..fde3351 100644 --- a/classes/agent.py +++ b/classes/agent.py @@ -275,6 +275,8 @@ class Agent: dx = abs(current[0] - target[0]) dy = abs(current[1] - target[1]) return dx + dy + + diff --git a/classes/data/data_initializer.py b/classes/data/data_initializer.py index c33d788..9deebb2 100644 --- a/classes/data/data_initializer.py +++ b/classes/data/data_initializer.py @@ -1,9 +1,11 @@ import xml.etree.ElementTree as ET -from posilek import Posilek -from klient import Klient -from kelner import Kelner -from stolik import Stolik -from zamowenie import Zamowienie +from classes.data.posilek import Posilek +from classes.data.klient import KlientCechy +from classes.data.klient import Klient +from classes.data.kelner import Kelner +from classes.data.stolik import Stolik +from classes.data.zamowenie import Zamowienie + with open('database\\meals.xml', 'r') as file: xml_data = file.read() tree = ET.ElementTree(ET.fromstring(xml_data)) @@ -70,16 +72,48 @@ for person in root.findall('person'): if favorite_meal in [meal.nazwa for meal in meals]: favorite_meal = next((meal for meal in meals if meal.nazwa == favorite_meal), None) + + wrinkles_element = person.find('Wrinkles') + wrinkles = wrinkles_element.text if wrinkles_element is not None else '' + + balding_element = person.find('Balding') + balding = balding_element.text if balding_element is not None else '' + + beard_element = person.find('Beard') + beard = beard_element.text if beard_element is not None else '' + + outfit_element = person.find('Outfit') + outfit = outfit_element.text if outfit_element is not None else '' + + glasses_element = person.find('Glasses') + glasses = glasses_element.text if glasses_element is not None else '' + + tattoo_element = person.find('Tattoo') + tattoo = tattoo_element.text if tattoo_element is not None else '' + + hair_element = person.find('Hair') + hair = hair_element.text if hair_element is not None else '' + + behaviour_element = person.find('Behaviour') + behaviour = behaviour_element.text if behaviour_element is not None else '' person_data = { 'imie': name, 'nazwisko': surname, 'wiek': age, 'ulubiony_posilek': favorite_meal, - 'restrykcje_dietowe': restrictions + 'restrykcje_dietowe': restrictions, + 'zmarszczki': wrinkles, + 'lysienie': balding, + 'broda': beard, + 'ubior': outfit, + 'okulary': glasses, + 'tatuaz': tattoo, + 'wlosy': hair, + 'zachowanie': behaviour } - clients.append(Klient(**person_data)) + clients.append(KlientCechy(**person_data)) # Use the person_instance as needed @@ -109,9 +143,6 @@ for server in root.findall('server'): servers.append(Kelner(**server_data)) - - - # Prezentacja uzycia przykładowego import random stoliki = [] @@ -143,7 +174,7 @@ for klient in [k for k in clients if k.stolik is not None]: print("----------------\n\n") -import logic_test as logic +import classes.data.logic_test as logic for klient in [k for k in clients if k.stolik is not None]: for zamownienie in klient.rachunek.zamowienia: diff --git a/classes/data/klient.py b/classes/data/klient.py index 9a83165..6cf7c60 100644 --- a/classes/data/klient.py +++ b/classes/data/klient.py @@ -4,6 +4,8 @@ import prefs import random import heapq from collections import deque +from classes.data.rachunek import Rachunek + class Klient: def __init__(self,x,y,cells): @@ -12,14 +14,7 @@ class Klient: self.current_cell = cells[x][y] self.current_x = x self.current_y = y - # self.imie = imie - # self.nazwisko = nazwisko - # self.wiek = wiek przyStoliku = False - self.stolik = None - # self.rachunek = Rachunek(random.randint(1,1000)) - # self.ulubiony_posilek = ulubiony_posilek - # self.restrykcje_dietowe = restrykcje_dietowe self.cells = cells self.X = x self.Y = y @@ -96,19 +91,6 @@ class Klient: self.last_move_time=pygame.time.get_ticks() print(self.direction) - - - def zloz_zamowienie(self,zamowienie,stolik): - if self.stolik is None: - self.stolik = stolik - stolik.przypisz_kelner(stolik.kelner) - self.rachunek.dodaj_zamowienie(zamowienie) - print(f"Klinet {self.imie} {self.nazwisko} zlozyl zamowienie przy stoliku {stolik.numer_stolika} i przyjal je kelner {stolik.kelner.numer_pracowniczy}.") - else: - print("Klient ma juz przypisany stolik.") - - def __str__(self): - return f"Klient: {self.imie} {self.nazwisko} {self.wiek}, ulubione Danie: {self.ulubiony_posilek}, restrykcje diet: {self.restrykcje_dietowe}" def get_possible_moves(self): possible_moves = [] @@ -198,4 +180,34 @@ class Klient: dx = abs(current[0] - target[0]) dy = abs(current[1] - target[1]) return dx + dy + +class KlientCechy: + def __init__(self,imie,nazwisko,wiek,ulubiony_posilek,restrykcje_dietowe,zmarszczki, lysienie, broda, ubior, okulary, tatuaz, wlosy, zachowanie): + self.imie = imie + self.nazwisko = nazwisko + self.wiek = wiek + self.ulubiony_posilek = ulubiony_posilek + self.restrykcje_dietowe = restrykcje_dietowe + self.zmarszczki = zmarszczki + self.lysienie = lysienie + self.broda = broda + self.ubior = ubior + self.okulary = okulary + self.tatuaz = tatuaz + self.wlosy = wlosy + self.zachowanie = zachowanie + self.stolik = None + self.rachunek = Rachunek(random.randint(1,1000)) + + def zloz_zamowienie(self,zamowienie,stolik): + if self.stolik is None: + self.stolik = stolik + stolik.przypisz_kelner(stolik.kelner) + self.rachunek.dodaj_zamowienie(zamowienie) + print(f"Klinet {self.imie} {self.nazwisko} zlozyl zamowienie przy stoliku {stolik.numer_stolika} i przyjal je kelner {stolik.kelner.numer_pracowniczy}.") + else: + print("Klient ma juz przypisany stolik.") + + def __str__(self): + return f"Klient: {self.imie} {self.nazwisko} {self.wiek}, ulubione Danie: {self.ulubiony_posilek}, restrykcje diet: {self.restrykcje_dietowe}. Jego cechy to: zmarszczki: {self.zmarszczki}, lysienie: {self.lysienie}, broda: {self.broda}, ubior: {self.ubior}, okulary: {self.okulary}, tatuaz: {self.tatuaz}, wlosy: {self.wlosy}, zachowanie: {self.zachowanie}" diff --git a/classes/data/rachunek.py b/classes/data/rachunek.py index dd55979..70b5671 100644 --- a/classes/data/rachunek.py +++ b/classes/data/rachunek.py @@ -1,6 +1,6 @@ import pygame -from zamowenie import Zamowienie +from classes.data.zamowenie import Zamowienie class Rachunek: def __init__(self,numer_zamowienia): self.numer_zamowienia = numer_zamowienia diff --git a/classes/data/zamowenie.py b/classes/data/zamowenie.py index 0c25676..401d022 100644 --- a/classes/data/zamowenie.py +++ b/classes/data/zamowenie.py @@ -1,7 +1,7 @@ import pygame -from stolik import Stolik -from kelner import Kelner -from posilek import Posilek +from classes.data.stolik import Stolik +from classes.data.kelner import Kelner +from classes.data.posilek import Posilek class Zamowienie: def __init__(self,numer_zamowienia,posilek): self.numer_zamowienia = numer_zamowienia diff --git a/database/clients.xml b/database/clients.xml index 9ddb023..098221b 100644 --- a/database/clients.xml +++ b/database/clients.xml @@ -5,6 +5,14 @@ 21 Tatar Meat + No + Yes + Yes + Messy + No + No + Color + Energetic Kamil @@ -12,6 +20,14 @@ 17 Pomidorowa z Makaronem Vegetarian + No + No + No + Messy + No + No + Color + Energetic Jon @@ -19,7 +35,14 @@ 23 Grochówka Vegan - + No + No + No + Messy + No + No + Color + Energetic Andrzej @@ -27,5 +50,13 @@ 44 Spaghetti Bolognese Meat + No + No + No + Messy + No + No + Color + Energetic - + \ No newline at end of file diff --git a/decisiontree.py b/decisiontree.py index 4581a27..cbd96d4 100644 --- a/decisiontree.py +++ b/decisiontree.py @@ -38,13 +38,13 @@ clf_en = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=0 clf_en.fit(X_train, y_train) y_pred_en = clf_en.predict(X_test) -print('Model accuracy score with criterion entropy: {0:0.4f}'.format(accuracy_score(y_test, y_pred_en))) +#print('Model accuracy score with criterion entropy: {0:0.4f}'.format(accuracy_score(y_test, y_pred_en))) y_pred_train_en = clf_en.predict(X_train) -print('Training-set accuracy score: {0:0.4f}'.format(accuracy_score(y_train, y_pred_train_en))) +#print('Training-set accuracy score: {0:0.4f}'.format(accuracy_score(y_train, y_pred_train_en))) -print('Training set score: {:.4f}'.format(clf_en.score(X_train, y_train))) -print('Test set score: {:.4f}'.format(clf_en.score(X_test, y_test))) +#print('Training set score: {:.4f}'.format(clf_en.score(X_train, y_train))) +#print('Test set score: {:.4f}'.format(clf_en.score(X_test, y_test))) dot_data = tree.export_graphviz(clf_en, out_file=None, feature_names=X_train.columns, @@ -53,7 +53,7 @@ dot_data = tree.export_graphviz(clf_en, out_file=None, special_characters=True) #nowy klient testowo -new_client = { +"""new_client = { "Wrinkles": random.choice(['Yes', 'No']), "Balding": random.choice(['Yes', 'No']), "Beard": random.choice(['Yes', 'No']), @@ -62,15 +62,33 @@ new_client = { "Tattoo": random.choice(['Yes', 'No']), "Hair": random.choice(['Color', 'Grey', 'Natural']), "Behaviour": random.choice(['Energetic', 'Stressed', 'Calm']) -} +} """ -new_client_df = pd.DataFrame(new_client, index=[0]) -new_client_df_encoded = encoder.transform(new_client_df) -prediction = clf_en.predict(new_client_df_encoded) +def predict_client(client_data): + new_client = { + "Wrinkles": client_data.zmarszczki, + "Balding": client_data.lysienie, + "Beard": client_data.broda, + "Outfit": client_data.ubior, + "Glasses": client_data.okulary, + "Tattoo": client_data.tatuaz, + "Hair": client_data.wlosy, + "Behaviour": client_data.zachowanie + } + new_client_df = pd.DataFrame(new_client, index=[0]) + new_client_df_encoded = encoder.transform(new_client_df) + prediction = clf_en.predict(new_client_df_encoded) + print('Model accuracy score with criterion entropy: {0:0.4f}'.format(accuracy_score(y_test, y_pred_en))) + print('Training-set accuracy score: {0:0.4f}'.format(accuracy_score(y_train, y_pred_train_en))) -print("\nNew client:") -print(new_client_df) -print("Prediction:", prediction[0]) + print('Training set score: {:.4f}'.format(clf_en.score(X_train, y_train))) + print('Test set score: {:.4f}'.format(clf_en.score(X_test, y_test))) + + return prediction[0] + +#print("\nNew client:") +#print(new_client_df) +#print("Prediction:", prediction[0]) #graph = graphviz.Source(dot_data) #graph.render("decision_tree", format='png')