drzewo decyzyjne

This commit is contained in:
Michał Szuszert 2022-05-12 01:21:26 +02:00
parent a8b0c0f710
commit d7d904a4be
3 changed files with 164 additions and 28 deletions

BIN
data.xlsx Normal file

Binary file not shown.

View File

@ -1,36 +1,40 @@
[ [
{ {
"name": "margherita", "name": "margherita",
"pos_in_card": 0,
"price": 20, "price": 20,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
"size": 30, "size": 30,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese" ], "ingridients": [ "cheese" ],
"drink_in": true "drink_in": true
}, },
{ {
"name": "hawajska", "name": "hawajska",
"pos_in_card": 1,
"price": 22, "price": 22,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
"size": 50, "size": 50,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "ham", "pineapple" ], "ingridients": [ "cheese", "ham", "pineapple" ],
"drink_in": true "drink_in": true
}, },
{ {
"name": "funghi", "name": "funghi",
"pos_in_card": 2,
"price": 22, "price": 22,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
"size": 30, "size": 30,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "mushrooms" ], "ingridients": [ "cheese", "mushrooms" ],
"drink_in": true "drink_in": true
}, },
{ {
"name": "light", "name": "light",
"pos_in_card": 3,
"price": 24, "price": 24,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
@ -41,36 +45,40 @@
}, },
{ {
"name": "4 sery", "name": "4 sery",
"pos_in_card": 4,
"price": 24, "price": 24,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
"size": 50, "size": 50,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "mozzarella", "parmesan", "gorgonzola" ], "ingridients": [ "cheese", "mozzarella", "parmesan", "gorgonzola" ],
"drink_in": true "drink_in": true
}, },
{ {
"name": "pepperoni", "name": "pepperoni",
"pos_in_card": 5,
"price": 25, "price": 25,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
"size": 50, "size": 50,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "onion", "pepperoni" ], "ingridients": [ "cheese", "onion", "pepperoni" ],
"drink_in": true "drink_in": true
}, },
{ {
"name": "salami", "name": "salami",
"pos_in_card": 6,
"price": 25, "price": 25,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
"size": 30, "size": 30,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "salami" ], "ingridients": [ "cheese", "salami" ],
"drink_in": true "drink_in": true
}, },
{ {
"name": "wegetarianska", "name": "wegetarianska",
"pos_in_card": 7,
"price": 25, "price": 25,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
@ -81,6 +89,7 @@
}, },
{ {
"name": "barbecue", "name": "barbecue",
"pos_in_card": 8,
"price": 26, "price": 26,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
@ -91,16 +100,18 @@
}, },
{ {
"name": "miesna", "name": "miesna",
"pos_in_card": 9,
"price": 27, "price": 27,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
"size": 30, "size": 30,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "ham", "salami", "sausage", "bacon" ], "ingridients": [ "cheese", "ham", "salami", "sausage", "bacon" ],
"drink_in": false "drink_in": false
}, },
{ {
"name": "paprykowa", "name": "paprykowa",
"pos_in_card": 10,
"price": 27, "price": 27,
"spiciness": true, "spiciness": true,
"vege": true, "vege": true,
@ -111,16 +122,18 @@
}, },
{ {
"name": "jalapeno", "name": "jalapeno",
"pos_in_card": 11,
"price": 27, "price": 27,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
"size": 50, "size": 50,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "bacon", "pepper", "onion", "jalapeno" ], "ingridients": [ "cheese", "bacon", "pepper", "onion", "jalapeno" ],
"drink_in": false "drink_in": false
}, },
{ {
"name": "barbecue wege", "name": "barbecue wege",
"pos_in_card": 12,
"price": 27, "price": 27,
"spiciness": true, "spiciness": true,
"vege": true, "vege": true,
@ -131,6 +144,7 @@
}, },
{ {
"name": "kebab", "name": "kebab",
"pos_in_card": 13,
"price": 32, "price": 32,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
@ -141,6 +155,7 @@
}, },
{ {
"name": "grecka", "name": "grecka",
"pos_in_card": 14,
"price": 34, "price": 34,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
@ -151,6 +166,7 @@
}, },
{ {
"name": "piekielna", "name": "piekielna",
"pos_in_card": 15,
"price": 37, "price": 37,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
@ -161,6 +177,7 @@
}, },
{ {
"name": "drwala", "name": "drwala",
"pos_in_card": 16,
"price": 37, "price": 37,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
@ -171,6 +188,7 @@
}, },
{ {
"name": "grzybowa", "name": "grzybowa",
"pos_in_card": 17,
"price": 37, "price": 37,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
@ -181,16 +199,18 @@
}, },
{ {
"name": "staropolska", "name": "staropolska",
"pos_in_card": 18,
"price": 40, "price": 40,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
"size": 30, "size": 30,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "chicken", "mushrooms", "sausage", "ham" ], "ingridients": [ "cheese", "chicken", "mushrooms", "sausage", "ham" ],
"drink_in": true "drink_in": true
}, },
{ {
"name": "goralska", "name": "goralska",
"pos_in_card": 19,
"price": 42, "price": 42,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
@ -201,6 +221,7 @@
}, },
{ {
"name": "prosciutto", "name": "prosciutto",
"pos_in_card": 20,
"price": 43, "price": 43,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
@ -211,6 +232,7 @@
}, },
{ {
"name": "broccoli", "name": "broccoli",
"pos_in_card": 21,
"price": 44, "price": 44,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
@ -221,26 +243,29 @@
}, },
{ {
"name": "americana", "name": "americana",
"pos_in_card": 22,
"price": 45, "price": 45,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
"size": 50, "size": 50,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "salami", "papperoni", "onion", "corn" ], "ingridients": [ "cheese", "salami", "papperoni", "onion", "corn" ],
"drink_in": false "drink_in": true
}, },
{ {
"name": "farmerska", "name": "farmerska",
"pos_in_card": 23,
"price": 47, "price": 47,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
"size": 30, "size": 30,
"allergens": "", "allergens": "none",
"ingridients": [ "cheese", "sausage", "ham", "salami", "chicken", "pepperoni" ], "ingridients": [ "cheese", "sausage", "ham", "salami", "chicken", "pepperoni" ],
"drink_in": false "drink_in": false
}, },
{ {
"name": "nachos", "name": "nachos",
"pos_in_card": 24,
"price": 48, "price": 48,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
@ -251,6 +276,7 @@
}, },
{ {
"name": "texas", "name": "texas",
"pos_in_card": 25,
"price": 48, "price": 48,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
@ -261,16 +287,18 @@
}, },
{ {
"name": "kurczak", "name": "kurczak",
"pos_in_card": 26,
"price": 49, "price": 49,
"spiciness": false, "spiciness": false,
"vege": false, "vege": false,
"size": 50, "size": 50,
"allergens": "tomato", "allergens": "tomato",
"ingridients": [ "cheese", "chicken", "onion", "corn", "toamto" ], "ingridients": [ "cheese", "chicken", "onion", "corn", "toamto" ],
"drink_in": false "drink_in": true
}, },
{ {
"name": "zielona", "name": "zielona",
"pos_in_card": 27,
"price": 50, "price": 50,
"spiciness": false, "spiciness": false,
"vege": true, "vege": true,
@ -281,13 +309,14 @@
}, },
{ {
"name": "mix", "name": "mix",
"pos_in_card": 28,
"price": 50, "price": 50,
"spiciness": true, "spiciness": true,
"vege": false, "vege": false,
"size": 50, "size": 50,
"allergens": "feta", "allergens": "feta",
"ingridients": [ "cheese", "ham", "salami", "papperoni", "sausage", "mushrooms", "corn", "broccoli", "pineapple", "feta" ], "ingridients": [ "cheese", "ham", "salami", "papperoni", "sausage", "mushrooms", "corn", "broccoli", "pineapple", "feta" ],
"drink_in": false "drink_in": true
} }
] ]

