Drzewo decyzyjne - decyzja, czy osoba ma natychmast opuścić magazyn
This commit is contained in:
parent
18ab66459c
commit
bf0f1a4362
BIN
Ikony/bieg.png
Normal file
BIN
Ikony/bieg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 694 B |
BIN
Ikony/osoba2.png
Normal file
BIN
Ikony/osoba2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 377 B |
39
dataset.csv
Normal file
39
dataset.csv
Normal 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
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
5
krata.py
5
krata.py
@ -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
46
main.py
@ -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
41
rescue.py
Normal 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)
|
5
stale.py
5
stale.py
@ -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))
|
||||||
###
|
###
|
||||||
|
|
||||||
###
|
###
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user