Upload files to "/"

Dodano drzewo decyzyjne
This commit is contained in:
s481847 2024-06-13 15:28:32 +02:00
parent 2e1edf91c4
commit c7e8b64c2f
2 changed files with 465 additions and 57 deletions

265
main.py
View File

@ -1,29 +1,33 @@
import pygame import pygame
import random import random
import time import time
import pandas as pd
import math
import matplotlib.pyplot as plt
kuchnia_xy = 0 kuchnia_xy = 0
pozycja_startowa = 0 pozycja_startowa = 0
losuj_uklad = False #Gdy True, losuje uklad stolikow oraz przeszkod losuj_uklad = False # Gdy True, losuje uklad stolikow oraz przeszkod
#------------Ustawienia siatki # ------------Ustawienia siatki
blockSize = 60 blockSize = 60
rows = 14 rows = 14
columns = 24 columns = 24
#-----------------------------Inicjacja klas
# -----------------------------Inicjacja klas
class Kelner: class Kelner:
def __init__(self, x, y): def __init__(self, x, y):
self.x = x self.x = x
self.y = y self.y = y
self.speed = 80 # od 0 do 100, preferowane 80 self.speed = 80 # od 0 do 100, preferowane 80
self.stanPrzestrzeni = [0,0,0] self.stanPrzestrzeni = [0, 0, 0]
self.stan = "stoi" # Stan kelnera: stoi, odbiera lub wraca self.stan = "stoi" # Stan kelnera: stoi, odbiera lub wraca
self.stolik_docelowy = None # Stolik, do którego idzie kelner self.stolik_docelowy = None # Stolik, do którego idzie kelner
self.chodzi = True self.chodzi = True
self.cel_x = x self.cel_x = x
self.cel_y = y self.cel_y = y
self.kierunek = 0 # 0 - północ, 1 - wschód, 2 - południe, 3 - zachód self.kierunek = 0 # 0 - północ, 1 - wschód, 2 - południe, 3 - zachód
self.indexRuchu = 0 self.indexRuchu = 0
def wklej(self): def wklej(self):
@ -41,7 +45,7 @@ class Kelner:
def obrot_w_lewo(self): def obrot_w_lewo(self):
self.kierunek = (self.kierunek - 1) % 4 self.kierunek = (self.kierunek - 1) % 4
self.stanPrzestrzeni[2] = (self.stanPrzestrzeni[2] - 1) % 4 self.stanPrzestrzeni[2] = (self.stanPrzestrzeni[2] - 1) % 4
def obrot_w_prawo(self): def obrot_w_prawo(self):
self.kierunek = (self.kierunek + 1) % 4 self.kierunek = (self.kierunek + 1) % 4
@ -49,18 +53,17 @@ class Kelner:
def idz_do_przodu(self): def idz_do_przodu(self):
if self.kierunek == 0: if self.kierunek == 0:
self.y -= 1 self.y -= 1
self.stanPrzestrzeni[1] -= 1 self.stanPrzestrzeni[1] -= 1
elif self.kierunek == 1: elif self.kierunek == 1:
self.x += 1 self.x += 1
self.stanPrzestrzeni[0] += 1 self.stanPrzestrzeni[0] += 1
elif self.kierunek == 2: elif self.kierunek == 2:
self.y += 1 self.y += 1
self.stanPrzestrzeni[1] += 1 self.stanPrzestrzeni[1] += 1
elif self.kierunek == 3: elif self.kierunek == 3:
self.x -= 1 self.x -= 1
self.stanPrzestrzeni[0] -= 1 self.stanPrzestrzeni[0] -= 1
def wykonajAkcje(self, ruchy): def wykonajAkcje(self, ruchy):
if self.indexRuchu < len(ruchy): if self.indexRuchu < len(ruchy):
@ -85,13 +88,14 @@ class Stolik:
def wklej(self): def wklej(self):
screen.blit(stolikImg, (self.x * blockSize, self.y * blockSize)) screen.blit(stolikImg, (self.x * blockSize, self.y * blockSize))
class Przeszkoda: class Przeszkoda:
def __init__(self, x, y, typ): def __init__(self, x, y, typ):
self.x = x self.x = x
self.y = y self.y = y
self.typ = typ self.typ = typ
#ocena kosztu przeszkody # ocena kosztu przeszkody
if self.typ == "sliska podloga": if self.typ == "sliska podloga":
self.cena = 2 self.cena = 2
@ -104,10 +108,12 @@ class Przeszkoda:
elif self.typ == "dywan": elif self.typ == "dywan":
screen.blit(dywanImg, (self.x * blockSize, self.y * blockSize)) screen.blit(dywanImg, (self.x * blockSize, self.y * blockSize))
#-----------------Przeszukiwanie przestrzeni stanów
# -----------------Przeszukiwanie przestrzeni stanów
import heapq import heapq
def a_star(start, cel, stoliki, przeszkody): def a_star(start, cel, stoliki, przeszkody):
queue = [] # Kolejka priorytetowa queue = [] # Kolejka priorytetowa
heapq.heappush(queue, (0, start)) # (koszt, stan) heapq.heappush(queue, (0, start)) # (koszt, stan)
@ -115,15 +121,15 @@ def a_star(start, cel, stoliki, przeszkody):
poprzednicy = {start: (None, None, 0)} # (poprzedni stan, ruch, koszt do tej pory) poprzednicy = {start: (None, None, 0)} # (poprzedni stan, ruch, koszt do tej pory)
while queue: while queue:
obecny_koszt, obecny = heapq.heappop(queue) # pobranie stanu z najniższym kosztem obecny_koszt, obecny = heapq.heappop(queue) # pobranie stanu z najniższym kosztem
if obecny[:2] == cel: if obecny[:2] == cel:
return odtworz_ruchy(poprzednicy, obecny) return odtworz_ruchy(poprzednicy, obecny)
for nastepnik, ruch, koszt_ruchu in generuj_nastepniki_i_ruchy(obecny, stoliki, przeszkody):
nowy_koszt = poprzednicy[obecny][2] + koszt_ruchu # Obliczanie nowego kosztu dojscia do nastepnika
#nastepnik nie był odwiedzony lub znaleziono tansza sciezke do niego for nastepnik, ruch, koszt_ruchu in generuj_nastepniki_i_ruchy(obecny, stoliki, przeszkody):
nowy_koszt = poprzednicy[obecny][2] + koszt_ruchu # Obliczanie nowego kosztu dojscia do nastepnika
# nastepnik nie był odwiedzony lub znaleziono tansza sciezke do niego
if nastepnik not in odwiedzone or nowy_koszt < poprzednicy.get(nastepnik, (None, None, float('inf')))[2]: if nastepnik not in odwiedzone or nowy_koszt < poprzednicy.get(nastepnik, (None, None, float('inf')))[2]:
heapq.heappush(queue, (nowy_koszt + heurystyka(nastepnik, cel), nastepnik)) heapq.heappush(queue, (nowy_koszt + heurystyka(nastepnik, cel), nastepnik))
poprzednicy[nastepnik] = (obecny, ruch, nowy_koszt) poprzednicy[nastepnik] = (obecny, ruch, nowy_koszt)
@ -136,7 +142,7 @@ def heurystyka(nastepnik, cel):
return abs(nastepnik[0] - cel[0]) + abs(nastepnik[1] - cel[1]) return abs(nastepnik[0] - cel[0]) + abs(nastepnik[1] - cel[1])
#----------Funkcja generowania następników dla poszczególnych stanów # ----------Funkcja generowania następników dla poszczególnych stanów
def generuj_nastepniki_i_ruchy(stan, stoliki, przeszkody): def generuj_nastepniki_i_ruchy(stan, stoliki, przeszkody):
x, y, kierunek = stan x, y, kierunek = stan
ruchy = [] ruchy = []
@ -159,17 +165,18 @@ def generuj_nastepniki_i_ruchy(stan, stoliki, przeszkody):
elif kierunek == 3: elif kierunek == 3:
nowy_x, nowy_y = x - 1, y nowy_x, nowy_y = x - 1, y
#sprawdzamy, czy następny stan jest w granicach planszy # sprawdzamy, czy następny stan jest w granicach planszy
if 0 <= nowy_x < columns and 0 <= nowy_y < rows: if 0 <= nowy_x < columns and 0 <= nowy_y < rows:
#sprawdzamy, czy następny stan nie wchodzi w stolik # sprawdzamy, czy następny stan nie wchodzi w stolik
if not any(stolik.x == nowy_x and stolik.y == nowy_y for stolik in stoliki): if not any(stolik.x == nowy_x and stolik.y == nowy_y for stolik in stoliki):
koszt = next((przeszkoda.cena for przeszkoda in przeszkody if przeszkoda.x == nowy_x and przeszkoda.y == nowy_y), 1) koszt = next(
ruchy.append( ((nowy_x, nowy_y, kierunek), 'F', koszt) ) (przeszkoda.cena for przeszkoda in przeszkody if przeszkoda.x == nowy_x and przeszkoda.y == nowy_y), 1)
ruchy.append(((nowy_x, nowy_y, kierunek), 'F', koszt))
return ruchy return ruchy
#-----Funkcja tworząca listę kroków potrzebnych do uzyskania celu # -----Funkcja tworząca listę kroków potrzebnych do uzyskania celu
def odtworz_ruchy(poprzednicy, cel): def odtworz_ruchy(poprzednicy, cel):
ruchy = [] ruchy = []
krok = cel krok = cel
@ -179,22 +186,94 @@ def odtworz_ruchy(poprzednicy, cel):
ruchy.reverse() ruchy.reverse()
return ruchy return ruchy
def licz_entropie(data, target_column):
total_rows = len(data)
target_values = data[target_column].unique()
entropy = 0
for value in target_values:
value_count = len(data[data[target_column] == value])
proportion = value_count / total_rows
entropy -= proportion * math.log2(proportion)
return entropy
def licz_zysk(atrybut,korzen,data):
entropia_wazona = 0
unique_values = data[atrybut].unique()
for value in unique_values:
subset = data[data[atrybut] == value]
proportion = len(subset) / len(data)
entropia_wazona += proportion * licz_entropie(subset, data.columns[-1])
zysk = korzen - entropia_wazona
return zysk
def szukaj_split(z, atrybuty):
max = 0
max_atr = "None"
for atrybut in atrybuty:
if z[atrybut]>max:
max = z[atrybut]
max_atr = atrybut
return max_atr
def GenerujDane(ques):
k = [0,0,0,0,0,0,0,0]
for n in range(8):
k[n] = random.choice([0,1])
print(ques[n] + str(k[n]))
return k
def id3(data,mode,klient):
zysk = {}
korzen = licz_entropie(data,data.columns[-1])
lista = data.columns
for atrybut in lista[:-1]:
zysk[atrybut] = licz_zysk(atrybut,korzen,data)
split = szukaj_split(zysk, data.head(0).columns[:-1])
if split == "None":
wynik = data.iloc[0, -1]
if wynik == 1 and mode == "klient":
print("Klient zadowolony!")
elif wynik == 0 and mode == "klient":
print("Klient niezadowolony!")
print("---------------------------------------------------------------------------------------")
else:
#print("Split: " + str(split))
subset0 = data[data[split] == 0]
subset0 = subset0.drop([split], axis=1)
subset1 = data[data[split] == 1]
subset1 = subset1.drop([split], axis=1)
#print("Klient: " + str(klient))
if len(subset0) < len(data) and len(subset1) < len(data):
if mode == "klient":
if klient[split] == 0:
frames.append(subset0)
else:
frames.append(subset1)
elif mode == "full":
frames.append(subset0)
frames.append(subset1)
if len(frames) > 0:
newData = frames.pop()
id3(newData,mode, klient)
start = (0, 0, 0) # Początkowy stan start = (0, 0, 0) # Początkowy stan
cel = (0, 0) # Docelowe współrzędne cel = (0, 0) # Docelowe współrzędne
#--------------Inicjacja obiektów # --------------Inicjacja obiektów
kelner = Kelner(pozycja_startowa,pozycja_startowa) kelner = Kelner(pozycja_startowa, pozycja_startowa)
#-----------wspolrzedne stolikow # -----------wspolrzedne stolikow
coords = ["8 4", "16 4", "0 7", "23 7", "12 9", "8 10", "16 10", "4 12", "12 12", "20 12"] coords = ["8 4", "16 4", "0 7", "23 7", "12 9", "8 10", "16 10", "4 12", "12 12", "20 12"]
#-----------wspolrzedne sliskich podlog # -----------wspolrzedne sliskich podlog
coords2 = ["0 2", "0 3", "0 4", "0 5", "4 8", "4 9", "12 2", "12 3", "15 8", "16 8", "19 4", "20 4", "21 4"] coords2 = ["0 2", "0 3", "0 4", "0 5", "4 8", "4 9", "12 2", "12 3", "15 8", "16 8", "19 4", "20 4", "21 4"]
#-----------wspolrzedne dywanow # -----------wspolrzedne dywanow
coords3 = ["6 0", "6 1", "2 2", "3 2", "4 2", "5 2", "1 5", "6 2", "8 6", "8 7", "20 2", "20 3", "19 9", "20 9", "21 9"] coords3 = ["6 0", "6 1", "2 2", "3 2", "4 2", "5 2", "1 5", "6 2", "8 6", "8 7", "20 2", "20 3", "19 9", "20 9", "21 9"]
#Tworzenie listy stolikow i przeszkod # Tworzenie listy stolikow i przeszkod
stoliki = [] stoliki = []
przeszkody = [] przeszkody = []
if not losuj_uklad: if not losuj_uklad:
@ -209,16 +288,16 @@ if not losuj_uklad:
przeszkody.append(Przeszkoda(x, y, "dywan")) przeszkody.append(Przeszkoda(x, y, "dywan"))
else: else:
juzbyly = [] juzbyly = []
for j in range(1,rows): for j in range(1, rows):
for i in range(columns): for i in range(columns):
if (random.randrange(7) == 0) and ((i,j-1) not in juzbyly) and (((i-1,j-1) not in juzbyly) or ((i+1,j-1) not in juzbyly)): if (random.randrange(7) == 0) and ((i, j - 1) not in juzbyly) and (
stoliki.append(Stolik(i,j)) ((i - 1, j - 1) not in juzbyly) or ((i + 1, j - 1) not in juzbyly)):
juzbyly.append((i,j)) stoliki.append(Stolik(i, j))
juzbyly.append((i, j))
elif random.randrange(9) == 0: elif random.randrange(9) == 0:
przeszkody.append(Przeszkoda(i,j, "sliska podloga")) przeszkody.append(Przeszkoda(i, j, "sliska podloga"))
elif random.randrange(12) == 0: elif random.randrange(12) == 0:
przeszkody.append(Przeszkoda(i,j, "dywan")) przeszkody.append(Przeszkoda(i, j, "dywan"))
# stoliki = [] # stoliki = []
# for i in range(rows) # for i in range(rows)
@ -226,7 +305,7 @@ else:
pygame.init() pygame.init()
pygame.display.set_caption("Automatyczny kelner") pygame.display.set_caption("Automatyczny kelner")
#----------------wymiary okna # ----------------wymiary okna
width = columns * blockSize width = columns * blockSize
height = rows * blockSize height = rows * blockSize
@ -245,19 +324,43 @@ sliskaPodlogaImg = pygame.transform.scale(sliskaPodlogaImg, (blockSize, blockSiz
dywanImg = pygame.image.load("dywan.png") dywanImg = pygame.image.load("dywan.png")
dywanImg = pygame.transform.scale(dywanImg, (blockSize, blockSize)) dywanImg = pygame.transform.scale(dywanImg, (blockSize, blockSize))
def kuchnia(x, y): def kuchnia(x, y):
screen.blit(kitchenImg, (x * blockSize, y * blockSize)) screen.blit(kitchenImg, (x * blockSize, y * blockSize))
def menu(x, y): def menu(x, y):
screen.blit(menuImg, (x * blockSize, y * blockSize)) screen.blit(menuImg, (x * blockSize, y * blockSize))
def wypiszOkno(): def wypiszOkno():
screen.fill((0, 0, 0)) screen.fill((0, 0, 0))
for x in range(0, width, blockSize): for x in range(0, width, blockSize):
for y in range(0, height, blockSize): for y in range(0, height, blockSize):
rect = pygame.Rect(x, y, blockSize, blockSize) rect = pygame.Rect(x, y, blockSize, blockSize)
pygame.draw.rect(screen, (200, 200, 200), rect, 1) #-------------Wypisz kratę -TA pygame.draw.rect(screen, (200, 200, 200), rect, 1) # -------------Wypisz kratę -TA
#pygame.draw.rect(screen, (0, 0, 0), rect, 1) #-------------Wypisz kratę -TA # pygame.draw.rect(screen, (0, 0, 0), rect, 1) #-------------Wypisz kratę -TA
def czyZadowolony():
data = pd.read_csv('zbior_uczacy.csv')
frames = []
frames.append(data)
ques = ["Czy klient sie usmiecha? ", "Czy zostawil napiwek? ", "Czy zachowywal sie grzecznie? ",
"Czy zjadl cala porcje? ", "Czy zlozyl dodatkowe zamowienia? ",
"Czy wyrazil zainteresowanie karta stalego klienta? ", "Czy zarezerwowal stolik na przyszlosc? ",
"Czy zabral wizytowke? "]
k = GenerujDane(ques)
atrybuty = []
for column in data.columns[:-1]:
atrybuty.append(column)
klient = {}
i = 0
for atr in atrybuty:
klient[atr] = k[i]
i = i + 1
while len(frames) > 0:
data = frames.pop()
id3(data, "klient", klient)
run = True run = True
@ -267,28 +370,66 @@ licznik = 0
ruchy = [] ruchy = []
cel2 = [] cel2 = []
klient = {}
frames = []
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import plot_tree, DecisionTreeClassifier
data = pd.read_csv('zbior_uczacy.csv')
data.head()
#print(heart_data)
data_x = data.drop('Zadowolony', axis=1)
data_y = data['Zadowolony']
data_x_encoded = pd.get_dummies(data_x, drop_first = True)
data_x_encoded.head()
best_acc = 0
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
X_train, X_test, y_train, y_test = train_test_split(data_x_encoded, data_y, test_size=0.3)
dtree = DecisionTreeClassifier(max_depth=100)
dtree.fit(X_train, y_train)
fig = plt.figure(figsize=((25,20)))
plot_tree(dtree,
feature_names=data_x_encoded.columns,
class_names=['niezadowolony', 'zadowolony'],
impurity=False,
proportion=False,
filled=True)
fig.savefig('tree.png')
while run: while run:
cel2 = list(cel) cel2 = list(cel)
#print(f"{kelner.stanPrzestrzeni}, {cel2}, {kelner.indexRuchu} {kelner.stan}") # print(f"{kelner.stanPrzestrzeni}, {cel2}, {kelner.indexRuchu} {kelner.stan}")
wypiszOkno() wypiszOkno()
kuchnia(kuchnia_xy, kuchnia_xy) kuchnia(kuchnia_xy, kuchnia_xy)
for stolik in stoliki: for stolik in stoliki:
stolik.wklej() stolik.wklej()
for przeszkoda in przeszkody: for przeszkoda in przeszkody:
przeszkoda.wklej() przeszkoda.wklej()
kelner.wklej() kelner.wklej()
if kelner.stan == "wraca": if kelner.stan == "wraca":
menu(kelner.x, kelner.y) menu(kelner.x, kelner.y)
licznik += 1 licznik += 1
#------------weź zamowienie # ------------weź zamowienie
for stolik in stoliki: for stolik in stoliki:
if stolik.zamowione == True: if stolik.zamowione == True:
menu(stolik.x, stolik.y) menu(stolik.x, stolik.y)
if kelner.stan == "stoi": if kelner.stan == "stoi":
@ -298,29 +439,30 @@ while run:
print("Szukam ścieżki do stolika...") print("Szukam ścieżki do stolika...")
ruchy = a_star(tuple(kelner.stanPrzestrzeni), cel, stoliki, przeszkody) ruchy = a_star(tuple(kelner.stanPrzestrzeni), cel, stoliki, przeszkody)
kelner.stan = "odbiera" kelner.stan = "odbiera"
if ruchy: if ruchy:
print("Znaleziono ścieżkę ruchów: ", ruchy) print("Znaleziono ścieżkę ruchów: ", ruchy)
czyZadowolony()
else: else:
print("Nie znaleziono ścieżki do celu.") print("Nie znaleziono ścieżki do celu.")
#----------Losuje stoliki, które dokonają zamówienia # ----------Losuje stoliki, które dokonają zamówienia
if kelner.stan == "stoi": if kelner.stan == "stoi":
for stolik in stoliki: for stolik in stoliki:
if stolik.zamowione == True: if stolik.zamowione == True:
break break
for i in range(len(stoliki)): for i in range(len(stoliki)):
if random.randrange(2) == 1: if random.randrange(2) == 1:
stoliki[i].zamowione = True stoliki[i].zamowione = True
#print(kelner.stan)--------------------------Wypisuje stan kelnera # print(kelner.stan)--------------------------Wypisuje stan kelnera
#print(f"{kelner.x} {kelner.y}")-------------Wypisuje wspolrzedne kelnera # print(f"{kelner.x} {kelner.y}")-------------Wypisuje wspolrzedne kelnera
#----------------Zmiana pozycji kelnera # ----------------Zmiana pozycji kelnera
if kelner.chodzi == True and licznik % (101 - kelner.speed) == 0 and kelner.stanPrzestrzeni[:2] != cel2: #ograniczenie prędkości if kelner.chodzi == True and licznik % (101 - kelner.speed) == 0 and kelner.stanPrzestrzeni[
:2] != cel2: # ograniczenie prędkości
kelner.wykonajAkcje(ruchy) kelner.wykonajAkcje(ruchy)
if kelner.stanPrzestrzeni[:2] == cel2: if kelner.stanPrzestrzeni[:2] == cel2:
if kelner.stan == "odbiera" and kelner.x == kelner.stolik_docelowy.x and kelner.y == kelner.stolik_docelowy.y - 1: if kelner.stan == "odbiera" and kelner.x == kelner.stolik_docelowy.x and kelner.y == kelner.stolik_docelowy.y - 1:
kelner.stolik_docelowy.zamowione = False kelner.stolik_docelowy.zamowione = False
@ -335,7 +477,6 @@ while run:
elif kelner.stan == "wraca" and kelner.x == kuchnia_xy and kelner.y == kuchnia_xy: elif kelner.stan == "wraca" and kelner.x == kuchnia_xy and kelner.y == kuchnia_xy:
kelner.stan = "stoi" kelner.stan = "stoi"
time.sleep(0.001) time.sleep(0.001)
key = pygame.key.get_pressed() key = pygame.key.get_pressed()
@ -343,4 +484,14 @@ while run:
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
run = False run = False
#------------------------------------------------------------------------------------------------------------------
'''
frames.clear()
frames.append(data)
while len(frames) > 0:
data = frames.pop()
id3(data,"full")
'''
pygame.quit() pygame.quit()

257
zbior_uczacy.csv Normal file
View File

@ -0,0 +1,257 @@
Usmiech,Napiwek,Grzeczny,Zjadl,DodZam,Karta,Rezerwacja,Wizytowka,Zadowolony
0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,1,0
0,0,0,0,0,0,1,0,0
0,0,0,0,0,0,1,1,0
0,0,0,0,0,1,0,0,0
0,0,0,0,0,1,0,1,0
0,0,0,0,0,1,1,0,0
0,0,0,0,0,1,1,1,0
0,0,0,0,1,0,0,0,0
0,0,0,0,1,0,0,1,0
0,0,0,0,1,0,1,0,0
0,0,0,0,1,0,1,1,0
0,0,0,0,1,1,0,0,0
0,0,0,0,1,1,0,1,0
0,0,0,0,1,1,1,0,0
0,0,0,0,1,1,1,1,0
0,0,0,1,0,0,0,0,0
0,0,0,1,0,0,0,1,0
0,0,0,1,0,0,1,0,0
0,0,0,1,0,0,1,1,0
0,0,0,1,0,1,0,0,0
0,0,0,1,0,1,0,1,0
0,0,0,1,0,1,1,0,0
0,0,0,1,0,1,1,1,1
0,0,0,1,1,0,0,0,0
0,0,0,1,1,0,0,1,0
0,0,0,1,1,0,1,0,0
0,0,0,1,1,0,1,1,1
0,0,0,1,1,1,0,0,0
0,0,0,1,1,1,0,1,1
0,0,0,1,1,1,1,0,1
0,0,0,1,1,1,1,1,1
0,0,1,0,0,0,0,0,0
0,0,1,0,0,0,0,1,0
0,0,1,0,0,0,1,0,0
0,0,1,0,0,0,1,1,0
0,0,1,0,0,1,0,0,0
0,0,1,0,0,1,0,1,0
0,0,1,0,0,1,1,0,0
0,0,1,0,0,1,1,1,1
0,0,1,0,1,0,0,0,0
0,0,1,0,1,0,0,1,1
0,0,1,0,1,0,1,0,1
0,0,1,0,1,0,1,1,1
0,0,1,0,1,1,0,0,0
0,0,1,0,1,1,0,1,1
0,0,1,0,1,1,1,0,1
0,0,1,0,1,1,1,1,1
0,0,1,1,0,0,0,0,1
0,0,1,1,0,0,0,1,1
0,0,1,1,0,0,1,0,1
0,0,1,1,0,0,1,1,1
0,0,1,1,0,1,0,0,1
0,0,1,1,0,1,0,1,1
0,0,1,1,0,1,1,0,1
0,0,1,1,0,1,1,1,1
0,0,1,1,1,0,0,0,1
0,0,1,1,1,0,0,1,1
0,0,1,1,1,0,1,0,1
0,0,1,1,1,0,1,1,1
0,0,1,1,1,1,0,0,1
0,0,1,1,1,1,0,1,1
0,0,1,1,1,1,1,0,1
0,0,1,1,1,1,1,1,1
0,1,0,0,0,0,0,0,0
0,1,0,0,0,0,0,1,1
0,1,0,0,0,0,1,0,1
0,1,0,0,0,0,1,1,1
0,1,0,0,0,1,0,0,1
0,1,0,0,0,1,0,1,1
0,1,0,0,0,1,1,0,1
0,1,0,0,0,1,1,1,1
0,1,0,0,1,0,0,0,1
0,1,0,0,1,0,0,1,1
0,1,0,0,1,0,1,0,1
0,1,0,0,1,0,1,1,1
0,1,0,0,1,1,0,0,1
0,1,0,0,1,1,0,1,1
0,1,0,0,1,1,1,0,1
0,1,0,0,1,1,1,1,1
0,1,0,1,0,0,0,0,1
0,1,0,1,0,0,0,1,1
0,1,0,1,0,0,1,0,1
0,1,0,1,0,0,1,1,1
0,1,0,1,0,1,0,0,1
0,1,0,1,0,1,0,1,1
0,1,0,1,0,1,1,0,1
0,1,0,1,0,1,1,1,1
0,1,0,1,1,0,0,0,1
0,1,0,1,1,0,0,1,1
0,1,0,1,1,0,1,0,1
0,1,0,1,1,0,1,1,1
0,1,0,1,1,1,0,0,1
0,1,0,1,1,1,0,1,1
0,1,0,1,1,1,1,0,1
0,1,0,1,1,1,1,1,1
0,1,1,0,0,0,0,0,1
0,1,1,0,0,0,0,1,1
0,1,1,0,0,0,1,0,1
0,1,1,0,0,0,1,1,1
0,1,1,0,0,1,0,0,1
0,1,1,0,0,1,0,1,1
0,1,1,0,0,1,1,0,1
0,1,1,0,0,1,1,1,1
0,1,1,0,1,0,0,0,1
0,1,1,0,1,0,0,1,1
0,1,1,0,1,0,1,0,1
0,1,1,0,1,0,1,1,1
0,1,1,0,1,1,0,0,1
0,1,1,0,1,1,0,1,1
0,1,1,0,1,1,1,0,1
0,1,1,0,1,1,1,1,1
0,1,1,1,0,0,0,0,1
0,1,1,1,0,0,0,1,1
0,1,1,1,0,0,1,0,1
0,1,1,1,0,0,1,1,1
0,1,1,1,0,1,0,0,1
0,1,1,1,0,1,0,1,1
0,1,1,1,0,1,1,0,1
0,1,1,1,0,1,1,1,1
0,1,1,1,1,0,0,0,1
0,1,1,1,1,0,0,1,1
0,1,1,1,1,0,1,0,1
0,1,1,1,1,0,1,1,1
0,1,1,1,1,1,0,0,1
0,1,1,1,1,1,0,1,1
0,1,1,1,1,1,1,0,1
0,1,1,1,1,1,1,1,1
1,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,1,0
1,0,0,0,0,0,1,0,0
1,0,0,0,0,0,1,1,1
1,0,0,0,0,1,0,0,0
1,0,0,0,0,1,0,1,1
1,0,0,0,0,1,1,0,1
1,0,0,0,0,1,1,1,1
1,0,0,0,1,0,0,0,0
1,0,0,0,1,0,0,1,1
1,0,0,0,1,0,1,0,1
1,0,0,0,1,0,1,1,1
1,0,0,0,1,1,0,0,1
1,0,0,0,1,1,0,1,1
1,0,0,0,1,1,1,0,1
1,0,0,0,1,1,1,1,1
1,0,0,1,0,0,0,0,0
1,0,0,1,0,0,0,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,0,0,1,1,1
1,0,0,1,0,1,0,0,1
1,0,0,1,0,1,0,1,1
1,0,0,1,0,1,1,0,1
1,0,0,1,0,1,1,1,1
1,0,0,1,1,0,0,0,1
1,0,0,1,1,0,0,1,1
1,0,0,1,1,0,1,0,1
1,0,0,1,1,0,1,1,1
1,0,0,1,1,1,0,0,1
1,0,0,1,1,1,0,1,1
1,0,0,1,1,1,1,0,1
1,0,0,1,1,1,1,1,1
1,0,1,0,0,0,0,0,1
1,0,1,0,0,0,0,1,1
1,0,1,0,0,0,1,0,1
1,0,1,0,0,0,1,1,1
1,0,1,0,0,1,0,0,1
1,0,1,0,0,1,0,1,1
1,0,1,0,0,1,1,0,1
1,0,1,0,0,1,1,1,1
1,0,1,0,1,0,0,0,1
1,0,1,0,1,0,0,1,1
1,0,1,0,1,0,1,0,1
1,0,1,0,1,0,1,1,1
1,0,1,0,1,1,0,0,1
1,0,1,0,1,1,0,1,1
1,0,1,0,1,1,1,0,1
1,0,1,0,1,1,1,1,1
1,0,1,1,0,0,0,0,1
1,0,1,1,0,0,0,1,1
1,0,1,1,0,0,1,0,1
1,0,1,1,0,0,1,1,1
1,0,1,1,0,1,0,0,1
1,0,1,1,0,1,0,1,1
1,0,1,1,0,1,1,0,1
1,0,1,1,0,1,1,1,1
1,0,1,1,1,0,0,0,1
1,0,1,1,1,0,0,1,1
1,0,1,1,1,0,1,0,1
1,0,1,1,1,0,1,1,1
1,0,1,1,1,1,0,0,1
1,0,1,1,1,1,0,1,1
1,0,1,1,1,1,1,0,1
1,0,1,1,1,1,1,1,1
1,1,0,0,0,0,0,0,1
1,1,0,0,0,0,0,1,1
1,1,0,0,0,0,1,0,1
1,1,0,0,0,0,1,1,1
1,1,0,0,0,1,0,0,1
1,1,0,0,0,1,0,1,1
1,1,0,0,0,1,1,0,1
1,1,0,0,0,1,1,1,1
1,1,0,0,1,0,0,0,1
1,1,0,0,1,0,0,1,1
1,1,0,0,1,0,1,0,1
1,1,0,0,1,0,1,1,1
1,1,0,0,1,1,0,0,1
1,1,0,0,1,1,0,1,1
1,1,0,0,1,1,1,0,1
1,1,0,0,1,1,1,1,1
1,1,0,1,0,0,0,0,1
1,1,0,1,0,0,0,1,1
1,1,0,1,0,0,1,0,1
1,1,0,1,0,0,1,1,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,1,1
1,1,0,1,0,1,1,0,1
1,1,0,1,0,1,1,1,1
1,1,0,1,1,0,0,0,1
1,1,0,1,1,0,0,1,1
1,1,0,1,1,0,1,0,1
1,1,0,1,1,0,1,1,1
1,1,0,1,1,1,0,0,1
1,1,0,1,1,1,0,1,1
1,1,0,1,1,1,1,0,1
1,1,0,1,1,1,1,1,1
1,1,1,0,0,0,0,0,1
1,1,1,0,0,0,0,1,1
1,1,1,0,0,0,1,0,1
1,1,1,0,0,0,1,1,1
1,1,1,0,0,1,0,0,1
1,1,1,0,0,1,0,1,1
1,1,1,0,0,1,1,0,1
1,1,1,0,0,1,1,1,1
1,1,1,0,1,0,0,0,1
1,1,1,0,1,0,0,1,1
1,1,1,0,1,0,1,0,1
1,1,1,0,1,0,1,1,1
1,1,1,0,1,1,0,0,1
1,1,1,0,1,1,0,1,1
1,1,1,0,1,1,1,0,1
1,1,1,0,1,1,1,1,1
1,1,1,1,0,0,0,0,1
1,1,1,1,0,0,0,1,1
1,1,1,1,0,0,1,0,1
1,1,1,1,0,0,1,1,1
1,1,1,1,0,1,0,0,1
1,1,1,1,0,1,0,1,1
1,1,1,1,0,1,1,0,1
1,1,1,1,0,1,1,1,1
1,1,1,1,1,0,0,0,1
1,1,1,1,1,0,0,1,1
1,1,1,1,1,0,1,0,1
1,1,1,1,1,0,1,1,1
1,1,1,1,1,1,0,0,1
1,1,1,1,1,1,0,1,1
1,1,1,1,1,1,1,0,1
1,1,1,1,1,1,1,1,1
1 Usmiech Napiwek Grzeczny Zjadl DodZam Karta Rezerwacja Wizytowka Zadowolony
2 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 1 0
4 0 0 0 0 0 0 1 0 0
5 0 0 0 0 0 0 1 1 0
6 0 0 0 0 0 1 0 0 0
7 0 0 0 0 0 1 0 1 0
8 0 0 0 0 0 1 1 0 0
9 0 0 0 0 0 1 1 1 0
10 0 0 0 0 1 0 0 0 0
11 0 0 0 0 1 0 0 1 0
12 0 0 0 0 1 0 1 0 0
13 0 0 0 0 1 0 1 1 0
14 0 0 0 0 1 1 0 0 0
15 0 0 0 0 1 1 0 1 0
16 0 0 0 0 1 1 1 0 0
17 0 0 0 0 1 1 1 1 0
18 0 0 0 1 0 0 0 0 0
19 0 0 0 1 0 0 0 1 0
20 0 0 0 1 0 0 1 0 0
21 0 0 0 1 0 0 1 1 0
22 0 0 0 1 0 1 0 0 0
23 0 0 0 1 0 1 0 1 0
24 0 0 0 1 0 1 1 0 0
25 0 0 0 1 0 1 1 1 1
26 0 0 0 1 1 0 0 0 0
27 0 0 0 1 1 0 0 1 0
28 0 0 0 1 1 0 1 0 0
29 0 0 0 1 1 0 1 1 1
30 0 0 0 1 1 1 0 0 0
31 0 0 0 1 1 1 0 1 1
32 0 0 0 1 1 1 1 0 1
33 0 0 0 1 1 1 1 1 1
34 0 0 1 0 0 0 0 0 0
35 0 0 1 0 0 0 0 1 0
36 0 0 1 0 0 0 1 0 0
37 0 0 1 0 0 0 1 1 0
38 0 0 1 0 0 1 0 0 0
39 0 0 1 0 0 1 0 1 0
40 0 0 1 0 0 1 1 0 0
41 0 0 1 0 0 1 1 1 1
42 0 0 1 0 1 0 0 0 0
43 0 0 1 0 1 0 0 1 1
44 0 0 1 0 1 0 1 0 1
45 0 0 1 0 1 0 1 1 1
46 0 0 1 0 1 1 0 0 0
47 0 0 1 0 1 1 0 1 1
48 0 0 1 0 1 1 1 0 1
49 0 0 1 0 1 1 1 1 1
50 0 0 1 1 0 0 0 0 1
51 0 0 1 1 0 0 0 1 1
52 0 0 1 1 0 0 1 0 1
53 0 0 1 1 0 0 1 1 1
54 0 0 1 1 0 1 0 0 1
55 0 0 1 1 0 1 0 1 1
56 0 0 1 1 0 1 1 0 1
57 0 0 1 1 0 1 1 1 1
58 0 0 1 1 1 0 0 0 1
59 0 0 1 1 1 0 0 1 1
60 0 0 1 1 1 0 1 0 1
61 0 0 1 1 1 0 1 1 1
62 0 0 1 1 1 1 0 0 1
63 0 0 1 1 1 1 0 1 1
64 0 0 1 1 1 1 1 0 1
65 0 0 1 1 1 1 1 1 1
66 0 1 0 0 0 0 0 0 0
67 0 1 0 0 0 0 0 1 1
68 0 1 0 0 0 0 1 0 1
69 0 1 0 0 0 0 1 1 1
70 0 1 0 0 0 1 0 0 1
71 0 1 0 0 0 1 0 1 1
72 0 1 0 0 0 1 1 0 1
73 0 1 0 0 0 1 1 1 1
74 0 1 0 0 1 0 0 0 1
75 0 1 0 0 1 0 0 1 1
76 0 1 0 0 1 0 1 0 1
77 0 1 0 0 1 0 1 1 1
78 0 1 0 0 1 1 0 0 1
79 0 1 0 0 1 1 0 1 1
80 0 1 0 0 1 1 1 0 1
81 0 1 0 0 1 1 1 1 1
82 0 1 0 1 0 0 0 0 1
83 0 1 0 1 0 0 0 1 1
84 0 1 0 1 0 0 1 0 1
85 0 1 0 1 0 0 1 1 1
86 0 1 0 1 0 1 0 0 1
87 0 1 0 1 0 1 0 1 1
88 0 1 0 1 0 1 1 0 1
89 0 1 0 1 0 1 1 1 1
90 0 1 0 1 1 0 0 0 1
91 0 1 0 1 1 0 0 1 1
92 0 1 0 1 1 0 1 0 1
93 0 1 0 1 1 0 1 1 1
94 0 1 0 1 1 1 0 0 1
95 0 1 0 1 1 1 0 1 1
96 0 1 0 1 1 1 1 0 1
97 0 1 0 1 1 1 1 1 1
98 0 1 1 0 0 0 0 0 1
99 0 1 1 0 0 0 0 1 1
100 0 1 1 0 0 0 1 0 1
101 0 1 1 0 0 0 1 1 1
102 0 1 1 0 0 1 0 0 1
103 0 1 1 0 0 1 0 1 1
104 0 1 1 0 0 1 1 0 1
105 0 1 1 0 0 1 1 1 1
106 0 1 1 0 1 0 0 0 1
107 0 1 1 0 1 0 0 1 1
108 0 1 1 0 1 0 1 0 1
109 0 1 1 0 1 0 1 1 1
110 0 1 1 0 1 1 0 0 1
111 0 1 1 0 1 1 0 1 1
112 0 1 1 0 1 1 1 0 1
113 0 1 1 0 1 1 1 1 1
114 0 1 1 1 0 0 0 0 1
115 0 1 1 1 0 0 0 1 1
116 0 1 1 1 0 0 1 0 1
117 0 1 1 1 0 0 1 1 1
118 0 1 1 1 0 1 0 0 1
119 0 1 1 1 0 1 0 1 1
120 0 1 1 1 0 1 1 0 1
121 0 1 1 1 0 1 1 1 1
122 0 1 1 1 1 0 0 0 1
123 0 1 1 1 1 0 0 1 1
124 0 1 1 1 1 0 1 0 1
125 0 1 1 1 1 0 1 1 1
126 0 1 1 1 1 1 0 0 1
127 0 1 1 1 1 1 0 1 1
128 0 1 1 1 1 1 1 0 1
129 0 1 1 1 1 1 1 1 1
130 1 0 0 0 0 0 0 0 0
131 1 0 0 0 0 0 0 1 0
132 1 0 0 0 0 0 1 0 0
133 1 0 0 0 0 0 1 1 1
134 1 0 0 0 0 1 0 0 0
135 1 0 0 0 0 1 0 1 1
136 1 0 0 0 0 1 1 0 1
137 1 0 0 0 0 1 1 1 1
138 1 0 0 0 1 0 0 0 0
139 1 0 0 0 1 0 0 1 1
140 1 0 0 0 1 0 1 0 1
141 1 0 0 0 1 0 1 1 1
142 1 0 0 0 1 1 0 0 1
143 1 0 0 0 1 1 0 1 1
144 1 0 0 0 1 1 1 0 1
145 1 0 0 0 1 1 1 1 1
146 1 0 0 1 0 0 0 0 0
147 1 0 0 1 0 0 0 1 1
148 1 0 0 1 0 0 1 0 1
149 1 0 0 1 0 0 1 1 1
150 1 0 0 1 0 1 0 0 1
151 1 0 0 1 0 1 0 1 1
152 1 0 0 1 0 1 1 0 1
153 1 0 0 1 0 1 1 1 1
154 1 0 0 1 1 0 0 0 1
155 1 0 0 1 1 0 0 1 1
156 1 0 0 1 1 0 1 0 1
157 1 0 0 1 1 0 1 1 1
158 1 0 0 1 1 1 0 0 1
159 1 0 0 1 1 1 0 1 1
160 1 0 0 1 1 1 1 0 1
161 1 0 0 1 1 1 1 1 1
162 1 0 1 0 0 0 0 0 1
163 1 0 1 0 0 0 0 1 1
164 1 0 1 0 0 0 1 0 1
165 1 0 1 0 0 0 1 1 1
166 1 0 1 0 0 1 0 0 1
167 1 0 1 0 0 1 0 1 1
168 1 0 1 0 0 1 1 0 1
169 1 0 1 0 0 1 1 1 1
170 1 0 1 0 1 0 0 0 1
171 1 0 1 0 1 0 0 1 1
172 1 0 1 0 1 0 1 0 1
173 1 0 1 0 1 0 1 1 1
174 1 0 1 0 1 1 0 0 1
175 1 0 1 0 1 1 0 1 1
176 1 0 1 0 1 1 1 0 1
177 1 0 1 0 1 1 1 1 1
178 1 0 1 1 0 0 0 0 1
179 1 0 1 1 0 0 0 1 1
180 1 0 1 1 0 0 1 0 1
181 1 0 1 1 0 0 1 1 1
182 1 0 1 1 0 1 0 0 1
183 1 0 1 1 0 1 0 1 1
184 1 0 1 1 0 1 1 0 1
185 1 0 1 1 0 1 1 1 1
186 1 0 1 1 1 0 0 0 1
187 1 0 1 1 1 0 0 1 1
188 1 0 1 1 1 0 1 0 1
189 1 0 1 1 1 0 1 1 1
190 1 0 1 1 1 1 0 0 1
191 1 0 1 1 1 1 0 1 1
192 1 0 1 1 1 1 1 0 1
193 1 0 1 1 1 1 1 1 1
194 1 1 0 0 0 0 0 0 1
195 1 1 0 0 0 0 0 1 1
196 1 1 0 0 0 0 1 0 1
197 1 1 0 0 0 0 1 1 1
198 1 1 0 0 0 1 0 0 1
199 1 1 0 0 0 1 0 1 1
200 1 1 0 0 0 1 1 0 1
201 1 1 0 0 0 1 1 1 1
202 1 1 0 0 1 0 0 0 1
203 1 1 0 0 1 0 0 1 1
204 1 1 0 0 1 0 1 0 1
205 1 1 0 0 1 0 1 1 1
206 1 1 0 0 1 1 0 0 1
207 1 1 0 0 1 1 0 1 1
208 1 1 0 0 1 1 1 0 1
209 1 1 0 0 1 1 1 1 1
210 1 1 0 1 0 0 0 0 1
211 1 1 0 1 0 0 0 1 1
212 1 1 0 1 0 0 1 0 1
213 1 1 0 1 0 0 1 1 1
214 1 1 0 1 0 1 0 0 1
215 1 1 0 1 0 1 0 1 1
216 1 1 0 1 0 1 1 0 1
217 1 1 0 1 0 1 1 1 1
218 1 1 0 1 1 0 0 0 1
219 1 1 0 1 1 0 0 1 1
220 1 1 0 1 1 0 1 0 1
221 1 1 0 1 1 0 1 1 1
222 1 1 0 1 1 1 0 0 1
223 1 1 0 1 1 1 0 1 1
224 1 1 0 1 1 1 1 0 1
225 1 1 0 1 1 1 1 1 1
226 1 1 1 0 0 0 0 0 1
227 1 1 1 0 0 0 0 1 1
228 1 1 1 0 0 0 1 0 1
229 1 1 1 0 0 0 1 1 1
230 1 1 1 0 0 1 0 0 1
231 1 1 1 0 0 1 0 1 1
232 1 1 1 0 0 1 1 0 1
233 1 1 1 0 0 1 1 1 1
234 1 1 1 0 1 0 0 0 1
235 1 1 1 0 1 0 0 1 1
236 1 1 1 0 1 0 1 0 1
237 1 1 1 0 1 0 1 1 1
238 1 1 1 0 1 1 0 0 1
239 1 1 1 0 1 1 0 1 1
240 1 1 1 0 1 1 1 0 1
241 1 1 1 0 1 1 1 1 1
242 1 1 1 1 0 0 0 0 1
243 1 1 1 1 0 0 0 1 1
244 1 1 1 1 0 0 1 0 1
245 1 1 1 1 0 0 1 1 1
246 1 1 1 1 0 1 0 0 1
247 1 1 1 1 0 1 0 1 1
248 1 1 1 1 0 1 1 0 1
249 1 1 1 1 0 1 1 1 1
250 1 1 1 1 1 0 0 0 1
251 1 1 1 1 1 0 0 1 1
252 1 1 1 1 1 0 1 0 1
253 1 1 1 1 1 0 1 1 1
254 1 1 1 1 1 1 0 0 1
255 1 1 1 1 1 1 0 1 1
256 1 1 1 1 1 1 1 0 1
257 1 1 1 1 1 1 1 1 1