From c7e8b64c2f0265441292487ee0b43fd37178dc00 Mon Sep 17 00:00:00 2001 From: s481847 Date: Thu, 13 Jun 2024 15:28:32 +0200 Subject: [PATCH] Upload files to "/" Dodano drzewo decyzyjne --- main.py | 265 +++++++++++++++++++++++++++++++++++++---------- zbior_uczacy.csv | 257 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 465 insertions(+), 57 deletions(-) create mode 100644 zbior_uczacy.csv diff --git a/main.py b/main.py index c226542..8e639e4 100644 --- a/main.py +++ b/main.py @@ -1,29 +1,33 @@ import pygame import random import time +import pandas as pd +import math +import matplotlib.pyplot as plt kuchnia_xy = 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 rows = 14 columns = 24 -#-----------------------------Inicjacja klas + +# -----------------------------Inicjacja klas class Kelner: def __init__(self, x, y): self.x = x self.y = y - self.speed = 80 # od 0 do 100, preferowane 80 - self.stanPrzestrzeni = [0,0,0] + self.speed = 80 # od 0 do 100, preferowane 80 + self.stanPrzestrzeni = [0, 0, 0] self.stan = "stoi" # Stan kelnera: stoi, odbiera lub wraca self.stolik_docelowy = None # Stolik, do którego idzie kelner self.chodzi = True self.cel_x = x 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 def wklej(self): @@ -41,7 +45,7 @@ class Kelner: def obrot_w_lewo(self): 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): self.kierunek = (self.kierunek + 1) % 4 @@ -49,18 +53,17 @@ class Kelner: def idz_do_przodu(self): if self.kierunek == 0: - self.y -= 1 + self.y -= 1 self.stanPrzestrzeni[1] -= 1 elif self.kierunek == 1: - self.x += 1 + self.x += 1 self.stanPrzestrzeni[0] += 1 elif self.kierunek == 2: - self.y += 1 + self.y += 1 self.stanPrzestrzeni[1] += 1 elif self.kierunek == 3: - self.x -= 1 + self.x -= 1 self.stanPrzestrzeni[0] -= 1 - def wykonajAkcje(self, ruchy): if self.indexRuchu < len(ruchy): @@ -85,13 +88,14 @@ class Stolik: def wklej(self): screen.blit(stolikImg, (self.x * blockSize, self.y * blockSize)) + class Przeszkoda: def __init__(self, x, y, typ): self.x = x self.y = y self.typ = typ - #ocena kosztu przeszkody + # ocena kosztu przeszkody if self.typ == "sliska podloga": self.cena = 2 @@ -104,10 +108,12 @@ class Przeszkoda: elif self.typ == "dywan": screen.blit(dywanImg, (self.x * blockSize, self.y * blockSize)) -#-----------------Przeszukiwanie przestrzeni stanów + +# -----------------Przeszukiwanie przestrzeni stanów import heapq + def a_star(start, cel, stoliki, przeszkody): queue = [] # Kolejka priorytetowa 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) 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: - 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 + return odtworz_ruchy(poprzednicy, obecny) - #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]: heapq.heappush(queue, (nowy_koszt + heurystyka(nastepnik, cel), nastepnik)) 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]) -#----------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): x, y, kierunek = stan ruchy = [] @@ -159,17 +165,18 @@ def generuj_nastepniki_i_ruchy(stan, stoliki, przeszkody): elif kierunek == 3: 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: - #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): - koszt = next((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) ) + koszt = next( + (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 -#-----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): ruchy = [] krok = cel @@ -179,22 +186,94 @@ def odtworz_ruchy(poprzednicy, cel): ruchy.reverse() 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 cel = (0, 0) # Docelowe współrzędne -#--------------Inicjacja obiektów -kelner = Kelner(pozycja_startowa,pozycja_startowa) +# --------------Inicjacja obiektów +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"] -#-----------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"] -#-----------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"] -#Tworzenie listy stolikow i przeszkod +# Tworzenie listy stolikow i przeszkod stoliki = [] przeszkody = [] if not losuj_uklad: @@ -209,16 +288,16 @@ if not losuj_uklad: przeszkody.append(Przeszkoda(x, y, "dywan")) else: juzbyly = [] - for j in range(1,rows): + for j in range(1, rows): 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)): - stoliki.append(Stolik(i,j)) - juzbyly.append((i,j)) + 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)): + stoliki.append(Stolik(i, j)) + juzbyly.append((i, j)) elif random.randrange(9) == 0: - przeszkody.append(Przeszkoda(i,j, "sliska podloga")) + przeszkody.append(Przeszkoda(i, j, "sliska podloga")) elif random.randrange(12) == 0: - przeszkody.append(Przeszkoda(i,j, "dywan")) - + przeszkody.append(Przeszkoda(i, j, "dywan")) # stoliki = [] # for i in range(rows) @@ -226,7 +305,7 @@ else: pygame.init() pygame.display.set_caption("Automatyczny kelner") -#----------------wymiary okna +# ----------------wymiary okna width = columns * blockSize height = rows * blockSize @@ -245,19 +324,43 @@ sliskaPodlogaImg = pygame.transform.scale(sliskaPodlogaImg, (blockSize, blockSiz dywanImg = pygame.image.load("dywan.png") dywanImg = pygame.transform.scale(dywanImg, (blockSize, blockSize)) + def kuchnia(x, y): screen.blit(kitchenImg, (x * blockSize, y * blockSize)) + def menu(x, y): screen.blit(menuImg, (x * blockSize, y * blockSize)) + def wypiszOkno(): screen.fill((0, 0, 0)) for x in range(0, width, blockSize): for y in range(0, height, blockSize): rect = pygame.Rect(x, y, blockSize, blockSize) - 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, (200, 200, 200), 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 @@ -267,28 +370,66 @@ licznik = 0 ruchy = [] 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: cel2 = list(cel) - #print(f"{kelner.stanPrzestrzeni}, {cel2}, {kelner.indexRuchu} {kelner.stan}") + # print(f"{kelner.stanPrzestrzeni}, {cel2}, {kelner.indexRuchu} {kelner.stan}") wypiszOkno() kuchnia(kuchnia_xy, kuchnia_xy) for stolik in stoliki: stolik.wklej() - + for przeszkoda in przeszkody: przeszkoda.wklej() kelner.wklej() if kelner.stan == "wraca": - menu(kelner.x, kelner.y) + menu(kelner.x, kelner.y) licznik += 1 - - #------------weź zamowienie - for stolik in stoliki: + + # ------------weź zamowienie + for stolik in stoliki: if stolik.zamowione == True: menu(stolik.x, stolik.y) if kelner.stan == "stoi": @@ -298,29 +439,30 @@ while run: print("Szukam ścieżki do stolika...") ruchy = a_star(tuple(kelner.stanPrzestrzeni), cel, stoliki, przeszkody) kelner.stan = "odbiera" + if ruchy: print("Znaleziono ścieżkę ruchów: ", ruchy) + czyZadowolony() else: 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": for stolik in stoliki: - if stolik.zamowione == True: + if stolik.zamowione == True: break for i in range(len(stoliki)): if random.randrange(2) == 1: stoliki[i].zamowione = True - #print(kelner.stan)--------------------------Wypisuje stan kelnera - #print(f"{kelner.x} {kelner.y}")-------------Wypisuje wspolrzedne kelnera + # print(kelner.stan)--------------------------Wypisuje stan kelnera + # print(f"{kelner.x} {kelner.y}")-------------Wypisuje wspolrzedne kelnera - #----------------Zmiana pozycji kelnera - if kelner.chodzi == True and licznik % (101 - kelner.speed) == 0 and kelner.stanPrzestrzeni[:2] != cel2: #ograniczenie prędkości + # ----------------Zmiana pozycji kelnera + if kelner.chodzi == True and licznik % (101 - kelner.speed) == 0 and kelner.stanPrzestrzeni[ + :2] != cel2: # ograniczenie prędkości kelner.wykonajAkcje(ruchy) - if kelner.stanPrzestrzeni[:2] == cel2: if kelner.stan == "odbiera" and kelner.x == kelner.stolik_docelowy.x and kelner.y == kelner.stolik_docelowy.y - 1: 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: kelner.stan = "stoi" - time.sleep(0.001) key = pygame.key.get_pressed() @@ -343,4 +484,14 @@ while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False +#------------------------------------------------------------------------------------------------------------------ + + +''' +frames.clear() +frames.append(data) +while len(frames) > 0: + data = frames.pop() + id3(data,"full") +''' pygame.quit() \ No newline at end of file diff --git a/zbior_uczacy.csv b/zbior_uczacy.csv new file mode 100644 index 0000000..a55cce7 --- /dev/null +++ b/zbior_uczacy.csv @@ -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 \ No newline at end of file