using decisiontree to predict
This commit is contained in:
parent
5932ba1f93
commit
fc75709739
16
app.py
16
app.py
@ -11,11 +11,16 @@ import threading
|
|||||||
import time
|
import time
|
||||||
import random
|
import random
|
||||||
from classes.data.klient import Klient
|
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()
|
pygame.init()
|
||||||
window = pygame.display.set_mode((prefs.WIDTH, prefs.HEIGHT))
|
window = pygame.display.set_mode((prefs.WIDTH, prefs.HEIGHT))
|
||||||
pygame.display.set_caption("Game Window")
|
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)]
|
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_coords = random.choice(table_coords)
|
||||||
chosen_index = random.randint(0, len(table_coords)-1)
|
chosen_index = random.randint(0, len(table_coords)-1)
|
||||||
@ -117,6 +122,7 @@ def watekDlaSciezkiAgenta():
|
|||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
def watekDlaSciezkiKlienta():
|
def watekDlaSciezkiKlienta():
|
||||||
|
assigned = False
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
while True:
|
while True:
|
||||||
if len(path2) > 0:
|
if len(path2) > 0:
|
||||||
@ -132,10 +138,18 @@ def watekDlaSciezkiKlienta():
|
|||||||
x, y = element2
|
x, y = element2
|
||||||
klient.moveto(x, y)
|
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.przyStoliku = True
|
||||||
klient.stolik = klient.current_cell
|
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)
|
time.sleep(1)
|
||||||
|
|
||||||
|
@ -290,3 +290,5 @@ class Agent:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
from posilek import Posilek
|
from classes.data.posilek import Posilek
|
||||||
from klient import Klient
|
from classes.data.klient import KlientCechy
|
||||||
from kelner import Kelner
|
from classes.data.klient import Klient
|
||||||
from stolik import Stolik
|
from classes.data.kelner import Kelner
|
||||||
from zamowenie import Zamowienie
|
from classes.data.stolik import Stolik
|
||||||
|
from classes.data.zamowenie import Zamowienie
|
||||||
|
|
||||||
with open('database\\meals.xml', 'r') as file:
|
with open('database\\meals.xml', 'r') as file:
|
||||||
xml_data = file.read()
|
xml_data = file.read()
|
||||||
tree = ET.ElementTree(ET.fromstring(xml_data))
|
tree = ET.ElementTree(ET.fromstring(xml_data))
|
||||||
@ -71,15 +73,47 @@ for person in root.findall('person'):
|
|||||||
if favorite_meal in [meal.nazwa for meal in meals]:
|
if favorite_meal in [meal.nazwa for meal in meals]:
|
||||||
favorite_meal = next((meal for meal in meals if meal.nazwa == favorite_meal), None)
|
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 = {
|
person_data = {
|
||||||
'imie': name,
|
'imie': name,
|
||||||
'nazwisko': surname,
|
'nazwisko': surname,
|
||||||
'wiek': age,
|
'wiek': age,
|
||||||
'ulubiony_posilek': favorite_meal,
|
'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
|
# Use the person_instance as needed
|
||||||
|
|
||||||
|
|
||||||
@ -109,9 +143,6 @@ for server in root.findall('server'):
|
|||||||
servers.append(Kelner(**server_data))
|
servers.append(Kelner(**server_data))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Prezentacja uzycia przykładowego
|
# Prezentacja uzycia przykładowego
|
||||||
import random
|
import random
|
||||||
stoliki = []
|
stoliki = []
|
||||||
@ -143,7 +174,7 @@ for klient in [k for k in clients if k.stolik is not None]:
|
|||||||
|
|
||||||
print("----------------\n\n")
|
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 klient in [k for k in clients if k.stolik is not None]:
|
||||||
for zamownienie in klient.rachunek.zamowienia:
|
for zamownienie in klient.rachunek.zamowienia:
|
||||||
|
@ -4,6 +4,8 @@ import prefs
|
|||||||
import random
|
import random
|
||||||
import heapq
|
import heapq
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
from classes.data.rachunek import Rachunek
|
||||||
|
|
||||||
|
|
||||||
class Klient:
|
class Klient:
|
||||||
def __init__(self,x,y,cells):
|
def __init__(self,x,y,cells):
|
||||||
@ -12,14 +14,7 @@ class Klient:
|
|||||||
self.current_cell = cells[x][y]
|
self.current_cell = cells[x][y]
|
||||||
self.current_x = x
|
self.current_x = x
|
||||||
self.current_y = y
|
self.current_y = y
|
||||||
# self.imie = imie
|
|
||||||
# self.nazwisko = nazwisko
|
|
||||||
# self.wiek = wiek
|
|
||||||
przyStoliku = False
|
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.cells = cells
|
||||||
self.X = x
|
self.X = x
|
||||||
self.Y = y
|
self.Y = y
|
||||||
@ -97,19 +92,6 @@ class Klient:
|
|||||||
print(self.direction)
|
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):
|
def get_possible_moves(self):
|
||||||
possible_moves = []
|
possible_moves = []
|
||||||
|
|
||||||
@ -199,3 +181,33 @@ class Klient:
|
|||||||
dy = abs(current[1] - target[1])
|
dy = abs(current[1] - target[1])
|
||||||
return dx + dy
|
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}"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import pygame
|
import pygame
|
||||||
|
|
||||||
from zamowenie import Zamowienie
|
from classes.data.zamowenie import Zamowienie
|
||||||
class Rachunek:
|
class Rachunek:
|
||||||
def __init__(self,numer_zamowienia):
|
def __init__(self,numer_zamowienia):
|
||||||
self.numer_zamowienia = numer_zamowienia
|
self.numer_zamowienia = numer_zamowienia
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import pygame
|
import pygame
|
||||||
from stolik import Stolik
|
from classes.data.stolik import Stolik
|
||||||
from kelner import Kelner
|
from classes.data.kelner import Kelner
|
||||||
from posilek import Posilek
|
from classes.data.posilek import Posilek
|
||||||
class Zamowienie:
|
class Zamowienie:
|
||||||
def __init__(self,numer_zamowienia,posilek):
|
def __init__(self,numer_zamowienia,posilek):
|
||||||
self.numer_zamowienia = numer_zamowienia
|
self.numer_zamowienia = numer_zamowienia
|
||||||
|
@ -5,6 +5,14 @@
|
|||||||
<age>21</age>
|
<age>21</age>
|
||||||
<favoriteMeal>Tatar</favoriteMeal>
|
<favoriteMeal>Tatar</favoriteMeal>
|
||||||
<restrictions>Meat</restrictions>
|
<restrictions>Meat</restrictions>
|
||||||
|
<Wrinkles>No</Wrinkles>
|
||||||
|
<Balding>Yes</Balding>
|
||||||
|
<Beard>Yes</Beard>
|
||||||
|
<Outfit>Messy</Outfit>
|
||||||
|
<Glasses>No</Glasses>
|
||||||
|
<Tattoo>No</Tattoo>
|
||||||
|
<Hair>Color</Hair>
|
||||||
|
<Behaviour>Energetic</Behaviour>
|
||||||
</person>
|
</person>
|
||||||
<person>
|
<person>
|
||||||
<name>Kamil</name>
|
<name>Kamil</name>
|
||||||
@ -12,6 +20,14 @@
|
|||||||
<age>17</age>
|
<age>17</age>
|
||||||
<favoriteMeal>Pomidorowa z Makaronem</favoriteMeal>
|
<favoriteMeal>Pomidorowa z Makaronem</favoriteMeal>
|
||||||
<restrictions>Vegetarian</restrictions>
|
<restrictions>Vegetarian</restrictions>
|
||||||
|
<Wrinkles>No</Wrinkles>
|
||||||
|
<Balding>No</Balding>
|
||||||
|
<Beard>No</Beard>
|
||||||
|
<Outfit>Messy</Outfit>
|
||||||
|
<Glasses>No</Glasses>
|
||||||
|
<Tattoo>No</Tattoo>
|
||||||
|
<Hair>Color</Hair>
|
||||||
|
<Behaviour>Energetic</Behaviour>
|
||||||
</person>
|
</person>
|
||||||
<person>
|
<person>
|
||||||
<name>Jon</name>
|
<name>Jon</name>
|
||||||
@ -19,7 +35,14 @@
|
|||||||
<age>23</age>
|
<age>23</age>
|
||||||
<favoriteMeal>Grochówka</favoriteMeal>
|
<favoriteMeal>Grochówka</favoriteMeal>
|
||||||
<restrictions>Vegan</restrictions>
|
<restrictions>Vegan</restrictions>
|
||||||
|
<Wrinkles>No</Wrinkles>
|
||||||
|
<Balding>No</Balding>
|
||||||
|
<Beard>No</Beard>
|
||||||
|
<Outfit>Messy</Outfit>
|
||||||
|
<Glasses>No</Glasses>
|
||||||
|
<Tattoo>No</Tattoo>
|
||||||
|
<Hair>Color</Hair>
|
||||||
|
<Behaviour>Energetic</Behaviour>
|
||||||
</person>
|
</person>
|
||||||
<person>
|
<person>
|
||||||
<name>Andrzej</name>
|
<name>Andrzej</name>
|
||||||
@ -27,5 +50,13 @@
|
|||||||
<age>44</age>
|
<age>44</age>
|
||||||
<favoriteMeal>Spaghetti Bolognese</favoriteMeal>
|
<favoriteMeal>Spaghetti Bolognese</favoriteMeal>
|
||||||
<restrictions>Meat</restrictions>
|
<restrictions>Meat</restrictions>
|
||||||
|
<Wrinkles>No</Wrinkles>
|
||||||
|
<Balding>No</Balding>
|
||||||
|
<Beard>No</Beard>
|
||||||
|
<Outfit>Messy</Outfit>
|
||||||
|
<Glasses>No</Glasses>
|
||||||
|
<Tattoo>No</Tattoo>
|
||||||
|
<Hair>Color</Hair>
|
||||||
|
<Behaviour>Energetic</Behaviour>
|
||||||
</person>
|
</person>
|
||||||
</people>
|
</people>
|
@ -38,13 +38,13 @@ clf_en = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=0
|
|||||||
clf_en.fit(X_train, y_train)
|
clf_en.fit(X_train, y_train)
|
||||||
|
|
||||||
y_pred_en = clf_en.predict(X_test)
|
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)
|
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('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('Test set score: {:.4f}'.format(clf_en.score(X_test, y_test)))
|
||||||
|
|
||||||
dot_data = tree.export_graphviz(clf_en, out_file=None,
|
dot_data = tree.export_graphviz(clf_en, out_file=None,
|
||||||
feature_names=X_train.columns,
|
feature_names=X_train.columns,
|
||||||
@ -53,7 +53,7 @@ dot_data = tree.export_graphviz(clf_en, out_file=None,
|
|||||||
special_characters=True)
|
special_characters=True)
|
||||||
|
|
||||||
#nowy klient testowo
|
#nowy klient testowo
|
||||||
new_client = {
|
"""new_client = {
|
||||||
"Wrinkles": random.choice(['Yes', 'No']),
|
"Wrinkles": random.choice(['Yes', 'No']),
|
||||||
"Balding": random.choice(['Yes', 'No']),
|
"Balding": random.choice(['Yes', 'No']),
|
||||||
"Beard": random.choice(['Yes', 'No']),
|
"Beard": random.choice(['Yes', 'No']),
|
||||||
@ -62,15 +62,33 @@ new_client = {
|
|||||||
"Tattoo": random.choice(['Yes', 'No']),
|
"Tattoo": random.choice(['Yes', 'No']),
|
||||||
"Hair": random.choice(['Color', 'Grey', 'Natural']),
|
"Hair": random.choice(['Color', 'Grey', 'Natural']),
|
||||||
"Behaviour": random.choice(['Energetic', 'Stressed', 'Calm'])
|
"Behaviour": random.choice(['Energetic', 'Stressed', 'Calm'])
|
||||||
}
|
} """
|
||||||
|
|
||||||
|
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 = pd.DataFrame(new_client, index=[0])
|
||||||
new_client_df_encoded = encoder.transform(new_client_df)
|
new_client_df_encoded = encoder.transform(new_client_df)
|
||||||
prediction = clf_en.predict(new_client_df_encoded)
|
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('Training set score: {:.4f}'.format(clf_en.score(X_train, y_train)))
|
||||||
print(new_client_df)
|
print('Test set score: {:.4f}'.format(clf_en.score(X_test, y_test)))
|
||||||
print("Prediction:", prediction[0])
|
|
||||||
|
return prediction[0]
|
||||||
|
|
||||||
|
#print("\nNew client:")
|
||||||
|
#print(new_client_df)
|
||||||
|
#print("Prediction:", prediction[0])
|
||||||
|
|
||||||
#graph = graphviz.Source(dot_data)
|
#graph = graphviz.Source(dot_data)
|
||||||
#graph.render("decision_tree", format='png')
|
#graph.render("decision_tree", format='png')
|
||||||
|
Loading…
Reference in New Issue
Block a user