dodanie algorytmu a*
This commit is contained in:
parent
81602fb3cf
commit
dae9ee8996
@ -4,7 +4,7 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.10 (Traktor)" jdkType="Python SDK" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.9" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (Traktor)" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" />
|
||||
</project>
|
BIN
source/__pycache__/astar.cpython-39.pyc
Normal file
BIN
source/__pycache__/astar.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/__pycache__/bfs.cpython-39.pyc
Normal file
BIN
source/__pycache__/bfs.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/__pycache__/crop_protection_product.cpython-39.pyc
Normal file
BIN
source/__pycache__/crop_protection_product.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/__pycache__/ground.cpython-39.pyc
Normal file
BIN
source/__pycache__/ground.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/__pycache__/plant.cpython-39.pyc
Normal file
BIN
source/__pycache__/plant.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/__pycache__/tile.cpython-39.pyc
Normal file
BIN
source/__pycache__/tile.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/area/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
source/area/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/area/__pycache__/constants.cpython-39.pyc
Normal file
BIN
source/area/__pycache__/constants.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/area/__pycache__/field.cpython-39.pyc
Normal file
BIN
source/area/__pycache__/field.cpython-39.pyc
Normal file
Binary file not shown.
BIN
source/area/__pycache__/tractor.cpython-39.pyc
Normal file
BIN
source/area/__pycache__/tractor.cpython-39.pyc
Normal file
Binary file not shown.
130
source/astar.py
Normal file
130
source/astar.py
Normal file
@ -0,0 +1,130 @@
|
||||
from area.constants import TILE_SIZE, ROWS
|
||||
import copy
|
||||
import heapq
|
||||
from area.field import tiles, fieldX, fieldY
|
||||
from bfs import get_moves
|
||||
|
||||
class Node:
|
||||
|
||||
def __init__(self, priority, x, y, direction, parent, action, cost=0):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.direction = direction
|
||||
self.action = action
|
||||
self.parent = parent
|
||||
self.cost = cost
|
||||
self.priority = priority
|
||||
|
||||
|
||||
def __int__(self):
|
||||
return self.priority
|
||||
|
||||
# getters and setters:
|
||||
|
||||
def get_parent(self):
|
||||
return self.parent
|
||||
|
||||
def set_parent(self, _parent):
|
||||
self.parent = _parent
|
||||
|
||||
def get_action(self):
|
||||
return self.action
|
||||
|
||||
def set_action(self, _action):
|
||||
self.parent = _action
|
||||
|
||||
def get_x(self):
|
||||
return self.x
|
||||
|
||||
def set_x(self, _x):
|
||||
self.x = _x
|
||||
|
||||
def get_y(self):
|
||||
return self.y
|
||||
|
||||
def set_y(self, _y):
|
||||
self.y = _y
|
||||
|
||||
def get_direction(self):
|
||||
return self.direction
|
||||
|
||||
def set_direction(self, _direction):
|
||||
self.parent = _direction
|
||||
|
||||
def get_cost(self):
|
||||
return self.cost
|
||||
|
||||
def set_cost(self, _cost):
|
||||
self.cost = _cost
|
||||
|
||||
def get_priority(self):
|
||||
return self.priority
|
||||
|
||||
def set_priority(self, _priority):
|
||||
self.priority = _priority
|
||||
|
||||
def __lt__(self, other):
|
||||
return self.get_priority() < other.get_priority()
|
||||
|
||||
def copy(self):
|
||||
return copy.copy(self)
|
||||
|
||||
|
||||
def goal_test(elem, goalstate):
|
||||
if elem.get_x() == goalstate[0] and elem.get_y() == goalstate[1]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def tile_cost(tile):
|
||||
if tile.image == "resources/images/sampling.png":
|
||||
return 100
|
||||
else:
|
||||
return 1
|
||||
|
||||
def heuristic(current_x, current_y, end_x, end_y):
|
||||
return abs(end_x - current_x) + abs(end_y - current_y)
|
||||
# State as a tuple (x,y,direction)
|
||||
|
||||
# actions(string): move, rotate_to_left, rotate_to_right
|
||||
|
||||
# main search function:
|
||||
def a_star(istate, succ, goaltest, tractor):
|
||||
fringe = []
|
||||
explored = set()
|
||||
node = Node(0, istate.get_x(), istate.get_y(), istate.get_direction(), None, None, 0)
|
||||
heapq.heappush(fringe, node)
|
||||
|
||||
while True:
|
||||
|
||||
if not fringe:
|
||||
return False
|
||||
|
||||
elem = heapq.heappop(fringe)
|
||||
temp = copy.copy(elem)
|
||||
if goal_test(elem, goaltest) is True: # jesli True zwroc ciag akcji
|
||||
return get_moves(elem)
|
||||
|
||||
explored.add(elem)
|
||||
|
||||
for (action, state) in succ(temp, tractor):
|
||||
fringe_tuple = []
|
||||
explored_tuple = []
|
||||
|
||||
for node in fringe:
|
||||
fringe_tuple.append((node.get_x(), node.get_y(), node.get_direction()))
|
||||
for node in explored:
|
||||
explored_tuple.append((node.get_x(), node.get_y(), node.get_direction()))
|
||||
|
||||
|
||||
tile = int((temp.get_y() - fieldY) / TILE_SIZE) * ROWS + int((temp.get_x() - fieldX) / TILE_SIZE)
|
||||
cost = temp.cost + tile_cost(tiles[tile])
|
||||
priority = cost + heuristic(state[0], state[1], goaltest[0], goaltest[1])
|
||||
|
||||
x = Node(priority, state[0], state[1], state[2], elem, action, cost)
|
||||
|
||||
if state not in fringe_tuple and state not in explored_tuple:
|
||||
heapq.heappush(fringe, x)
|
||||
|
||||
elif state in fringe_tuple and elem.get_priority() < priority:
|
||||
elem.set_priority(priority)
|
@ -10,6 +10,7 @@ from area.field import get_tile_coordinates
|
||||
from ground import Dirt
|
||||
from plant import Plant
|
||||
from bfs import graphsearch, Istate, succ
|
||||
from astar import a_star
|
||||
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
|
||||
pygame.display.set_caption('Intelligent tractor')
|
||||
|
||||
@ -45,9 +46,11 @@ def main():
|
||||
tractor.rect.x += fieldX
|
||||
tractor.rect.y += fieldY
|
||||
tractor.tractor_start = ((istate.get_x(), istate.get_y()))
|
||||
#tractor.tractor_start = ((istate.get_x(), istate.get_y(), istate.get_direction))
|
||||
tractor.tractor_end = ((goaltest[0], goaltest[1]))
|
||||
|
||||
moves = (graphsearch(istate, succ, goaltest, tractor))
|
||||
#moves = (graphsearch(istate, succ, goaltest, tractor))
|
||||
moves = (a_star(istate, succ, goaltest, tractor))
|
||||
print(moves)
|
||||
|
||||
|
||||
|
@ -2,7 +2,7 @@ import random
|
||||
import os
|
||||
|
||||
# path to plant images folder (used in randomize_photo function)
|
||||
folder_path = "resources\images\plant_photos"
|
||||
folder_path = "resources/images/plant_photos"
|
||||
|
||||
|
||||
class Tile:
|
||||
|
Loading…
Reference in New Issue
Block a user