Dodanie drzewa decyzjnego v1 #24

Merged
s464843 merged 1 commits from decisionTree into master 2022-05-10 12:14:51 +02:00
7 changed files with 213 additions and 12 deletions

View File

@ -0,0 +1,66 @@
import joblib
import matplotlib.pyplot as plt
import pandas
from sklearn.tree import DecisionTreeClassifier, export_text, plot_tree
'''
atrybuty w pliku csv muszą być integerami, wstępnie ustaliłem:
season = {"wiosna": 1, "lato": 2, "jesien":3, "zima":4}
enough_space_in_trashmaster = { "no": 1, "yes":2}
time_since_flush = [1,2,3,4,5,6,7,8,9,10]
type_of_trash = {"bio":1, "szklo":2, "plastik":3, "papier":4, "mieszane":5}
access_to_bin = { "no":1, "yes":2}
distance = [1,2,3,4,5,6,7,8,9,10]
decision = [1,2,3,4,5]
'''
decisions = ["decision"]
attributes = ["season", "enough_space_in_trashmaster", "time_since_flush", "type_of_trash", "access_to_bin", "distance",
"decision"]
# return tree made from attributes
def tree():
dataset = pandas.read_csv('./decision_tree/drzewo_decyzyjne.csv')
x = dataset[attributes]
y = dataset[decisions]
decision_tree = DecisionTreeClassifier()
decision_tree = decision_tree.fit(x, y)
return decision_tree
# return decision made from tree and attributes
def decision(decision_tree, season, enough_space_in_trashmaster, time_since_flush, type_of_trash, access_to_bin,
distance):
decision = decision_tree.predict(
[[season, enough_space_in_trashmaster, time_since_flush, type_of_trash, access_to_bin, distance]])
return decision
'''
we shall save output of our decision tree. It is possible for a few ways:
txt, png or structure
'''
def tree_as_txt(decision_tree):
with open('./decision_tree/tree_as_txt.txt', "w") as file:
file.write(export_text(decision_tree))
def tree_to_png(decision_tree):
plt.figure()
plot_tree(decision_tree, feature_names=attributes, filled=True)
plt.title("Decision tree")
plt.show()
def tree_to_structure(decision_tree):
joblib.dump(decision_tree, './decision_tree/tree_model')
#drzewo = tree()
#tree_as_txt(drzewo)
#tree_to_png(drzewo)
#tree_to_structure(drzewo)

View File

