Drzewo decyzyjne - decyzja, czy osoba ma natychmast opuścić magazyn

This commit is contained in:
s464931 2022-05-11 17:32:28 +02:00
parent 18ab66459c
commit bf0f1a4362
9 changed files with 148 additions and 6 deletions

BIN
Ikony/bieg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

BIN
Ikony/osoba2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

39
dataset.csv Normal file
View File

@ -0,0 +1,39 @@
plec;wiek;czas_w_pom;temp_w_pom;poziom_kurzu;poziom_oswietlenia;niebezp_towary;decyzja
2;1;3;0;2;1;0;1
2;1;3;0;1;1;1;1
2;1;3;0;1;1;0;0
2;1;3;0;1;2;0;0
1;1;3;0;1;1;0;1
2;1;2;0;2;1;1;1
2;1;2;0;2;2;1;1
2;1;2;0;1;1;1;0
2;1;2;0;1;2;1;0
1;1;2;0;1;1;1;1
1;1;2;0;2;1;0;0
2;1;3;1;2;1;1;1
2;1;3;1;2;2;1;1
2;1;3;1;1;1;1;0
1;1;3;1;1;1;1;1
1;1;3;1;1;2;1;1
1;1;3;1;2;1;0;0
2;1;2;1;2;1;1;0
1;1;2;1;2;1;1;0
2;2;3;0;2;1;0;1
2;2;3;0;2;2;1;1
2;2;3;0;2;2;0;0
2;2;3;0;1;2;0;0
1;2;3;0;2;2;0;1
2;2;2;0;2;1;1;1
2;2;2;0;1;1;1;1
2;2;2;0;2;2;1;0
2;2;2;0;1;2;1;0
1;2;2;0;2;2;1;1
1;2;2;0;2;1;0;0
2;2;3;1;2;1;1;1
2;2;3;1;1;1;1;1
2;2;3;1;2;2;1;0
1;2;3;1;2;2;1;1
1;2;3;1;1;2;1;1
1;2;3;1;2;1;0;0
2;2;2;1;2;1;1;0
1;2;2;1;2;1;1;0
1 plec wiek czas_w_pom temp_w_pom poziom_kurzu poziom_oswietlenia niebezp_towary decyzja
2 2 1 3 0 2 1 0 1
3 2 1 3 0 1 1 1 1
4 2 1 3 0 1 1 0 0
5 2 1 3 0 1 2 0 0
6 1 1 3 0 1 1 0 1
7 2 1 2 0 2 1 1 1
8 2 1 2 0 2 2 1 1
9 2 1 2 0 1 1 1 0
10 2 1 2 0 1 2 1 0
11 1 1 2 0 1 1 1 1
12 1 1 2 0 2 1 0 0
13 2 1 3 1 2 1 1 1
14 2 1 3 1 2 2 1 1
15 2 1 3 1 1 1 1 0
16 1 1 3 1 1 1 1 1
17 1 1 3 1 1 2 1 1
18 1 1 3 1 2 1 0 0
19 2 1 2 1 2 1 1 0
20 1 1 2 1 2 1 1 0
21 2 2 3 0 2 1 0 1
22 2 2 3 0 2 2 1 1
23 2 2 3 0 2 2 0 0
24 2 2 3 0 1 2 0 0
25 1 2 3 0 2 2 0 1
26 2 2 2 0 2 1 1 1
27 2 2 2 0 1 1 1 1
28 2 2 2 0 2 2 1 0
29 2 2 2 0 1 2 1 0
30 1 2 2 0 2 2 1 1
31 1 2 2 0 2 1 0 0
32 2 2 3 1 2 1 1 1
33 2 2 3 1 1 1 1 1
34 2 2 3 1 2 2 1 0
35 1 2 3 1 2 2 1 1
36 1 2 3 1 1 2 1 1
37 1 2 3 1 2 1 0 0
38 2 2 2 1 2 1 1 0
39 1 2 2 1 2 1 1 0

