Traktor/newastar.py
2024-06-09 19:53:14 +02:00

157 lines
4.9 KiB
Python

import pygame
from board import Board
from constant import width, height, rows, cols
from tractor import Tractor
from kolejka import Stan, Odwiedzone
from queue import Queue
from neuralnetwork import load_model
import pandas as pd
import heapq
from dataclasses import dataclass, field
data = pd.read_csv('dane.csv')
from decisiontree import train_decision_tree
model_path = 'model.pth'
neuralnetwork_model = load_model(model_path)
model, feature_columns = train_decision_tree(data)
fps = 5
WIN = pygame.display.set_mode((width, height))
pygame.display.set_caption('Inteligentny Traktor')
def heuristic(current_state, goal_state):
# Funkcja heurystyki (tu: Manhattan distance)
return abs(current_state.row - goal_state.row) + abs(current_state.col - goal_state.col)
def goal_test(elem, board):
# Test celu: sprawdzenie, czy w bieżącej pozycji jest brud
return board.is_dirt(elem.row, elem.col)
def cost(next_state, board):
if board.board[next_state.row][next_state.col] == 0:
this_cost = 100
elif board.board[next_state.row][next_state.col] == 1:
this_cost = 100
else:
this_cost = 1
print(board.vegetable_names[next_state.row][next_state.col], " --->", this_cost)
return this_cost
def actions(elem, istate):
# Śledzenie działań prowadzących od stanu początkowego do stanu docelowego
akcje = []
while elem.row != istate.row or elem.col != istate.col or elem.direction != istate.direction:
akcje.append(elem.a)
elem = elem.p[0]
return akcje[::-1]
def find_next_goal(board, visited):
for row in range(rows):
for col in range(cols):
if board.is_dirt(row, col) and (row, col) not in visited:
return Stan(row, col, "down")
return None
@dataclass(order=True)
class PrioritizedItem:
priority: int
item: object = field(compare=False)
def astar(istate, goalstate, board):
explored = Odwiedzone()
fringe = []
initial_priority = heuristic(istate, goalstate)
heapq.heappush(fringe, PrioritizedItem(initial_priority, istate))
moves = ["up", "left", "right"]
while fringe:
current = heapq.heappop(fringe).item
if goal_test(current, board):
return actions(current, istate), current
explored.dodaj_stan(current)
for action in moves:
stan = current.succ(action, board)
if stan is not None:
new_g = current.cost + cost(stan, board)
f = new_g + heuristic(stan, goalstate)
if not fringe_check(fringe, stan) and not explored.check(stan):
stan.parrent(current, action)
heapq.heappush(fringe, PrioritizedItem(f, stan))
return [], None
def fringe_check(fringe, stan):
for item in fringe:
if stan.direction == item.item.direction and stan.col == item.item.col and stan.row == item.item.row:
return True
return False
def main():
initial_state = Stan(9, 1, "down")
run = True
clock = pygame.time.Clock()
board = Board(load_from_file=True, filename='generated_board.npy')
tractor = Tractor(9, 1, model, feature_columns, neuralnetwork_model)
visited = set()
while run:
clock.tick(fps)
if all(not board.is_dirt(row, col) for row in range(rows) for col in range(cols)):
print("Traktor odwiedził wszystkie pola.")
break
goal_state = find_next_goal(board, visited)
if not goal_state:
print("Wszystkie pola zostały odwiedzone.")
break
akcje, nowy_stan = astar(initial_state, goal_state, board)
if not akcje:
print("Nie znaleziono ścieżki do najbliższego pola dirt.")
board = Board(load_from_file=True, filename='generated_board.npy')
initial_state = Stan(0, 1, "down")
tractor = Tractor(0, 1, model, feature_columns, neuralnetwork_model)
while board.is_rock(initial_state.row, initial_state.col):
board = Board(load_from_file=True, filename='generated_board.npy')
continue
print("akcje: >", akcje)
while akcje:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
akcja = akcje.pop(0)
if akcja == "left":
tractor.turn_left()
elif akcja == "right":
tractor.turn_right()
elif akcja == "up":
tractor.move_forward(board)
board.draw_cubes(WIN)
tractor.draw(WIN)
pygame.display.update()
visited.add((nowy_stan.row, nowy_stan.col))
initial_state = nowy_stan
initial_state.direction = tractor.direction
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
return
pygame.quit()
main()