korzystanie z drzewa w main

This commit is contained in:
s473561 2023-05-29 00:13:02 +02:00
parent 6e0a6fb8c6
commit 87ec5eba2b
18 changed files with 250 additions and 59 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,11 +1,10 @@
import pygame
from plansza import x1, y1, x2, y2, x3, y3, x4, y4, a_pix, b_pix
import packageList
import regal
import wozek
from regal import Regal, obliczPixeleNaPodstawieKratek
# import wozek
from packageList import *
from paczka import Paczka
# from paczka import Paczka
EKRAN_SZEROKOSC = 770
EKRAN_WYSOKOSC = 770
@ -16,28 +15,45 @@ pygame.display.set_caption("Inteligentny wozek")
icon = pygame.image.load('images/icon.png')
pygame.display.set_icon(icon)
lista_paczek = packageList.zainicjuj_liste_paczek(a_pix, b_pix)
# lista_paczek = packageList.zainicjuj_liste_paczek(a_pix, b_pix)
lista_paczek = listOfPackages()
def narysuj_regaly():
regal.Regal(1, 1, x1, y1)
regal.Regal(2, 1, x1, y1+1)
regal.Regal(3, 1, x1+1, y1)
regal.Regal(4, 1, x1+1, y1+1)
global lista_regalow
r1 = Regal('ogród', x1, y1)
r2 = Regal('ogród', x1, y1+1)
r3 = Regal('ogród', x1+1, y1)
r4 = Regal('ogród', x1+1, y1+1)
regal.Regal(5, 1, x2, y2)
regal.Regal(6, 1, x2, y2+1)
regal.Regal(7, 1, x2+1, y2)
regal.Regal(8, 1, x2+1, y2+1)
r5 = Regal('narzedzia', x2, y2)
r6 = Regal('narzedzia', x2, y2+1)
r7 = Regal('narzedzia', x2+1, y2)
r8 = Regal('narzedzia', x2+1, y2+1)
regal.Regal(9, 1, x3, y3)
regal.Regal(10, 1, x3, y3+1)
regal.Regal(11, 1, x3+1, y3)
regal.Regal(12, 1, x3+1, y3+1)
r9 = Regal('kuchnia', x3, y3)
r10 = Regal('kuchnia', x3, y3+1)
r11 = Regal('kuchnia', x3+1, y3)
r12 = Regal('kuchnia', x3+1, y3+1)
regal.Regal(13, 1, x4, y4)
regal.Regal(14, 1, x4, y4+1)
regal.Regal(15, 1, x4+1, y4)
regal.Regal(16, 1, x4+1, y4+1)
r13 = Regal('motoryzacja', x4, y4)
r14 = Regal('motoryzacja', x4, y4+1)
r15 = Regal('motoryzacja', x4+1, y4)
r16 = Regal('motoryzacja', x4+1, y4+1)
lista_regalow = [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16]
def zwroc_regaly_kategoria(kategoria):
lista_reg = []
for reg in lista_regalow:
if reg.nazwaRegalu == kategoria:
lista_reg.append(reg)
return lista_reg
def zwroc_regaly_wspolrzedne(x_reg, y_reg):
for regal in lista_regalow:
if regal.wiersz == obliczPixeleNaPodstawieKratek(x_reg) and regal.kolumna == obliczPixeleNaPodstawieKratek(y_reg):
return regal
def narysuj_siatke():

19
grid.py
View File

@ -7,10 +7,17 @@ class GridCellType(Enum):
FREE = 0
RACK = 1
PLACE = 2
# dodać oznaczenie na miejsce dla paczek
# class RackCellType(Enum):
# OGROD = 0
# NARZEDZIA = 1
# KUCHNIA = 2
# MOTORYZACJA = 3
class SearchGrid:
grid: Dict[Tuple[int, int], GridCellType] = {}
# rack_grid : Dict[Tuple[int, int], GridCellType] = {}
def __init__(self) -> None:
self._init_grid()
@ -19,8 +26,10 @@ class SearchGrid:
for i in range (0,14):
for j in range(0,14):
self.grid[(i, j)] = GridCellType.FREE
for r, c in [(x1, y1), (x1, y1+1), (x1+1, y1), (x1+1, y1+1), (x2, y2), (x2+1, y2), (x2, y2+1), (x2+1, y2+1),
for c, d in [(x1, y1), (x1, y1+1), (x1+1, y1), (x1+1, y1+1), (x2, y2), (x2+1, y2), (x2, y2+1), (x2+1, y2+1),
(x3, y3), (x3+1, y3), (x3, y3+1), (x3+1, y3+1), (x4, y4), (x4+1, y4), (x4, y4+1), (x4+1, y4+1),]:
self.grid[(r,c)] = GridCellType.RACK
for m, n in [(a,b), (a+1,b), (a,b+1), (a+1,b+1)]:
self.grid[(m,n)] = GridCellType.PLACE
self.grid[(c,d)] = GridCellType.RACK
for e, f in [(a,b), (a+1,b), (a,b+1), (a+1,b+1)]:
self.grid[(e,f)] = GridCellType.PLACE

103
main.py
View File

@ -1,35 +1,116 @@
import sys
import pygame
from paczka import Paczka
from wozek import Wozek
import wyszukiwanie
import ekran
from grid import SearchGrid
from grid import GridCellType, SearchGrid
from sklearn.tree import DecisionTreeClassifier
import pandas as pd
from plansza import x1, y1, x2, y2, x3, y3, x4, y4, a_pix, b_pix
pygame.init()
def main():
wozek = Wozek()
paczka = Paczka('duzy', 10, 'ogród', False, True, False, any, any, any, any, any)
ekran.lista_paczek.add(paczka)
paczka.update_position(a_pix, b_pix)
grid_points = SearchGrid()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
sys.exit(0)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
## wozek jedzie po paczke
wiersz = ekran.sprawdz_ktory_wiersz(a_pix)
kolumna = ekran.sprawdz_ktora_kolumna(b_pix)
docelowy_stan = wyszukiwanie.Stan(wiersz * 70, kolumna * 70, 1)
#wezel = wyszukiwanie.wyszukiwanie_bfs(wozek.obecnyStan, docelowy_stan, grid_points)
wezel = wyszukiwanie.wyszukiwanie_a_star(wozek.obecnyStan, docelowy_stan, grid_points)
sciezka = wyszukiwanie.znajdz_sciezke(wezel)
wozek.przemiesc_wozek_po_sciezce(sciezka)
if grid_points.grid[(wiersz, kolumna)] is GridCellType.PLACE: #picks up package
if wozek.ln == 0:
wozek.load_package()
wozek.dynamic_wozek_picture
print(wozek.storage)
## wozek jedzie odlozyc paczke na regal
paczka1 = wozek.storage.pop()
array, reg = paczka1.tablica_do_drzewa('ogród')
plikZPrzecinkami = open("DecisionTree/training_data.txt", 'w')
with open('DecisionTree/200permutations_table.txt', 'r') as plik:
for linia in plik:
liczby = linia.strip()
wiersz = ""
licznik = 0
for liczba in liczby:
wiersz += liczba
wiersz += ";"
wiersz = wiersz[:-1]
wiersz += '\n'
plikZPrzecinkami.write(wiersz)
plikZPrzecinkami.close()
x = pd.read_csv('DecisionTree/training_data.txt', delimiter=';',
names=['wielkosc', 'waga,', 'priorytet', 'ksztalt', 'kruchosc', 'dolna', 'gorna', 'g > d'])
y = pd.read_csv('DecisionTree/decisions.txt', names=['polka'])
clf = DecisionTreeClassifier(criterion='entropy')
clf.fit(x.values, y.values)
predictions = clf.predict([array])
if predictions == 0:
print('odklada na dolna polke!')
else:
print('odklada na gorna polke!')
docelowy_stan = wyszukiwanie.Stan(reg.numerWiersza * 70, reg.numerKolumny * 70, 1) # x1 i y1 bo to są regału kategorii ogród
wezel = wyszukiwanie.wyszukiwanie_a_star(wozek.obecnyStan, docelowy_stan, grid_points)
sciezka = wyszukiwanie.znajdz_sciezke(wezel)
wozek.przemiesc_wozek_po_sciezce(sciezka)
# print(wozek.storage)
# if wozek.ln != 0: # drops package
# wozek.drop_package()
# wozek.dynamic_wozek_picture()
if event.type == pygame.MOUSEBUTTONDOWN:
# lewy przycisk myszy
if event.button == 1:
grid_points = SearchGrid()
x = pygame.mouse.get_pos()[0]
y = pygame.mouse.get_pos()[1]
wiersz = ekran.sprawdz_ktory_wiersz(x)
kolumna = ekran.sprawdz_ktora_kolumna(y)
docelowy_stan = wyszukiwanie.Stan(wiersz * 70, kolumna * 70, 1)
# wezel = wyszukiwanie.wyszukiwanie_bfs(wozek.obecnyStan, docelowy_stan, grid_points)
#wezel = wyszukiwanie.wyszukiwanie_bfs(wozek.obecnyStan, docelowy_stan, grid_points)
wezel = wyszukiwanie.wyszukiwanie_a_star(wozek.obecnyStan, docelowy_stan, grid_points)
sciezka = wyszukiwanie.znajdz_sciezke(wezel)
wozek.przemiesc_wozek_po_sciezce(sciezka)
# if grid_points.grid[(wiersz, kolumna)] is GridCellType.PLACE: #picks up package
# if wozek.ln == 0:
# wozek.load_package()
# wozek.dynamic_wozek_picture
# else:
# if wozek.ln != 0: # drops package
# wozek.drop_package()
# wozek.dynamic_wozek_picture()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
wozek.y_change = 1
@ -46,14 +127,14 @@ def main():
if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
wozek.x_change = 0
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
if wozek.ln == 0:
wozek.load_package()
wozek.dynamic_wozek_picture()
else:
wozek.drop_package()
wozek.dynamic_wozek_picture()
# if event.type == pygame.KEYDOWN:
# if event.key == pygame.K_SPACE:
# if wozek.ln == 0:
# wozek.load_package()
# wozek.dynamic_wozek_picture()
# else:
# wozek.drop_package()
# wozek.dynamic_wozek_picture()
wozek.obecnyStan.x += wozek.x_change
wozek.obecnyStan.y += wozek.y_change

View File

@ -1,6 +1,6 @@
import pygame
from paczka import Paczka
# from paczka import Paczka
class listOfPackages:
list = []
@ -15,9 +15,12 @@ class listOfPackages:
self.package_group.remove(last_package)
def zainicjuj_liste_paczek(init_x, init_y):
packageList = listOfPackages()
demo_paczka = Paczka('duzy', 10, any, False, True, False, any, any, any, any, any)
demo_paczka.update_position(init_x, init_y)
packageList.add(demo_paczka)
return packageList
# def zainicjuj_liste_paczek(init_x, init_y):
# packageList = listOfPackages()
# demo_paczka = Paczka('duzy', 10, any, False, True, False, any, any, any, any, any)
# demo_paczka.update_position(init_x, init_y)
# packageList.add(demo_paczka)
# return packageList

View File

@ -1,9 +1,9 @@
from etykieta import Etykieta
import pygame
import ekran
class Paczka(pygame.sprite.Sprite):
def __init__(self, rozmiar, waga, kategoria, priorytet, ksztalt, kruchosc, nadawca, adres, imie, nazwisko, telefon):
super().__init__()
self.rozmiar = rozmiar
@ -68,4 +68,58 @@ class Paczka(pygame.sprite.Sprite):
def update_position(self, x, y):
self.x = x
self.y = y
self.rect.topleft = (x, y)
self.rect.topleft = (x, y)
def tablica_do_drzewa(self, kategoria):
tablica = []
# rozmiar
if self.rozmiar == 'maly':
tablica.append(0)
elif self.rozmiar == 'sredni':
tablica.append(1)
else: tablica.append(2)
# waga
if self.waga == 'maly':
tablica.append(0)
elif self.waga == 'sredni':
tablica.append(1)
else: tablica.append(2)
# piorytet
if self.priorytet is True:
tablica.append(0)
else: tablica.append(1)
# kształt
if self.ksztalt is True:
tablica.append(0)
else: tablica.append(1)
# kruchość
if self.kruchosc is True:
tablica.append(0)
else: tablica.append(1)
reg = ekran.zwroc_regaly_kategoria(kategoria)
# czy dolna wolna
if reg[0].is_dolna_free() is True:
tablica.append(0)
else:
tablica.append(1)
#czy górna wolna
if reg[0].is_dolna_free() is True:
tablica.append(0)
else:
tablica.append(1)
# czy na górnej więcej miejsca
if reg[0].is_dolna_free() is True:
tablica.append(0)
else:
tablica.append(1)
return tablica, reg[0]

View File

@ -2,7 +2,7 @@ import random
def obliczPixeleNaPodstawieKratek(wymiar): #Przeliczanie współrzędnych podanych w kratkach na pixele
i = 1
pixele = 73
pixele = 70
while (i < wymiar):
pixele = pixele + 70
i = i + 1

View File

@ -1,5 +1,6 @@
import pygame
MAX_STORAGE = 3
def obliczPixeleNaPodstawieKratek(wymiar): #Przeliczanie współrzędnych podanych w kratkach na pixele
i = 1
@ -13,19 +14,20 @@ def obliczPixeleNaPodstawieKratek(wymiar): #Przeliczanie współrzędnych podany
def obliczPixeleDlugosciRegalu(self): #Przeliczanie dlugości regału podanego w kratkach na pixele
i = 1
dlugoscRegalu = 40
while (i < self.dlugoscRegaluWKratkach) and (i <= 11 - self.numerKolumny): #Sprawdzenie, żeby regał nie wychodził poza plansze, jeżeli tak to jest ucinany tak, żeby nie wychodził
while (i < 1) and (i <= 11 - self.numerKolumny): #Sprawdzenie, żeby regał nie wychodził poza plansze, jeżeli tak to jest ucinany tak, żeby nie wychodził
dlugoscRegalu = dlugoscRegalu + 80
i = i + 1
return dlugoscRegalu
class Regal(pygame.sprite.Sprite):
def __init__(self, numerRegalu, dlugoscRegaluWKratkach, numerWiersza, numerKolumny):
def __init__(self, nazwaRegalu, numerWiersza, numerKolumny):
super().__init__()
from ekran import screen
self.numerRegalu = numerRegalu
self.nazwaRegalu = nazwaRegalu
self.wysokoscRegalu = 64
self.dlugoscRegaluWKratkach = dlugoscRegaluWKratkach
self.numerKolumny = numerKolumny
self.numerWiersza = numerWiersza
self.wiersz = obliczPixeleNaPodstawieKratek(numerWiersza)
self.kolumna = obliczPixeleNaPodstawieKratek(numerKolumny)
@ -36,28 +38,52 @@ class Regal(pygame.sprite.Sprite):
"dolna": package_storage,
"gorna": package_storage
}
storage_dolna = []
storage_gorna = []
if(self.numerRegalu >= 0 and self.numerRegalu <= 4):
self.dolna = storage_dolna
self.gorna = storage_gorna
if(self.nazwaRegalu == 'ogród'):
reg = pygame.Surface([self.dlugosc, self.wysokoscRegalu])
reg = pygame.image.load("images/regal.png")
self.rect = reg.get_rect()
screen.blit(reg, (self.wiersz, self.kolumna))
if(self.numerRegalu >= 5 and self.numerRegalu <= 8):
if(self.nazwaRegalu == 'narzedzia'):
reg = pygame.Surface([self.dlugosc, self.wysokoscRegalu])
reg = pygame.image.load("images/regal1.png")
self.rect = reg.get_rect()
screen.blit(reg, (self.wiersz, self.kolumna))
if(self.numerRegalu >= 9 and self.numerRegalu <= 12):
if(self.nazwaRegalu == 'kuchnia'):
reg = pygame.Surface([self.dlugosc, self.wysokoscRegalu])
reg = pygame.image.load("images/regal2.png")
self.rect = reg.get_rect()
screen.blit(reg, (self.wiersz, self.kolumna))
if(self.numerRegalu >= 13 and self.numerRegalu <= 16):
if(self.nazwaRegalu == 'motoryzacja'):
reg = pygame.Surface([self.dlugosc, self.wysokoscRegalu])
reg = pygame.image.load("images/regal3.png")
self.rect = reg.get_rect()
screen.blit(reg, (self.wiersz, self.kolumna))
def is_dolna_free(self):
if len(self.dolna) <= MAX_STORAGE:
return True
return False
def is_gorna_free(self):
if len(self.gorna) <= MAX_STORAGE:
return True
return False
def czy_na_gornej_wiecej_miejsca(self):
if len(self.gorna) > len(self.dolna):
return True
return False

