From 3c47886a2acd8b3a7bbdd3b3b5b83c7f85fcfbae Mon Sep 17 00:00:00 2001 From: "Nour A." <me@nourthearab.com> Date: Mon, 3 Mar 2025 03:04:47 -0500 Subject: [PATCH] Fixed GBFS: Added __lt__ method to State to support heapq --- State.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/State.py b/State.py index 259d60b..7850d7f 100644 --- a/State.py +++ b/State.py @@ -1,7 +1,13 @@ +from collections import deque +import heapq + class State: def __init__(self, position, remaining_rewards): self.position = position # (x, y) - self.remaining_rewards = set(remaining_rewards) # {(x1, y1), (x2, y2), ...} + self.remaining_rewards = frozenset(remaining_rewards) # {(x1, y1), (x2, y2), ...} + + def __lt__(self, other): + return self.position < other.position def get_neighbors(state, maze): x, y = state.position @@ -64,3 +70,65 @@ def print_maze_solution(maze, path): for row in maze_copy: print("".join(row)) single_dfs('test_maze.txt') + +def single_bfs(file_path): + maze, initial_state = read_maze(file_path) + queue = deque([(initial_state, [])]) # (current state, path) + visited = set() + + while queue: + state, path = queue.popleft() + + if state.position in visited: + continue + visited.add(state.position) + + if is_goal(state): + print_maze_solution(maze, path) + print(f"Path cost: {len(path)}") + print(f"Nodes passed: {len(visited)}") + return path + + for move in get_neighbors(state, maze): + new_rewards = state.remaining_rewards - {move} if move in state.remaining_rewards else state.remaining_rewards + new_state = State(move, new_rewards) + queue.append((new_state, path + [move])) + + print("Sadly, the mouse is dead :(") + return None + +def manhattan_distance(pos1, pos2): + return abs(pos1[0] - pos2[0]) + abs(pos1[1] - pos2[1]) + +def single_gbfs(file_path): + maze, initial_state = read_maze(file_path) + goal = next(iter(initial_state.remaining_rewards)) # 1prize,1goal + + priority_queue = [(manhattan_distance(initial_state.position, goal), initial_state, [])] + visited = set() + + while priority_queue: + _, state, path = heapq.heappop(priority_queue) + + + if state.position in visited: + continue + visited.add(state.position) + + if is_goal(state): + print_maze_solution(maze, path) + print(f"Path cost: {len(path)}") + print(f"Nodes passed: {len(visited)}") + return path + + for move in get_neighbors(state, maze): + new_rewards = state.remaining_rewards - {move} if move in state.remaining_rewards else state.remaining_rewards + new_state = State(move, new_rewards) + heapq.heappush(priority_queue, (manhattan_distance(move, goal), new_state, path + [move])) + + + + print("Sadly, the mouse is dead :(") + return None + +single_gbfs('test_maze.txt') -- GitLab