135
tiles.py
View File

@ -5,6 +5,10 @@ import pygame
import pytmx import pytmx
from queue import Queue from queue import Queue
import math import math
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import json
pygame.init() pygame.init()
@ -117,8 +121,9 @@ def check_collision_with_chair(x,y):
class Food: class Food:
def __init__(self, name, price, spiciness, vege, size, allergens, ingridients, drink_in): def __init__(self, name, pos_in_card, price, spiciness, vege, size, allergens, ingridients, drink_in):
self.name = name self.name = name
self.pos_in_card = pos_in_card
self.price = price self.price = price
self.spiciness = spiciness self.spiciness = spiciness
self.vege = vege self.vege = vege
@ -373,6 +378,7 @@ def astar(map, start, end):
continue continue
open_list.append(child) open_list.append(child)
def tell_preferences(): def tell_preferences():
possibilities = [[30, 40 ,50, None], possibilities = [[30, 40 ,50, None],
[True, False, None], [True, False, None],
@ -384,17 +390,110 @@ def tell_preferences():
choices = [] choices = []
for i in possibilities: for i in possibilities:
choices.append(random.choice(i)) choices.append(random.choice(i))
preferences = {
"budget": choices[0],
"spiciness": choices[1],
"vege": choices[2],
"level_of_hunger": choices[3],
"allergy": choices[4],
"favorite_ingridient": choices[5],
"drink_in": choices[6]
}
return preferences
return choices
def evaluate_preferences(preferences):
data = []
if preferences[0] == 30:
data.append(30)
elif preferences[0] == 40:
data.append(40)
elif preferences[0] == 50:
data.append(50)
else:
data.append(random.choice([30, 40, 50]))
if preferences[1] is True:
data.append(1)
elif preferences[1] is False:
data.append(0)
else:
data.append(random.choice([1, 0]))
if preferences[2] is True:
data.append(1)
elif preferences[2] is False:
data.append(0)
else:
data.append(random.choice([1, 0]))
if preferences[3] == 'low':
data.append(30)
elif preferences[3] == 'high':
data.append(50)
else:
data.append(random.choice([30, 50]))
if preferences[4] == 'tomato':
data.append(1)
elif preferences[4] == 'olives':
data.append(3)
elif preferences[4] == 'feta':
data.append(2)
else:
data.append(0)
if preferences[5] == 'salami':
data.append(1)
elif preferences[5] == 'mushrooms':
data.append(2)
elif preferences[5] == 'pineapple':
data.append(3)
elif preferences[5] == 'shrimps':
data.append(4)
elif preferences[5] == 'sausage':
data.append(5)
else:
data.append(0)
if preferences[6] is True:
data.append(1)
elif preferences[6] is False:
data.append(0)
else:
data.append(random.choice([1, 0]))
return data
def choose_pizza(prefernce):
df = pd.read_excel("data.xlsx")
d = {'low': 30, 'high': 50}
df['level of hunger'] = df['level of hunger'].map(d)
d = {'none': 0, 'tomato': 1, 'feta': 2, 'olives': 3}
df['allergy'] = df['allergy'].map(d)
d = {'none': 0, 'salami': 1, 'mushrooms': 2, 'pineapple': 3, 'shrimps': 4, 'sausage': 5}
df['favorite ingridient'] = df['favorite ingridient'].map(d)
d = {'margherita': 0, 'hawajska': 1, 'funghi': 2, 'light': 3, '4 sery': 4, 'pepperoni': 5,
'salami': 6, 'wegetarianska': 7, 'barbecue': 8, 'miesna': 9, 'paprykowa': 10,
'jalapeno': 11, 'barbecue wege': 12, 'kebab': 13, 'grecka': 14, 'piekielna': 15,
'drwala': 16, 'grzybowa': 17, 'staropolska': 18, 'goralska': 19, 'prosciutto': 20,
'broccoli': 21, 'americana': 22, 'farmerska': 23, 'nachos': 24, 'texas': 25,
'kurczak': 26, 'zielona': 27, 'mix': 28}
df['pizza'] = df['pizza'].map(d)
features = ['budget', 'spiciness', 'vege', 'level of hunger', 'allergy', 'favorite ingridient', 'drink in']
x = df[features]
y = df['pizza']
x_train, x_test, y_train, y_test = train_test_split(x, y)
clf = DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(x_train, y_train)
return clf.predict([prefernce])
def get_pizza(number):
with open("dishes.json") as f:
data = json.load(f)
for i in data:
if i["pos_in_card"] == int(number):
food = Food(i['name'], i['pos_in_card'], i['price'], i['spiciness'], i['vege'], i['size'], i['allergens'], i['ingridients'], i['drink_in'])
return food
map = Map() map = Map()
waiter = Waiter([32, 32]) waiter = Waiter([32, 32])
@ -454,11 +553,9 @@ def main():
if y > 608 or y < 32 or x > 608 or x < 32 or check_collision_with_table(y,x) or check_collision_with_chair(y, x): if y > 608 or y < 32 or x > 608 or x < 32 or check_collision_with_table(y,x) or check_collision_with_chair(y, x):
print("I can't go there") print("I can't go there")
break break
print(x,y)
goal = (x // 32, y // 32) goal = (x // 32, y // 32)
route = astar(map.get_arr(), (waiter.loc[1] // 32, waiter.loc[0] // 32), goal) route = astar(map.get_arr(), (waiter.loc[1] // 32, waiter.loc[0] // 32), goal)
direction = [(x[1] - y[1], x[0] - y[0]) for x, y in zip(route[1:], route)] direction = [(x[1] - y[1], x[0] - y[0]) for x, y in zip(route[1:], route)]
print(waiter.loc)
break break
elif middle: elif middle:
if client.loc[0] in [64, 128, 192, 256, 352, 416, 480, 544]: if client.loc[0] in [64, 128, 192, 256, 352, 416, 480, 544]:
@ -478,8 +575,18 @@ def main():
direction = [(x[1] - y[1], x[0] - y[0]) for x, y in zip(route[1:], route)] direction = [(x[1] - y[1], x[0] - y[0]) for x, y in zip(route[1:], route)]
break break
print("Hello Sir, tell me yours preferences") print("Hello Sir, tell me yours preferences")
print("Pass: 'budget', 'spiciness', 'vege', 'level_of_hunger', 'allergy', 'favorite_ingridient', 'drink_in'\n")
print("Here is my list of preferences") print("Here is my list of preferences")
print(tell_preferences()) ingridients = tell_preferences()
print(ingridients)
print()
evaluated_ingridients = evaluate_preferences(ingridients)
number_of_pizza = choose_pizza(evaluated_ingridients)
pizza = get_pizza(number_of_pizza)
print("In case we don't offer pizza with identical ingredients, we offer:")
print("Name = {}, pos_in_card - {}, price = {}, spiciness = {}, vege = {}, size = {}, allergens = {}, ingridients = {}, drink_in = {}\n"
.format(pizza.name,pizza.pos_in_card,pizza.price, pizza.spiciness,pizza.vege,pizza.size,pizza.allergens,pizza.ingridients,pizza.drink_in))
if len(direction) > 0: if len(direction) > 0:
d = direction.pop(0) d = direction.pop(0)