View File

@ -1,7 +1,9 @@
import ekran
import pygame,math
from packageList import listOfPackages
# from packageList import listOfPackages
from ekran import lista_paczek
listOfPackages = lista_paczek
class Wozek(pygame.sprite.Sprite):
def __init__(self):

View File

@ -57,7 +57,7 @@ def znajdz_nastepcow(wezel, search_grid, ktory_algorytm):
if ktory_algorytm == 1:
x1 = x / 70
y1 = y / 70
if search_grid.grid[(x1, y1)] is GridCellType.FREE:
if search_grid.grid[(x1, y1)] is GridCellType.FREE or search_grid.grid[(x1, y1)] is GridCellType.PLACE:
wezly.append(ruch_w_przod)
else:
wezly.append(ruch_w_przod)
@ -131,7 +131,7 @@ def wyszukiwanie_a_star(poczatkowyStan, docelowyStan, search_grid):
nastepca.g = g
nastepca.h = h
fringe[index] = nastepca
print(index)
# print(index)
# heapq.heapify(fringe)
return None
@ -147,6 +147,6 @@ def dobierz_wage_do_wezla(wezel, search_grid):
elif search_grid.grid[(x1, y1)] is GridCellType.RACK:
wezel.waga = 99999
elif search_grid.grid[(x1, y1)] is GridCellType.PLACE:
wezel.waga = 99999
wezel.waga = 1
return None