Dodanie funkcji h(start, goal)

This commit is contained in:
andrzej 2020-04-26 22:05:27 +02:00
parent 1e265ec281
commit 32c80c0c0e

View File

@ -2,6 +2,7 @@ from warehouse import Coordinates, Tile, Pack
from attributes import PackStatus, TURN_LEFT_DIRECTIONS, TURN_RIGHT_DIRECTIONS from attributes import PackStatus, TURN_LEFT_DIRECTIONS, TURN_RIGHT_DIRECTIONS
from queue import PriorityQueue from queue import PriorityQueue
from pathfinder import Node from pathfinder import Node
from math import sqrt
class Agent: class Agent:
def __init__(self, start_x, start_y, assigned_warehouse, radius=5): def __init__(self, start_x, start_y, assigned_warehouse, radius=5):
@ -98,48 +99,53 @@ class Agent:
self.transported_package = pack self.transported_package = pack
def find_route(self, goal): def find_route(self, goal):
explored = [] explored = []
# tu trzeba dodać kolejkę priorytetową fringe # tu trzeba dodać kolejkę priorytetową fringe
fringe = PriorityQueue() fringe = PriorityQueue()
current_tile = self.assigned_warehouse.tiles[self.x][self.y] current_tile = self.assigned_warehouse.tiles[self.x][self.y]
fringe.put((1, current_tile)) fringe.put((1, current_tile))
while True: while True:
if len(fringe) == 0: if len(fringe) == 0:
return False return False
# elem to węzeł z kolejki o najmniejszym priorytecie (najlepszy) # elem to węzeł z kolejki o najmniejszym priorytecie (najlepszy)
elem = fringe.get() elem = fringe.get()
# jeśli zgadzają się współrzędne x i y wybranego węzłą oraz celu # jeśli zgadzają się współrzędne x i y wybranego węzłą oraz celu
if elem.x_position == goal.x_position and elem.y_position == goal.y_position: if elem.x_position == goal.x_position and elem.y_position == goal.y_position:
# tu powinna zostać zwrócona ścieżka # tu powinna zostać zwrócona ścieżka
print("doszedl") print("doszedl")
return True return True
# przeniesienie wybranego węzłą z fringe do explored # przeniesienie wybranego węzłą z fringe do explored
explored.append(elem) explored.append(elem)
# dla każdego następnika węzła elem # dla każdego następnika węzła elem
# trzeba napisać funkcję succ wyznaczającą następników elem # trzeba napisać funkcję succ wyznaczającą następników elem
# succesor[0] - akcja # succesor[0] - akcja
# succesor[1] - stan czyli współrzędne i zwrot # succesor[1] - stan czyli współrzędne i zwrot
# succesor[2] - rodzic # succesor[2] - rodzic
succ = self.get_succ(elem) succ = self.get_succ(elem)
for action, state in succ: for action, state in succ:
new_node = Node(elem, elem.x_position, elem.y_position) new_node = Node(elem, elem.x_position, elem.y_position)
# x[1] = succesor[1] # x[1] = succesor[1]
# x[2] = elem # x[2] = elem
# x[0] = akcja # x[0] = akcja
# trzeba napisać funkcję f(x) liczącą priorytet danego węzła # trzeba napisać funkcję f(x) liczącą priorytet danego węzła
# p = f(x) # p = f(x)
# if x[1] not in fringe and x[1] not in explored: # if x[1] not in fringe and x[1] not in explored:
# fringe.append(x[1]) # fringe.append(x[1])
# nie wiem jak wyznaczyć priorytet który x już ma w kolejce # nie wiem jak wyznaczyć priorytet który x już ma w kolejce
# elif x[1] in fringe and priorytet który stan x już ma w kolejce > p: # elif x[1] in fringe and priorytet który stan x już ma w kolejce > p:
# tu chodzi o to że zmieni się akcja i rodzić, ale stan nie # tu chodzi o to że zmieni się akcja i rodzić, ale stan nie
# zamień w fringe stary węzeł o stanie x[1] z węzłem x # zamień w fringe stary węzeł o stanie x[1] z węzłem x
def h(self, start, goal):
diff_x = pow(goal.x_position - start.x_position,2)
diff_y = pow(goal.y_position - start.y_position, 2)
return round(sqrt(diff_x+diff_y), 3)
def get_succ(self, elem): def get_succ(self, elem):
move = self.move move = self.move