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