View File

@ -36,6 +36,8 @@ class ZawartoscPola(Enum):
CEL = 2 CEL = 2
DYWAN = 3 DYWAN = 3
KALUZA = 4 KALUZA = 4
SCIANA2=5
OSOBA=6
ZawartoscPolaNaKolorPola = { ZawartoscPolaNaKolorPola = {
@ -43,7 +45,9 @@ ZawartoscPolaNaKolorPola = {
ZawartoscPola.SCIANA: CIEMNY_BRAZOWY1, ZawartoscPola.SCIANA: CIEMNY_BRAZOWY1,
ZawartoscPola.CEL: ZIELONY1, ZawartoscPola.CEL: ZIELONY1,
ZawartoscPola.DYWAN: ZOLTY1, ZawartoscPola.DYWAN: ZOLTY1,
ZawartoscPola.KALUZA: NIEBIESKI1 ZawartoscPola.KALUZA: NIEBIESKI1,
ZawartoscPola.SCIANA2: SZARY1,
ZawartoscPola.OSOBA: IKONA
} }
ZawartoscPolaNaKosztObrotu = { ZawartoscPolaNaKosztObrotu = {
@ -51,7 +55,9 @@ ZawartoscPolaNaKosztObrotu = {
ZawartoscPola.SCIANA: None, ZawartoscPola.SCIANA: None,
ZawartoscPola.CEL: 1, ZawartoscPola.CEL: 1,
ZawartoscPola.DYWAN: 5, ZawartoscPola.DYWAN: 5,
ZawartoscPola.KALUZA: 3 ZawartoscPola.KALUZA: 3,
ZawartoscPola.SCIANA2: None,
ZawartoscPola.OSOBA: None
} }
ZawartoscPolaNaKosztWjechania = { ZawartoscPolaNaKosztWjechania = {
@ -59,5 +65,7 @@ ZawartoscPolaNaKosztWjechania = {
ZawartoscPola.SCIANA: None, ZawartoscPola.SCIANA: None,
ZawartoscPola.CEL: 2, ZawartoscPola.CEL: 2,
ZawartoscPola.DYWAN: 5, ZawartoscPola.DYWAN: 5,
ZawartoscPola.KALUZA: 35 ZawartoscPola.KALUZA: 35,
ZawartoscPola.SCIANA2: None,
ZawartoscPola.OSOBA: None
} }

View File

@ -71,7 +71,12 @@ class Krata(Obserwowany):
start = (self.odstepMiedzyPolami + self.bokPola) * kolumna + self.odstepMiedzyPolami start = (self.odstepMiedzyPolami + self.bokPola) * kolumna + self.odstepMiedzyPolami
gora = (self.odstepMiedzyPolami + self.bokPola) * wiersz + self.odstepMiedzyPolami gora = (self.odstepMiedzyPolami + self.bokPola) * wiersz + self.odstepMiedzyPolami
kolor_pola = ZawartoscPolaNaKolorPola[self.krata[wiersz][kolumna]] kolor_pola = ZawartoscPolaNaKolorPola[self.krata[wiersz][kolumna]]
if kolor_pola != IKONA:
pygame.draw.rect(self.okno, kolor_pola, [start, gora, self.bokPola, self.bokPola]) pygame.draw.rect(self.okno, kolor_pola, [start, gora, self.bokPola, self.bokPola])
else:
osoba_ikona = pygame.transform.scale(pygame.image.load(os.path.join('Ikony', 'osoba2.png')),
(BOK_AGENTA1, BOK_AGENTA1))
self.okno.blit(osoba_ikona, [start, gora, self.bokPola, self.bokPola])
def narysujKrateAlternatywnie(self): def narysujKrateAlternatywnie(self):
self.okno.fill(SZARY1) self.okno.fill(SZARY1)

46
main.py
View File

@ -1,10 +1,13 @@
import ctypes
import os import os
import threading
import pygame.transform import pygame.transform
from agent import * from agent import *
from okno import * from okno import *
from ramy_czyli_wiedza_agenta import * from ramy_czyli_wiedza_agenta import *
from rescue import *
# aby działalo w oknie + rozdzielczość ekranu # aby działalo w oknie + rozdzielczość ekranu
# ctypes.windll.shcore.SetProcessDpiAwareness(1) # ctypes.windll.shcore.SetProcessDpiAwareness(1)
@ -54,6 +57,16 @@ def nadaj_cel_agentowi(agent: Agent):
zaznacz_cel_na_mapie(agent.cel) zaznacz_cel_na_mapie(agent.cel)
print("CEL:", agent.cel.poleStartoweGorne.wiersz, agent.cel.poleStartoweGorne.kolumna) print("CEL:", agent.cel.poleStartoweGorne.wiersz, agent.cel.poleStartoweGorne.kolumna)
def zdarzenie_osoba():
global flaga1
flaga1=1
def losowa_osoba():
wiersz = random.randint(0, krata_magazynu.liczbaPolPionowo - 1)
kolumna = random.randint(0, krata_magazynu.liczbaPolPoziomo - 1)
osoba = PoleKraty(krata_magazynu, wiersz, kolumna)
return osoba
def main(): def main():
# dla kraty 30 x 15 # dla kraty 30 x 15
@ -91,17 +104,48 @@ def main():
(5, 9), (7, 9), (7, 10)): (5, 9), (7, 9), (7, 10)):
krata_magazynu.krata[i[0]][i[1]] = ZawartoscPola.KALUZA krata_magazynu.krata[i[0]][i[1]] = ZawartoscPola.KALUZA
dodaj_agenta() for i in range(LICZBA_POL_W_PIONIE):
krata_magazynu.krata[i][21] = ZawartoscPola.SCIANA2
krata_magazynu.krata[0][21]=ZawartoscPola.PUSTE
krata_magazynu.krata[7][21] = ZawartoscPola.PUSTE
krata_magazynu.krata[14][21] = ZawartoscPola.PUSTE
dodaj_agenta()
okno1 = Okno(krata_magazynu, krata_magazynu.agent) okno1 = Okno(krata_magazynu, krata_magazynu.agent)
okno1.wyswietlOkno() okno1.wyswietlOkno()
t = threading.Timer(5.0, zdarzenie_osoba).start()
osoba = PoleKraty(krata_magazynu, 0, 0)
clf=drzewo_decyzyjne()
global flaga1
flaga1 = 0
while True: while True:
# cel to Stan (pole kraty gdzie ma stać agent, aby położyć paczkę na półkę, w obiekcie klasy Miejsce jest to artybut dostęp + kierunek <-na razie niepotrzebny) # cel to Stan (pole kraty gdzie ma stać agent, aby położyć paczkę na półkę, w obiekcie klasy Miejsce jest to artybut dostęp + kierunek <-na razie niepotrzebny)
if krata_magazynu.agent.cel is None: if krata_magazynu.agent.cel is None:
nadaj_cel_agentowi(krata_magazynu.agent) nadaj_cel_agentowi(krata_magazynu.agent)
krata_magazynu.agent.idzDoCelu() krata_magazynu.agent.idzDoCelu()
if flaga1 == 1:
osoba.krata.krata[osoba.wiersz][osoba.kolumna] = ZawartoscPola.PUSTE
okno1.wyswietlOkno()
osoba = losowa_osoba()
while osoba.krata.krata[osoba.wiersz][osoba.kolumna] != ZawartoscPola.PUSTE:
osoba = losowa_osoba()
osoba.krata.krata[osoba.wiersz][osoba.kolumna] = ZawartoscPola.OSOBA
okno1.wyswietlOkno()
pygame.time.wait(1000)
answer = decyzja_osoba(osoba, clf)
if answer == 1:
osoba.krata.krata[osoba.wiersz][osoba.kolumna] = ZawartoscPola.PUSTE
okno1.wyswietlOkno()
bieg = pygame.transform.scale(pygame.image.load(os.path.join('Ikony', 'bieg.png')),
(BOK_AGENTA1, BOK_AGENTA1))
okno_pygame.blit(bieg, (osoba.kolumna * (BOK_POLA + 1) + 1, osoba.wiersz * (BOK_POLA + 1) + 1))
pygame.display.flip()
pygame.time.wait(1500)
flaga1 = 0
t = threading.Timer(5.0, zdarzenie_osoba).start()
try: try:
main() main()

41
rescue.py Normal file
View File

@ -0,0 +1,41 @@
import random
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics
from krata import *
def drzewo_decyzyjne():
columns = ['plec', 'wiek', 'czas_w_pom', 'temp_w_pom', 'poziom_kurzu', 'poziom_oswietlenia', 'niebezp_towary', 'decyzja']
df = pd.read_csv("dataset.csv", header=0, sep=";", names=columns)
x = df[['plec', 'wiek', 'czas_w_pom', 'temp_w_pom', 'poziom_kurzu', 'poziom_oswietlenia', 'niebezp_towary']]
y = df.decyzja
#df.info()
#X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf = DecisionTreeClassifier()
clf = clf.fit(x, y)
# print("Dokładność: ", metrics.accuracy_score(y_test, y_pred))
return clf
def decyzja_osoba(osoba: PoleKraty, clf: DecisionTreeClassifier):
z=[]
z.extend(random.choices([1,2], weights=[1,2], k=1)) #1 kobieta, 2 mężczyzna
z.extend(random.choices([1, 2], weights=[4,1], k=1)) # 1 dorosły, 2 osoba starsza
z.extend(random.choices([1, 2, 3], weights=[2, 5, 3], k=1)) # jak długo przebywa w pomieszczeniu, 3 to nadłużej
if osoba.kolumna > 21:
z.append(0) # zimne pomieszczenie
else:
z.append(1) # normalne pomieszczenie
z.extend(random.choices([1, 2], weights=[7, 3], k=1)) # poziom kurzu, 2 to największy/najbardziej niebezpieczny
z.extend(random.choices([1, 2], weights=[4, 6], k=1)) # poziom oświetlenia, 2 to najlepsze oświetlenie
if (0<=osoba.wiersz or osoba.wiersz<=13) and (17<=osoba.kolumna or osoba.kolumna<=19): #obok szafki z niebezpiecznymi towarami
z.append(1)
else:
z.append(0)
columns = ['plec', 'wiek', 'czas_w_pom', 'temp_w_pom', 'poziom_kurzu', 'poziom_oswietlenia', 'niebezp_towary']
z1 = pd.DataFrame([z],columns=columns)
z_pred = clf.predict(z1)
#print(z)
#print(z_pred)
return (z_pred)

View File

@ -1,3 +1,6 @@
import os
import pygame
FPS = 20 FPS = 20
# #
# SZEROKOSC_OKNA = 1500 # SZEROKOSC_OKNA = 1500
@ -23,6 +26,8 @@ CZARNY = (0, 0, 0)
CIEMNY_BRAZOWY1 = (60, 19, 33) CIEMNY_BRAZOWY1 = (60, 19, 33)
ZOLTY1 = (231, 213, 69) ZOLTY1 = (231, 213, 69)
NIEBIESKI1 = (65, 125, 225) NIEBIESKI1 = (65, 125, 225)
IKONA=pygame.transform.scale(pygame.image.load(os.path.join('Ikony', 'osoba2.png')),
(BOK_AGENTA1, BOK_AGENTA1))
### ###
### ###

View File

@ -70,7 +70,7 @@ def pole_w_granicach_kraty(pole: PoleKraty):
def mozna_wjechac_na_pole(pole: PoleKraty): def mozna_wjechac_na_pole(pole: PoleKraty):
if pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.SCIANA: if pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.SCIANA and pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.SCIANA2 and pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.OSOBA:
return True return True
else: else:
return False return False