Skip to content
Snippets Groups Projects
Commit b878bbe2 authored by Michael Mutote's avatar Michael Mutote
Browse files

22202956 - touch up on heuristics, N-QUEENS

parent a4ee4776
No related branches found
No related tags found
No related merge requests found
...@@ -3,45 +3,13 @@ import Sucessors ...@@ -3,45 +3,13 @@ import Sucessors
def queens_opt(path): def queens_opt(path):
"""
Heuristic for the N-Queens problem that calculates the minimum number of moves
required to move each queen to a position where it is not in conflict with any other queen.
Args:
path (list): The path taken so far, where the last element is the current state of the N-Queens board.
Returns:
int: The heuristic value, which is the sum of the minimum moves for all queens.
"""
state = path[-1] # Extracting the current state from the path state = path[-1] # Extracting the current state from the path
n = len(state) # Size of the board (N x N) n = len(state) # Size of the board (N x N)
total_moves = 0 current_queens = 0
# Count the number of outstanding Queens
for y in range(n): for r in state:
for x in range(n): current_queens = current_queens + r.count(True)
if state[y][x] == 1: # If there's a queen at (y, x) return n - current_queens
min_moves = n # Max possible moves
# Check for a safe spot in each column
for col in range(n):
if col != x:
conflict = False
# Check row and diagonals for conflict
for k in range(n):
if state[y][k] and k != x:
conflict = True
break
if y + (col - x) < n and y + (col - x) >= 0 and state[y + (col - x)][col] == 1:
conflict = True
break
if y - (col - x) < n and y - (col - x) >= 0 and state[y - (col - x)][col] == 1:
conflict = True
break
if not conflict:
min_moves = min(min_moves, abs(col - x))
total_moves += min_moves
return total_moves
def maze_opt(path): def maze_opt(path):
...@@ -64,3 +32,4 @@ def sudoku_opt(path): ...@@ -64,3 +32,4 @@ def sudoku_opt(path):
Sucessors.choose_best_column(path[-1])] Sucessors.choose_best_column(path[-1])]
return max(starting_point, key=lambda w: w[2])[-1] return max(starting_point, key=lambda w: w[2])[-1]
...@@ -41,40 +41,45 @@ import time ...@@ -41,40 +41,45 @@ import time
# print(rows) # print(rows)
# #
# board = ((False, False, False, False, False, False, False, False, False, False), board = ((False, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False), (False, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False), (False, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False), (False, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False), (False, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False), (True, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False), (False, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False), (False, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False), (False, False, False, False, False, False, False, False, False, False),
# (False, False, False, False, False, False, False, False, False, False)) (False, False, False, False, False, False, False, False, False, True))
# # =============================================================================================================== # ===============================================================================================================
# # BREADTH FIRST SEARCH N QUEENS PROBLEM # BREADTH FIRST SEARCH N QUEENS PROBLEM
# # =============================================================================================================== # ===============================================================================================================
# sln = (Search_Algorithms.BreadthFirstSearch( start_time = time.time()
# board, Sucessors.queens_successor, is_goal.is_goal_queens)[-1]) sln = (Search_Algorithms.BreadthFirstSearch(
# board, Sucessors.queens_successor, is_goal.is_goal_queens)[-1])
# output_tuple = tuple(tuple("Q" if value else "." for value in sln)
# for sln in sln) output_tuple = tuple(tuple("Q" if value else "." for value in sln)
# for rows in output_tuple: for sln in sln)
# print(rows) for rows in output_tuple:
print(rows)
end_time = time.time()
print(end_time - start_time)
# =============================================================================================================== # ===============================================================================================================
# DEPTH FIRST SEARCH N-QUEENS # DEPTH FIRST SEARCH N-QUEENS
# =============================================================================================================== # ===============================================================================================================
# sln = (Search_Algorithms.DepthFirstSearch( start_time = time.time()
# board, Sucessors.queens_successor, is_goal.is_goal_queens)[-1]) sln = (Search_Algorithms.DepthFirstSearch(
# board, Sucessors.queens_successor, is_goal.is_goal_queens)[-1])
# output_tuple = tuple(tuple("Q" if value else "." for value in sln)
# for sln in sln)
# for rows in output_tuple:
# print(rows)
output_tuple = tuple(tuple("Q" if value else "." for value in sln)
for sln in sln)
for rows in output_tuple:
print(rows)
end_time = time.time()
print(end_time - start_time)
# # # Sliding Puzzle # # # Sliding Puzzle
# initial_puzzle = ( # initial_puzzle = (
...@@ -147,20 +152,26 @@ import time ...@@ -147,20 +152,26 @@ import time
# # # A* SEARCH QUEENS # # # A* SEARCH QUEENS
# # # =============================================================================================================== # # # ===============================================================================================================
board = ((False, False, False, False, False, False, False, False, False, False),
(False, False, False, False, False, False, False, False, False, False),
(False, False, False, False, False, False, False, False, False, False),
(False, False, False, False, False, False, False, False, False, False),
(False, False, False, False, False, False, False, False, False, False),
(True, False, False, False, False, False, False, False, False, False),
(False, False, False, False, False, False, False, False, False, False),
(False, False, False, False, False, False, False, False, False, False),
(False, False, False, False, False, False, False, False, False, False),
(False, False, False, False, False, False, False, False, False, True))
start_time = time.time()
board = ((False, False, False, False),
(False, False, False, False),
(False, False, False, False),
(False, False, False, False))
sln = (Search_Algorithms.A_StarSearch(board, Sucessors.queens_successor, sln = (Search_Algorithms.A_StarSearch(board, Sucessors.queens_successor,
is_goal.is_goal_queens, Heuristics.queens_opt))[-1] is_goal.is_goal_queens, Heuristics.queens_opt))[-1]
print(sln)
output_tuple = tuple(tuple("Q" if value else "." for value in sln) output_tuple = tuple(tuple("Q" if value else "." for value in sln)
for sln in sln) for sln in sln)
for rows in output_tuple: for rows in output_tuple:
print(rows) print(rows)
\ No newline at end of file
end_time = time.time()
print(end_time - start_time)
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment