Merge pull request 'Zmiana błędu w konstruktorze successor' (#37) from minor_upgrades into master

Reviewed-on: #37
This commit is contained in:
Paweł Felcyn 2023-06-19 11:54:22 +02:00
commit b19778b796

22
bfs.py
View File

@ -8,16 +8,16 @@ from queue import Queue, PriorityQueue
from turnCar import turn_left_orientation, turn_right_orientation
class Successor:
class Successor: # klasa reprezentuje sukcesora, stan i akcję którą można po nim podjąć
def __init__(self, state: AgentState, action: AgentActionType, cost: int, predicted_cost: int) -> None:
self.state = state
self.action = action
self.cost = cost
self.predicted_cost = cost
self.predicted_cost = predicted_cost
class SuccessorList:
class SuccessorList: # lista sukcesorów, czyli możliwych ścieżek po danym stanie
succ_list: list[Successor]
def __init__(self, succ_list: list[Successor]) -> None:
@ -31,17 +31,17 @@ class SuccessorList:
def find_path_to_nearest_can(startState: AgentState, grid: Dict[Tuple[int, int], GridCellType], city: City) -> List[
AgentActionType]:
AgentActionType]: # znajduje ścieżkę do najbliższego kosza na smieci
visited: List[AgentState] = []
queue: PriorityQueue[SuccessorList] = PriorityQueue()
queue: PriorityQueue[SuccessorList] = PriorityQueue() # kolejka priorytetowa przechodująca listę sukcesorów
queue.put(SuccessorList([Successor(startState, AgentActionType.UNKNOWN, 0, _heuristics(startState.position, city))]))
while not queue.empty():
while not queue.empty(): # dopóki kolejka nie jest pusta, pobiera z niej aktualny element
current = queue.get()
previous = current.succ_list[-1]
visited.append(previous.state)
if is_state_success(previous.state, grid):
if is_state_success(previous.state, grid): # jeśli ostatni stan w liście jest stanem końcowym (agent dotarł do śmietnika)
return extract_actions(current)
successors = get_successors(previous, grid, city)
@ -61,7 +61,7 @@ def find_path_to_nearest_can(startState: AgentState, grid: Dict[Tuple[int, int],
return []
def extract_actions(successors: SuccessorList) -> list[AgentActionType]:
def extract_actions(successors: SuccessorList) -> list[AgentActionType]: # wyodrębnienie akcji z listy sukcesorów, z pominięciem uknown
output: list[AgentActionType] = []
for s in successors.succ_list:
if s.action != AgentActionType.UNKNOWN:
@ -70,7 +70,7 @@ def extract_actions(successors: SuccessorList) -> list[AgentActionType]:
def get_successors(succ: Successor, grid: Dict[Tuple[int, int], GridCellType], city: City) -> List[Successor]:
result: List[Successor] = []
result: List[Successor] = [] # generuje następników dla danego stanu,
turn_left_cost = 1 + succ.cost
turn_left_state = AgentState(succ.state.position, turn_left_orientation(succ.state.orientation))
@ -128,7 +128,7 @@ def get_next_cell(state: AgentState) -> Tuple[int, int]:
def is_state_success(state: AgentState, grid: Dict[Tuple[int, int], GridCellType]) -> bool:
next_cell = get_next_cell(state)
try:
return grid[next_cell] == GridCellType.GARBAGE_CAN
return grid[next_cell] == GridCellType.GARBAGE_CAN # agent dotarł do śmietnika
except KeyError:
return False
@ -137,7 +137,7 @@ def get_cost_for_action(action: AgentActionType, cell_type: GridCellType) -> int
if action in [AgentActionType.TURN_LEFT, AgentActionType.TURN_RIGHT]:
return 1
if cell_type == GridCellType.SPEED_BUMP and action == AgentActionType.MOVE_FORWARD:
return 10
return -10000
if action == AgentActionType.MOVE_FORWARD:
return 3