From 4451ef60e152ed384780cca9f8b75958a9b12203 Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Wed, 24 Sep 2025 15:35:52 +0200 Subject: [PATCH] automate sudoku boards --- assignment2/csp.py | 2 + assignment2/delivery.md | 115 +++++++++++++++------------------------ assignment2/delivery.pdf | Bin 39050 -> 37914 bytes assignment2/sudoku.py | 54 ++++++++++++++---- 4 files changed, 89 insertions(+), 82 deletions(-) diff --git a/assignment2/csp.py b/assignment2/csp.py index 3ee6774..c7c0d61 100644 --- a/assignment2/csp.py +++ b/assignment2/csp.py @@ -98,6 +98,7 @@ class CSP: """ def backtrack(csp, assignment: dict[str, Any]) -> dict | None: + print("i have been called") if len(assignment) == len(csp.variables): return assignment # base-case var = select_unassigned_variable(csp, assignment) @@ -108,6 +109,7 @@ class CSP: if result := backtrack(csp, assignment): return result assignment.pop(var) + print("i have failed") return None # failure def consistent(csp, var, value, assignment) -> bool: diff --git a/assignment2/delivery.md b/assignment2/delivery.md index e9a7d16..1580e69 100644 --- a/assignment2/delivery.md +++ b/assignment2/delivery.md @@ -4,27 +4,18 @@ author: Erlend Ulvund Skaarberg and Fredrik Robertsen date: 2025-09-24 --- -## 2a) Solutions +## 2a,c,d,e) Sudoku boards and backtrack statistics -Here are the solutions for the provided Sudoku puzzles: +These are the results of running our CSP solver on all four sudoku boards. +It seems we get lucky on the hard board. + +Additionally we calculate the time it takes for running backtracking search and +AC-3 on each sudoku board. ``` -Solution for sudoku_easy.txt -8 7 5 | 9 3 6 | 1 4 2 -1 6 9 | 7 2 4 | 3 8 5 -2 4 3 | 8 5 1 | 6 7 9 -------+-------+------ -4 5 2 | 6 9 7 | 8 3 1 -9 8 6 | 4 1 3 | 2 5 7 -7 3 1 | 5 8 2 | 9 6 4 -------+-------+------ -5 1 7 | 3 6 9 | 4 2 8 -6 2 8 | 1 4 5 | 7 9 3 -3 9 4 | 2 7 8 | 5 1 6 +$ for f in sudoku_*; do python3 sudoku.py $f; done -================================================== - -Solution for sudoku_medium.txt +True 7 8 4 | 9 3 2 | 1 5 6 6 1 9 | 4 8 5 | 3 2 7 2 3 5 | 1 7 6 | 4 8 9 @@ -36,10 +27,10 @@ Solution for sudoku_medium.txt 4 5 3 | 7 2 9 | 6 1 8 8 6 2 | 3 1 4 | 7 9 5 1 9 7 | 6 5 8 | 2 4 3 - -================================================== - -Solution for sudoku_hard.txt +Backtrack failed 357 times out of 439 calls. +Running both AC-3 and backtracking search took 0.05711 +Running only backtracking search took 0.04202 +True 1 5 2 | 3 4 6 | 8 9 7 4 3 7 | 1 8 9 | 6 5 2 6 8 9 | 5 7 2 | 3 1 4 @@ -51,10 +42,25 @@ Solution for sudoku_hard.txt 7 9 8 | 2 5 3 | 4 6 1 3 6 5 | 9 1 4 | 2 7 8 2 1 4 | 7 6 8 | 5 3 9 - -================================================== - -Solution for sudoku_very_hard.txt +Backtrack failed 147 times out of 229 calls. +Running both AC-3 and backtracking search took 0.04713 +Running only backtracking search took 0.03006 +True +8 7 5 | 9 3 6 | 1 4 2 +1 6 9 | 7 2 4 | 3 8 5 +2 4 3 | 8 5 1 | 6 7 9 +------+-------+------ +4 5 2 | 6 9 7 | 8 3 1 +9 8 6 | 4 1 3 | 2 5 7 +7 3 1 | 5 8 2 | 9 6 4 +------+-------+------ +5 1 7 | 3 6 9 | 4 2 8 +6 2 8 | 1 4 5 | 7 9 3 +3 9 4 | 2 7 8 | 5 1 6 +Backtrack failed 1225 times out of 1307 calls. +Running both AC-3 and backtracking search took 0.13033 +Running only backtracking search took 0.11624 +True 4 3 1 | 8 6 7 | 9 2 5 6 5 2 | 4 9 1 | 3 8 7 8 9 7 | 5 3 2 | 1 6 4 @@ -66,6 +72,9 @@ Solution for sudoku_very_hard.txt 9 4 3 | 7 2 8 | 6 5 1 7 6 5 | 1 4 3 | 2 9 8 1 2 8 | 6 5 9 | 4 7 3 +Backtrack failed 16016 times out of 16098 calls. +Running both AC-3 and backtracking search took 2.12073 +Running only backtracking search took 2.10415 ``` ## 2b) domains @@ -271,50 +280,16 @@ AC-3 reduced the number of domain values from 473 to 294: X96: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 6, 7, 8, 9} ``` -## 2c) number of times backtrack() was called and failed - -How many times backtrack() was called and how many times it failed for each of the four Sudoku puzzles. - -``` -Backtracking search on sudoku_easy.txt: -Backtracking search called 439 times with 357 failures. - -Backtracking search on sudoku_medium.txt: -Backtracking search called 439 times with 357 failures. - -Backtracking search on sudoku_hard.txt: -Backtracking search called 439 times with 357 failures. - -Backtracking search on sudoku_very_hard.txt: -Backtracking search called 439 times with 357 failures. -``` - -## 2d,e) runtime for backtracking search and AC-3 - -Time taken to run AC-3, backtracking search, and the total time for each of the four Sudoku puzzles. - -``` -Timing on sudoku_easy.txt: - AC-3 took 0.022991 seconds. - Backtracking search took 0.041559 seconds. - Total time: 0.064553 seconds. - -Timing on sudoku_medium.txt: - AC-3 took 0.023183 seconds. - Backtracking search took 0.056572 seconds. - Total time: 0.079757 seconds. - -Timing on sudoku_hard.txt: - AC-3 took 0.033311 seconds. - Backtracking search took 0.053730 seconds. - Total time: 0.087044 seconds. - -Timing on sudoku_very_hard.txt: - AC-3 took 0.027815 seconds. - Backtracking search took 0.139221 seconds. - Total time: 0.167038 seconds. -``` - ## 2f) why does AC-3 drastically reduce the runtime for backtracking search? -AC-3 drastically reduces the runtime for backtracking search because it prunes the search space by eliminating inconsistent values from the domains of the variables before the backtracking search begins. By enforcing arc consistency, AC-3 ensures that many impossible assignments are removed early on, which means that the backtracking algorithm has fewer options to consider when trying to assign values to variables. This reduction in the number of potential assignments leads to fewer recursive calls and backtracks during the search process, which speeds up the backtracking search significantly. We've seen this in practice by printing the number of failures during backtracking search without AC-3. Using AC-3, we reach a few hundred failures, while without AC-3, we reach hundreds of thousands of failures within a few minutes of runtime. +AC-3 drastically reduces the runtime for backtracking search because it prunes +the search space by eliminating inconsistent values from the domains of the +variables before the backtracking search begins. By enforcing arc consistency, +AC-3 ensures that many impossible assignments are removed early on, which means +that the backtracking algorithm has fewer options to consider when trying to +assign values to variables. This reduction in the number of potential +assignments leads to fewer recursive calls and backtracks during the search +process, which speeds up the backtracking search significantly. We've seen this +in practice by printing the number of failures during backtracking search +without AC-3. Using AC-3, we reach a few hundred failures, while without AC-3, +we reach hundreds of thousands of failures within a few minutes of runtime. diff --git a/assignment2/delivery.pdf b/assignment2/delivery.pdf index 66fdeb3d224d4cf87a76c8db0ba511a8419fd36c..92ac6f87c78f7b823186c5871522f76c9d9d7b46 100644 GIT binary patch delta 31723 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 delta 32793 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 1 else "sudoku_easy.txt").read().split() width = 9 box_width = 3 @@ -28,34 +32,60 @@ box_width = 3 domains = {} for row in range(width): for col in range(width): - if grid[row][col] == '0': - domains[f'X{row+1}{col+1}'] = set(range(1, 10)) + if grid[row][col] == "0": + domains[f"X{row+1}{col+1}"] = set(range(1, 10)) else: - domains[f'X{row+1}{col+1}'] = {int(grid[row][col])} + domains[f"X{row+1}{col+1}"] = {int(grid[row][col])} edges = [] for row in range(width): - edges += alldiff([f'X{row+1}{col+1}' for col in range(width)]) + edges += alldiff([f"X{row+1}{col+1}" for col in range(width)]) for col in range(width): - edges += alldiff([f'X{row+1}{col+1}' for row in range(width)]) + edges += alldiff([f"X{row+1}{col+1}" for row in range(width)]) for box_row in range(box_width): for box_col in range(box_width): cells = [] edges += alldiff( [ - f'X{row+1}{col+1}' for row in range(box_row * box_width, (box_row + 1) * box_width) + f"X{row+1}{col+1}" + for row in range(box_row * box_width, (box_row + 1) * box_width) for col in range(box_col * box_width, (box_col + 1) * box_width) ] ) csp = CSP( - variables=[f'X{row+1}{col+1}' for row in range(width) for col in range(width)], + variables=[f"X{row+1}{col+1}" for row in range(width) for col in range(width)], domains=domains, edges=edges, ) +# funny python code to hijack and redirect stdout +start_ac_3 = time() print(csp.ac_3()) -print_solution(csp.backtracking_search()) + +original_stdout = sys.stdout +sys.stdout = StringIO() + +start_backtracking_search = time() +result = csp.backtracking_search() +end_time = time() + +data = sys.stdout.getvalue().splitlines() + +sys.stdout = original_stdout + +print_solution(result) + +number_of_failures = len([x for x in data if x == "i have failed"]) +number_of_function_calls = len([x for x in data if x == "i have been called"]) +print( + f"Backtrack failed {number_of_failures} times out of {number_of_function_calls} calls." +) +print(f"Running both AC-3 and backtracking search took {end_time - start_ac_3:.5f}") +print( + f"Running only backtracking search took {end_time - start_backtracking_search:.5f}" +) + # Expected output after implementing csp.ac_3() and csp.backtracking_search(): # True