diff --git a/Search_Algorithms/Heuristics.py b/Search_Algorithms/Heuristics.py index 6351cccdedee3ca08a88b2e58b5a614e40e19679..5834c85ea594d6ccb69cb7050c054efaabc124d2 100644 --- a/Search_Algorithms/Heuristics.py +++ b/Search_Algorithms/Heuristics.py @@ -3,45 +3,13 @@ import Sucessors 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 n = len(state) # Size of the board (N x N) - total_moves = 0 - - for y in range(n): - for x in range(n): - if state[y][x] == 1: # If there's a queen at (y, x) - 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 + current_queens = 0 + # Count the number of outstanding Queens + for r in state: + current_queens = current_queens + r.count(True) + return n - current_queens def maze_opt(path): @@ -64,3 +32,4 @@ def sudoku_opt(path): Sucessors.choose_best_column(path[-1])] return max(starting_point, key=lambda w: w[2])[-1] + diff --git a/Search_Algorithms/solution testing.py b/Search_Algorithms/solution testing.py index 88e09d4759589ec711a09930dce9c4bec99728fc..b01f0b62b13c0859e753e2319e7aba63c6fbae94 100644 --- a/Search_Algorithms/solution testing.py +++ b/Search_Algorithms/solution testing.py @@ -41,40 +41,45 @@ import time # print(rows) # -# 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)) +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)) -# # =============================================================================================================== -# # BREADTH FIRST SEARCH N QUEENS PROBLEM -# # =============================================================================================================== -# 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) -# for rows in output_tuple: -# print(rows) +# =============================================================================================================== +# BREADTH FIRST SEARCH N QUEENS PROBLEM +# =============================================================================================================== +start_time = time.time() +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) +for rows in output_tuple: + print(rows) +end_time = time.time() +print(end_time - start_time) # =============================================================================================================== # DEPTH FIRST SEARCH N-QUEENS # =============================================================================================================== -# 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) +start_time = time.time() +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) +end_time = time.time() +print(end_time - start_time) # # # Sliding Puzzle # initial_puzzle = ( @@ -147,20 +152,26 @@ import time # # # 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)) - - -board = ((False, False, False, False), - (False, False, False, False), - (False, False, False, False), - (False, False, False, False)) - +start_time = time.time() sln = (Search_Algorithms.A_StarSearch(board, Sucessors.queens_successor, is_goal.is_goal_queens, Heuristics.queens_opt))[-1] -print(sln) output_tuple = tuple(tuple("Q" if value else "." for value in sln) for sln in sln) for rows in output_tuple: - print(rows) \ No newline at end of file + print(rows) + +end_time = time.time() +print(end_time - start_time) \ No newline at end of file