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
|
||||
DYWAN = 3
|
||||
KALUZA = 4
|
||||
SCIANA2=5
|
||||
OSOBA=6
|
||||
|
||||
|
||||
ZawartoscPolaNaKolorPola = {
|
||||
@ -43,7 +45,9 @@ ZawartoscPolaNaKolorPola = {
|
||||
ZawartoscPola.SCIANA: CIEMNY_BRAZOWY1,
|
||||
ZawartoscPola.CEL: ZIELONY1,
|
||||
ZawartoscPola.DYWAN: ZOLTY1,
|
||||
ZawartoscPola.KALUZA: NIEBIESKI1
|
||||
ZawartoscPola.KALUZA: NIEBIESKI1,
|
||||
ZawartoscPola.SCIANA2: SZARY1,
|
||||
ZawartoscPola.OSOBA: IKONA
|
||||
}
|
||||
|
||||
ZawartoscPolaNaKosztObrotu = {
|
||||
@ -51,7 +55,9 @@ ZawartoscPolaNaKosztObrotu = {
|
||||
ZawartoscPola.SCIANA: None,
|
||||
ZawartoscPola.CEL: 1,
|
||||
ZawartoscPola.DYWAN: 5,
|
||||
ZawartoscPola.KALUZA: 3
|
||||
ZawartoscPola.KALUZA: 3,
|
||||
ZawartoscPola.SCIANA2: None,
|
||||
ZawartoscPola.OSOBA: None
|
||||
}
|
||||
|
||||
ZawartoscPolaNaKosztWjechania = {
|
||||
@ -59,5 +65,7 @@ ZawartoscPolaNaKosztWjechania = {
|
||||
ZawartoscPola.SCIANA: None,
|
||||
ZawartoscPola.CEL: 2,
|
||||
ZawartoscPola.DYWAN: 5,
|
||||
ZawartoscPola.KALUZA: 35
|
||||
ZawartoscPola.KALUZA: 35,
|
||||
ZawartoscPola.SCIANA2: None,
|
||||
ZawartoscPola.OSOBA: None
|
||||
}
|
||||
|
7
krata.py
7
krata.py
@ -71,7 +71,12 @@ class Krata(Obserwowany):
|
||||
start = (self.odstepMiedzyPolami + self.bokPola) * kolumna + self.odstepMiedzyPolami
|
||||
gora = (self.odstepMiedzyPolami + self.bokPola) * wiersz + self.odstepMiedzyPolami
|
||||
kolor_pola = ZawartoscPolaNaKolorPola[self.krata[wiersz][kolumna]]
|
||||
pygame.draw.rect(self.okno, kolor_pola, [start, gora, self.bokPola, self.bokPola])
|
||||
if kolor_pola != IKONA:
|
||||
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):
|
||||
self.okno.fill(SZARY1)
|
||||
|
46
main.py
46
main.py
@ -1,10 +1,13 @@
|
||||
import ctypes
|
||||
import os
|
||||
import threading
|
||||
|
||||
import pygame.transform
|
||||
|
||||
from agent import *
|
||||
from okno import *
|
||||
from ramy_czyli_wiedza_agenta import *
|
||||
from rescue import *
|
||||
|
||||
# aby działalo w oknie + rozdzielczość ekranu
|
||||
# ctypes.windll.shcore.SetProcessDpiAwareness(1)
|
||||
@ -54,6 +57,16 @@ def nadaj_cel_agentowi(agent: Agent):
|
||||
zaznacz_cel_na_mapie(agent.cel)
|
||||
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():
|
||||
# dla kraty 30 x 15
|
||||
@ -91,17 +104,48 @@ def main():
|
||||
(5, 9), (7, 9), (7, 10)):
|
||||
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.wyswietlOkno()
|
||||
|
||||
t = threading.Timer(5.0, zdarzenie_osoba).start()
|
||||
osoba = PoleKraty(krata_magazynu, 0, 0)
|
||||
clf=drzewo_decyzyjne()
|
||||
global flaga1
|
||||
flaga1 = 0
|
||||
|
||||
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)
|
||||
if krata_magazynu.agent.cel is None:
|
||||
nadaj_cel_agentowi(krata_magazynu.agent)
|
||||
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:
|
||||
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
|
||||
#
|
||||
# SZEROKOSC_OKNA = 1500
|
||||
@ -23,6 +26,8 @@ CZARNY = (0, 0, 0)
|
||||
CIEMNY_BRAZOWY1 = (60, 19, 33)
|
||||
ZOLTY1 = (231, 213, 69)
|
||||
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):
|
||||
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
|
||||
else:
|
||||
return False
|
||||
|
Loading…
Reference in New Issue
Block a user