Added all the codes.
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
# Assignment-A2 (A* for 8 Puzzle Problem)
|
||||
|
||||
"""
|
||||
THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
||||
|
||||
Problem Statement: Problem Statement: Implement A star Algorithm for 8 puzzle problem.
|
||||
|
||||
Code from ArtificialIntelligence (SPPU - Third Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-te-comp-content/ArtificialIntelligence
|
||||
"""
|
||||
|
||||
# This code implements A* algorithm for 8 puzzle problem since the problem
|
||||
# statement in our syllabus and handout demands implementing A* algorithm
|
||||
# for any game search problem.
|
||||
|
||||
# A* implementation for maze problem and direct implementation can be found
|
||||
# in the "Alternatives" folder.
|
||||
|
||||
|
||||
# Enter the initial state as 9 numbers (0 represents the blank tile):
|
||||
# Enter row 1 (3 numbers separated by spaces): 1 2 3
|
||||
# Enter row 2 (3 numbers separated by spaces): 0 4 6
|
||||
# Enter row 3 (3 numbers separated by spaces): 7 5 8
|
||||
|
||||
# BEGINNING OF CODE
|
||||
import heapq
|
||||
|
||||
goal_state = [[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
[7, 8, 0]]
|
||||
|
||||
# Directions for moving the blank tile
|
||||
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # up, down, left, right
|
||||
|
||||
def h_misplaced_tiles(state):
|
||||
misplaced = 0
|
||||
for i in range(3):
|
||||
for j in range(3):
|
||||
if state[i][j] != 0 and state[i][j] != goal_state[i][j]:
|
||||
misplaced += 1
|
||||
return misplaced
|
||||
|
||||
def find_blank(state):
|
||||
for i in range(3):
|
||||
for j in range(3):
|
||||
if state[i][j] == 0:
|
||||
return i, j
|
||||
|
||||
def is_valid(x, y):
|
||||
return 0 <= x < 3 and 0 <= y < 3
|
||||
|
||||
def state_to_tuple(state):
|
||||
return tuple(tuple(row) for row in state)
|
||||
|
||||
def a_star(start_state):
|
||||
start = state_to_tuple(start_state)
|
||||
g = 0
|
||||
h = h_misplaced_tiles(start_state)
|
||||
f = g + h
|
||||
|
||||
# Priority queue with elements: (f, g, state, path)
|
||||
pq = [(f, g, start_state, [])]
|
||||
visited = set()
|
||||
|
||||
while pq:
|
||||
f, g, current, path = heapq.heappop(pq)
|
||||
current_tuple = state_to_tuple(current)
|
||||
|
||||
if current_tuple in visited:
|
||||
continue
|
||||
visited.add(current_tuple)
|
||||
|
||||
if current == goal_state:
|
||||
return path + [current]
|
||||
|
||||
x, y = find_blank(current)
|
||||
|
||||
for dx, dy in directions:
|
||||
nx, ny = x + dx, y + dy
|
||||
if is_valid(nx, ny):
|
||||
# Create new state by swapping blank
|
||||
new_state = [row[:] for row in current]
|
||||
new_state[x][y], new_state[nx][ny] = new_state[nx][ny], new_state[x][y]
|
||||
|
||||
if state_to_tuple(new_state) not in visited:
|
||||
new_g = g + 1
|
||||
new_h = h_misplaced_tiles(new_state)
|
||||
new_f = new_g + new_h
|
||||
heapq.heappush(pq, (new_f, new_g, new_state, path + [current]))
|
||||
|
||||
return None
|
||||
|
||||
def print_path(path):
|
||||
for step, state in enumerate(path):
|
||||
print(f"Step {step}:")
|
||||
for row in state:
|
||||
print(row)
|
||||
print()
|
||||
|
||||
def get_input_state():
|
||||
print("Enter the initial state as 9 numbers (0 represents the blank tile):")
|
||||
state = []
|
||||
for i in range(3):
|
||||
row = input(f"Enter row {i+1} (3 numbers separated by spaces): ").split()
|
||||
state.append([int(num) for num in row])
|
||||
return state
|
||||
|
||||
initial_state = get_input_state()
|
||||
|
||||
solution_path = a_star(initial_state)
|
||||
|
||||
if solution_path:
|
||||
print_path(solution_path)
|
||||
else:
|
||||
print("No solution found.")
|
||||
# END OF CODE
|
||||
|
||||
"""
|
||||
SAMPLE OUTPUT
|
||||
|
||||
Enter the initial state as 9 numbers (0 represents the blank tile):
|
||||
Enter row 1 (3 numbers separated by spaces): 1 2 3
|
||||
Enter row 2 (3 numbers separated by spaces): 0 4 6
|
||||
Enter row 3 (3 numbers separated by spaces): 7 5 8
|
||||
Step 0:
|
||||
[1, 2, 3]
|
||||
[0, 4, 6]
|
||||
[7, 5, 8]
|
||||
|
||||
Step 1:
|
||||
[1, 2, 3]
|
||||
[4, 0, 6]
|
||||
[7, 5, 8]
|
||||
|
||||
Step 2:
|
||||
[1, 2, 3]
|
||||
[4, 5, 6]
|
||||
[7, 0, 8]
|
||||
|
||||
Step 3:
|
||||
[1, 2, 3]
|
||||
[4, 5, 6]
|
||||
[7, 8, 0]
|
||||
"""
|
||||
Reference in New Issue
Block a user