@ -0,0 +1,101 @@
season,enough_space_in_trashmaster,time_since_flush,type_of_trash,access_to_bin,distance,decision
2,2,1,1,2,10,1
2,2,2,2,2,8,1
2,2,3,3,2,6,1
2,2,4,4,2,4,2
2,2,5,5,2,2,3
2,2,6,1,2,1,5
2,2,7,2,2,3,4
2,2,8,3,2,5,4
2,2,9,4,2,7,3
2,2,10,5,2,9,5
2,2,1,1,2,2,1
2,2,2,2,2,1,1
2,2,3,3,2,3,2
2,2,4,4,2,4,2
2,2,5,5,2,5,3
2,2,6,1,2,6,3
2,2,7,2,2,7,2
2,2,8,3,2,8,2
2,2,9,4,2,9,4
2,2,10,5,2,10,4
2,2,1,1,2,7,1
2,2,2,2,2,6,2
2,2,3,3,2,5,3
2,2,4,4,1,4,0
2,2,5,5,1,3,0
2,2,6,1,1,2,0
2,2,7,2,1,1,0
2,2,8,3,1,9,0
2,2,9,4,1,8,0
2,2,10,5,1,7,0
2,2,1,1,1,3,0
2,2,2,2,1,2,0
2,2,3,3,1,1,0
2,2,4,4,1,4,0
2,1,5,5,1,5,0
2,1,6,1,1,6,0
2,1,7,2,1,10,0
2,1,8,3,1,9,0
2,1,9,4,1,8,0
2,1,10,5,1,7,0
2,1,1,1,1,2,0
2,1,2,2,1,4,0
2,1,3,3,1,6,0
2,1,4,4,1,8,0
2,1,5,5,2,10,0
2,1,6,1,2,1,0
2,1,7,2,2,3,0
2,1,8,3,2,5,0
2,1,9,4,2,7,0
2,1,10,5,2,9,0
3,2,1,1,2,2,1
3,2,2,2,2,1,1
3,2,3,3,2,4,2
3,2,4,4,2,3,3
3,2,5,5,2,6,4
3,2,6,1,2,5,4
3,2,7,2,2,8,3
3,2,8,3,2,7,3
3,2,9,4,2,9,4
3,2,10,5,2,10,5
3,2,1,1,2,7,1
3,2,2,2,2,6,1
3,2,3,3,2,4,3
3,2,4,4,2,1,3
3,2,5,5,2,2,4
3,2,6,1,2,3,4
3,2,7,2,2,9,3
3,2,8,3,2,8,3
3,2,9,4,2,5,5
3,2,10,5,2,4,5
3,2,1,1,2,1,1
3,2,2,2,1,7,0
3,2,3,3,1,9,0
3,2,4,4,1,10,0
3,2,5,5,1,3,0
3,2,6,1,1,2,0
3,2,7,2,1,5,0
3,2,8,3,1,6,0
3,2,9,4,1,8,0
3,1,10,5,1,3,0
3,1,1,1,1,1,0
3,1,2,2,1,2,0
3,1,3,3,1,6,0
3,1,4,4,1,9,0
3,1,5,5,1,7,0
3,1,6,1,1,4,0
3,1,7,2,1,3,0
3,1,8,3,1,5,0
3,1,9,4,1,10,0
3,1,10,5,1,8,0
3,1,1,1,2,2,0
3,1,2,2,2,4,0
3,1,3,3,2,6,0
3,1,4,4,2,7,0
3,1,5,5,2,1,0
3,1,6,1,2,9,0
3,1,7,2,2,3,0
3,1,8,3,2,9,0
3,1,9,4,2,9,0
3,1,10,5,2,1,0
1 season enough_space_in_trashmaster time_since_flush type_of_trash access_to_bin distance decision
2 2 2 1 1 2 10 1
3 2 2 2 2 2 8 1
4 2 2 3 3 2 6 1
5 2 2 4 4 2 4 2
6 2 2 5 5 2 2 3
7 2 2 6 1 2 1 5
8 2 2 7 2 2 3 4
9 2 2 8 3 2 5 4
10 2 2 9 4 2 7 3
11 2 2 10 5 2 9 5
12 2 2 1 1 2 2 1
13 2 2 2 2 2 1 1
14 2 2 3 3 2 3 2
15 2 2 4 4 2 4 2
16 2 2 5 5 2 5 3
17 2 2 6 1 2 6 3
18 2 2 7 2 2 7 2
19 2 2 8 3 2 8 2
20 2 2 9 4 2 9 4
21 2 2 10 5 2 10 4
22 2 2 1 1 2 7 1
23 2 2 2 2 2 6 2
24 2 2 3 3 2 5 3
25 2 2 4 4 1 4 0
26 2 2 5 5 1 3 0
27 2 2 6 1 1 2 0
28 2 2 7 2 1 1 0
29 2 2 8 3 1 9 0
30 2 2 9 4 1 8 0
31 2 2 10 5 1 7 0
32 2 2 1 1 1 3 0
33 2 2 2 2 1 2 0
34 2 2 3 3 1 1 0
35 2 2 4 4 1 4 0
36 2 1 5 5 1 5 0
37 2 1 6 1 1 6 0
38 2 1 7 2 1 10 0
39 2 1 8 3 1 9 0
40 2 1 9 4 1 8 0
41 2 1 10 5 1 7 0
42 2 1 1 1 1 2 0
43 2 1 2 2 1 4 0
44 2 1 3 3 1 6 0
45 2 1 4 4 1 8 0
46 2 1 5 5 2 10 0
47 2 1 6 1 2 1 0
48 2 1 7 2 2 3 0
49 2 1 8 3 2 5 0
50 2 1 9 4 2 7 0
51 2 1 10 5 2 9 0
52 3 2 1 1 2 2 1
53 3 2 2 2 2 1 1
54 3 2 3 3 2 4 2
55 3 2 4 4 2 3 3
56 3 2 5 5 2 6 4
57 3 2 6 1 2 5 4
58 3 2 7 2 2 8 3
59 3 2 8 3 2 7 3
60 3 2 9 4 2 9 4
61 3 2 10 5 2 10 5
62 3 2 1 1 2 7 1
63 3 2 2 2 2 6 1
64 3 2 3 3 2 4 3
65 3 2 4 4 2 1 3
66 3 2 5 5 2 2 4
67 3 2 6 1 2 3 4
68 3 2 7 2 2 9 3
69 3 2 8 3 2 8 3
70 3 2 9 4 2 5 5
71 3 2 10 5 2 4 5
72 3 2 1 1 2 1 1
73 3 2 2 2 1 7 0
74 3 2 3 3 1 9 0
75 3 2 4 4 1 10 0
76 3 2 5 5 1 3 0
77 3 2 6 1 1 2 0
78 3 2 7 2 1 5 0
79 3 2 8 3 1 6 0
80 3 2 9 4 1 8 0
81 3 1 10 5 1 3 0
82 3 1 1 1 1 1 0
83 3 1 2 2 1 2 0
84 3 1 3 3 1 6 0
85 3 1 4 4 1 9 0
86 3 1 5 5 1 7 0
87 3 1 6 1 1 4 0
88 3 1 7 2 1 3 0
89 3 1 8 3 1 5 0
90 3 1 9 4 1 10 0
91 3 1 10 5 1 8 0
92 3 1 1 1 2 2 0
93 3 1 2 2 2 4 0
94 3 1 3 3 2 6 0
95 3 1 4 4 2 7 0
96 3 1 5 5 2 1 0
97 3 1 6 1 2 9 0
98 3 1 7 2 2 3 0
99 3 1 8 3 2 9 0
100 3 1 9 4 2 9 0
101 3 1 10 5 2 1 0

