Inteligentna_smieciarka/main.py

134 lines
4.6 KiB
Python
Raw Normal View History

import pygame
import random
2023-05-26 10:52:02 +02:00
import pandas as pd
from sklearn import tree
from sklearn.preprocessing import LabelEncoder
import graphviz
from astar import astar
2023-04-19 23:51:24 +02:00
from state import State
import time
2023-04-21 14:31:17 +02:00
from garbage_truck import GarbageTruck
from heuristicfn import heuristicfn
pygame.init()
WIDTH, HEIGHT = 800, 800
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Intelligent Garbage Collector")
AGENT_IMG = pygame.image.load("garbage-truck-nbg.png")
AGENT = pygame.transform.scale(AGENT_IMG, (50, 50))
DIRT_IMG = pygame.image.load("dirt.jpg")
DIRT = pygame.transform.scale(DIRT_IMG, (50, 50))
GRASS_IMG = pygame.image.load("grass.png")
GRASS = pygame.transform.scale(GRASS_IMG, (50, 50))
SAND_IMG = pygame.image.load("sand.jpeg")
SAND = pygame.transform.scale(SAND_IMG, (50, 50))
COBBLE_IMG = pygame.image.load("cobble.jpeg")
COBBLE = pygame.transform.scale(COBBLE_IMG, (50, 50))
FPS = 10
2023-04-21 14:31:17 +02:00
FIELDCOUNT = 16
FIELDWIDTH = 50
2023-04-19 23:51:24 +02:00
class Agent:
def __init__(self, rect, direction):
self.rect = rect
self.direction = direction
2023-05-04 18:21:09 +02:00
def randomize_map(): # tworzenie mapy z losowymi polami
field_array_1 = []
field_array_2 = []
2023-05-04 18:21:09 +02:00
field_priority = []
for i in range(16):
2023-05-04 18:21:09 +02:00
temp_priority = []
for j in range(16):
2023-05-04 18:21:09 +02:00
if i in (0, 1) and j in (0, 1):
field_array_2.append(GRASS)
temp_priority.append(1)
else:
prob = random.uniform(0, 100)
if 0 <= prob <= 12:
2023-05-04 18:21:09 +02:00
field_array_2.append(COBBLE)
temp_priority.append(3)
elif 12 < prob <= 24:
2023-05-04 18:21:09 +02:00
field_array_2.append(SAND)
temp_priority.append(2)
else:
field_array_2.append(GRASS)
temp_priority.append(1)
field_array_1.append(field_array_2)
field_array_2 = []
2023-05-04 18:21:09 +02:00
field_priority.append(temp_priority)
return field_array_1, field_priority
def draw_window(agent, fields, flip):
if flip:
direction = pygame.transform.flip(AGENT, True, False)
else:
direction = pygame.transform.flip(AGENT, False, False)
for i in range(16):
for j in range(16):
2023-05-04 18:21:09 +02:00
window.blit(fields[i][j], (i * 50, j * 50))
window.blit(direction, (agent.rect.x, agent.rect.y)) # wyswietlanie agenta
pygame.display.update()
def main():
2023-05-26 10:52:02 +02:00
train_data = pd.read_csv('./data_set.csv')
attributes = train_data.drop('collect', axis='columns')
e_type = LabelEncoder()
attributes['type_num'] = e_type.fit_transform(attributes['garbage_type'])
attr_encoded = attributes.drop(['garbage_type'], axis='columns')
attr_names = ['fuel','distance','space_occupied','days_since_last_collection','paid_on_time','odour_intensity','garbage_weight', 'garbage_type']
label_names = ['collect', 'no-collect']
label = train_data['collect']
print(attr_encoded)
print(label)
classifier = tree.DecisionTreeClassifier()
classifier.fit(attr_encoded, label)
dot_data = tree.export_graphviz(classifier, out_file=None, feature_names=attr_names, class_names=label_names)
graph = graphviz.Source(dot_data)
graph.render('collect')
clock = pygame.time.Clock()
run = True
x, y = [0, 0]
agent = GarbageTruck(0, 0, pygame.Rect(x, y, 50, 50), 0) # tworzenie pola dla agenta
2023-05-04 18:21:09 +02:00
fields, priority_array = randomize_map()
final_x, final_y = [100, 300]
while run:
clock.tick(FPS)
2023-05-04 18:21:09 +02:00
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
2023-05-04 18:21:09 +02:00
# keys_pressed = pygame.key.get_pressed()
draw_window(agent, fields, False) # false = kierunek east (domyslny), true = west
steps = astar(State(None, None, x, y, 'E', priority_array[0][0], heuristicfn(x, y, final_x, final_y)), final_x, final_y, priority_array)
2023-04-19 23:51:24 +02:00
for interm in steps:
if interm.action == 'LEFT':
2023-04-21 14:31:17 +02:00
agent.turn_left()
draw_window(agent, fields, True)
2023-05-03 12:07:13 +02:00
elif interm.action == 'RIGHT':
2023-04-21 14:31:17 +02:00
agent.turn_right()
draw_window(agent, fields, False)
2023-05-03 12:07:13 +02:00
elif interm.action == 'FORWARD':
2023-04-21 14:31:17 +02:00
agent.forward()
if agent.orientation == 0:
draw_window(agent, fields, False)
elif agent.orientation == 2:
draw_window(agent, fields, True)
else:
draw_window(agent, fields, False)
2023-04-21 14:31:17 +02:00
time.sleep(0.5)
2023-04-19 23:51:24 +02:00
while True:
pass
pygame.quit()
if __name__ == "__main__":
main()