View File

@ -0,0 +1,16 @@
|--- feature_6 <= 0.50
| |--- class: 0
|--- feature_6 > 0.50
| |--- feature_6 <= 1.50
| | |--- class: 1
| |--- feature_6 > 1.50
| | |--- feature_6 <= 3.50
| | | |--- feature_6 <= 2.50
| | | | |--- class: 2
| | | |--- feature_6 > 2.50
| | | | |--- class: 3
| | |--- feature_6 > 3.50
| | | |--- feature_6 <= 4.50
| | | | |--- class: 4
| | | |--- feature_6 > 4.50
| | | | |--- class: 5

BIN
decision_tree/tree_model Normal file

Binary file not shown.

View File

@ -19,6 +19,7 @@ class Player(pg.sprite.Sprite):
self.pos = vec(x, y)
self.rot = 0
self.__rotation = a_star_utils.Rotation.RIGHT
self.mass = 0
def rotation(self) -> a_star_utils.Rotation:
return self.__rotation

37
main.py
View File

@ -10,9 +10,18 @@ from map import map
from map import map_utils
from path_search_algorthms import bfs
from path_search_algorthms import a_star, a_star_utils
from decision_tree import decisionTree
from game_objects import aiPlayer
def printTree():
tree = decisionTree.tree()
decisionTree.tree_as_txt(tree)
decisionTree.tree_to_png(tree)
decisionTree.tree_to_structure(tree)
class Game():
def __init__(self):
@ -52,7 +61,7 @@ class Game():
# print(path)
realPath = []
nextNode = target_node
for i in range(len(path)-1, 0, -1):
for i in range(len(path) - 1, 0, -1):
node = path[i]
if node[0] == nextNode:
realPath.insert(0, node[0])
@ -72,15 +81,15 @@ class Game():
game_folder = path.dirname(__file__)
img_folder = path.join(game_folder, 'resources/textures')
self.player_img = pg.image.load(path.join(img_folder,PLAYER_IMG)).convert_alpha()
self.player_img = pg.transform.scale(self.player_img, (PLAYER_WIDTH,PLAYER_HEIGHT) )
self.player_img = pg.image.load(path.join(img_folder, PLAYER_IMG)).convert_alpha()
self.player_img = pg.transform.scale(self.player_img, (PLAYER_WIDTH, PLAYER_HEIGHT))
def run(self):
# game loop - set self.playing = False to end the game
self.playing = True
while self.playing:
self.dt = self.clock.tick(FPS) / 1000.0
self.dt = self.clock.tick(FPS) / 1000.0
self.events()
self.update()
self.draw()
@ -96,20 +105,20 @@ class Game():
# pygame.display.update()
def draw(self):
#display fps as window title
# display fps as window title
pg.display.set_caption("{:.2f}".format(self.clock.get_fps()))
#rerender map
# rerender map
map.render_tiles(self.roadTiles, self.screen, self.camera)
map.render_tiles(self.wallTiles, self.screen, self.camera, self.debug_mode)
#rerender additional sprites
# rerender additional sprites
for sprite in self.agentSprites:
self.screen.blit(sprite.image, self.camera.apply(sprite))
if self.debug_mode:
pg.draw.rect(self.screen, CYAN, self.camera.apply_rect(sprite.hit_rect), 1)
#finally update screen
# finally update screen
pg.display.flip()
def events(self):
@ -125,7 +134,9 @@ class Game():
pos = pg.mouse.get_pos()
offset_x, offset_y = self.camera.offset()
clicked_coords = [math.floor(pos[0] / TILESIZE) - offset_x, math.floor(pos[1] / TILESIZE) - offset_y]
actions = a_star.search_path(math.floor(self.player.pos[0] / TILESIZE), math.floor(self.player.pos[1] / TILESIZE), self.player.rotation(), clicked_coords[0], clicked_coords[1], self.mapArray)
actions = a_star.search_path(math.floor(self.player.pos[0] / TILESIZE),
math.floor(self.player.pos[1] / TILESIZE), self.player.rotation(),
clicked_coords[0], clicked_coords[1], self.mapArray)
print(actions)
if (actions != None):
t = aiPlayer.aiPlayer(self.player, game=self)
@ -137,11 +148,13 @@ class Game():
def show_go_screen(self):
pass
# create the game object
if __name__ == "__main__":
g = Game()
g.show_start_screen()
printTree()
g.run()
g.show_go_screen()

View File

@ -15,3 +15,7 @@ toml==0.10.2
tomli==2.0.1
typing_extensions==4.1.1
wrapt==1.14.0
joblib~=1.1.0
matplotlib~=3.5.1
pandas~=1.1.1
scikit-learn~=1.0.2