From 018a56f17295e269d928299c7c4e0a0f78c24cba Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Wed, 24 Sep 2025 14:19:29 +0200 Subject: [PATCH] theory pdf --- assignment2/delivery.md | 320 +++++++++++++++++++++++++++++++++++++++ assignment2/delivery.pdf | Bin 0 -> 39050 bytes 2 files changed, 320 insertions(+) create mode 100644 assignment2/delivery.md create mode 100644 assignment2/delivery.pdf diff --git a/assignment2/delivery.md b/assignment2/delivery.md new file mode 100644 index 0000000..e9a7d16 --- /dev/null +++ b/assignment2/delivery.md @@ -0,0 +1,320 @@ +--- +title: TDT4136 Assignment 2 +author: Erlend Ulvund Skaarberg and Fredrik Robertsen +date: 2025-09-24 +--- + +## 2a) Solutions + +Here are the solutions for the provided Sudoku puzzles: + +``` +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 + +================================================== + +Solution for sudoku_medium.txt +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 +------+-------+------ +5 7 8 | 2 6 1 | 9 3 4 +3 4 1 | 8 9 7 | 5 6 2 +9 2 6 | 5 4 3 | 8 7 1 +------+-------+------ +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 +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 +------+-------+------ +8 2 1 | 6 3 7 | 9 4 5 +5 4 3 | 8 9 1 | 7 2 6 +9 7 6 | 4 2 5 | 1 8 3 +------+-------+------ +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 +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 +------+-------+------ +3 8 4 | 9 7 6 | 5 1 2 +5 1 9 | 2 8 4 | 7 3 6 +2 7 6 | 3 1 5 | 8 4 9 +------+-------+------ +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 +``` + +## 2b) domains + +Here are the domains after running AC-3 on each sudoku puzzle: \ + (variable): {old domain} -> {new domain} + +``` +Running AC-3 on sudoku_easy.txt yields that the problem is solvable: True +AC-3 reduced the number of domain values from 473 to 294: + X11: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 7, 8} + X12: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 7, 8} + X14: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 6, 7, 9} + X16: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 6, 8} + X17: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3} + X19: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7} + X22: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7, 8} + X25: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 7, 8, 9} + X26: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 5, 6, 8} + X27: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 5} + X28: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5, 6, 7} + X29: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7} + X31: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 6, 7} + X32: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {3, 6, 7} + X35: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7} + X36: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6} + X41: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 5, 7, 8} + X42: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 7, 8} + X43: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 5, 7, 8} + X44: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5} + X46: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5, 6} + X49: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X52: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4} + X53: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 5, 9} + X55: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 8, 9} + X57: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 8, 9} + X58: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 6, 7, 8, 9} + X61: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 5, 7, 8, 9} + X64: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6, 7, 8, 9} + X66: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6, 7, 8} + X67: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 8, 9} + X69: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 4, 6, 7, 8, 9} + X74: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7, 8} + X75: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7, 8} + X78: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 8, 9} + X79: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 8, 9} + X81: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X82: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X83: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X84: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8, 9} + X85: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8, 9} + X88: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X91: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8} + X93: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X94: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X96: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 6, 7, 8, 9} + +Running AC-3 on sudoku_medium.txt yields that the problem is solvable: True +AC-3 reduced the number of domain values from 473 to 294: + X11: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 7, 8} + X12: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 7, 8} + X14: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 6, 7, 9} + X16: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 6, 8} + X17: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3} + X19: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7} + X22: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7, 8} + X25: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 7, 8, 9} + X26: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 5, 6, 8} + X27: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 5} + X28: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5, 6, 7} + X29: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7} + X31: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 6, 7} + X32: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {3, 6, 7} + X35: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7} + X36: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6} + X41: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 5, 7, 8} + X42: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 7, 8} + X43: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 5, 7, 8} + X44: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5} + X46: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5, 6} + X49: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X52: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4} + X53: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 5, 9} + X55: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 8, 9} + X57: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 8, 9} + X58: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 6, 7, 8, 9} + X61: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 5, 7, 8, 9} + X64: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6, 7, 8, 9} + X66: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6, 7, 8} + X67: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 8, 9} + X69: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 4, 6, 7, 8, 9} + X74: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7, 8} + X75: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7, 8} + X78: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 8, 9} + X79: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 8, 9} + X81: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X82: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X83: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X84: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8, 9} + X85: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8, 9} + X88: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X91: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8} + X93: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X94: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X96: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 6, 7, 8, 9} + +Running AC-3 on sudoku_hard.txt yields that the problem is solvable: True +AC-3 reduced the number of domain values from 473 to 294: + X11: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 7, 8} + X12: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 7, 8} + X14: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 6, 7, 9} + X16: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 6, 8} + X17: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3} + X19: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7} + X22: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7, 8} + X25: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 7, 8, 9} + X26: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 5, 6, 8} + X27: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 5} + X28: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5, 6, 7} + X29: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7} + X31: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 6, 7} + X32: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {3, 6, 7} + X35: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7} + X36: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6} + X41: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 5, 7, 8} + X42: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 7, 8} + X43: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 5, 7, 8} + X44: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5} + X46: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5, 6} + X49: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X52: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4} + X53: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 5, 9} + X55: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 8, 9} + X57: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 8, 9} + X58: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 6, 7, 8, 9} + X61: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 5, 7, 8, 9} + X64: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6, 7, 8, 9} + X66: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6, 7, 8} + X67: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 8, 9} + X69: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 4, 6, 7, 8, 9} + X74: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7, 8} + X75: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7, 8} + X78: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 8, 9} + X79: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 8, 9} + X81: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X82: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X83: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X84: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8, 9} + X85: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8, 9} + X88: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X91: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8} + X93: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X94: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X96: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 6, 7, 8, 9} + +Running AC-3 on sudoku_very_hard.txt yields that the problem is solvable: True +AC-3 reduced the number of domain values from 473 to 294: + X11: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 7, 8} + X12: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 7, 8} + X14: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 6, 7, 9} + X16: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 6, 8} + X17: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3} + X19: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7} + X22: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7, 8} + X25: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 7, 8, 9} + X26: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 3, 5, 6, 8} + X27: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 5} + X28: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5, 6, 7} + X29: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 7} + X31: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {2, 6, 7} + X32: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {3, 6, 7} + X35: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7} + X36: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6} + X41: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 5, 7, 8} + X42: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 7, 8} + X43: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 5, 7, 8} + X44: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5} + X46: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 5, 6} + X49: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X52: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4} + X53: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 4, 5, 9} + X55: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 6, 8, 9} + X57: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 8, 9} + X58: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 6, 7, 8, 9} + X61: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 5, 7, 8, 9} + X64: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6, 7, 8, 9} + X66: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 5, 6, 7, 8} + X67: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 5, 8, 9} + X69: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 4, 6, 7, 8, 9} + X74: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7, 8} + X75: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 7, 8} + X78: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 8, 9} + X79: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 8, 9} + X81: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X82: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X83: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8} + X84: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8, 9} + X85: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 2, 3, 6, 8, 9} + X88: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X91: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8} + X93: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + X94: {1, 2, 3, 4, 5, 6, 7, 8, 9} -> {1, 3, 4, 6, 7, 8, 9} + 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. diff --git a/assignment2/delivery.pdf b/assignment2/delivery.pdf new file mode 100644 index 0000000000000000000000000000000000000000..66fdeb3d224d4cf87a76c8db0ba511a8419fd36c GIT binary patch literal 39050 zcmY!laBTLOG*B=#v(Pg)HL)~N zFo@+!%}W6(;W9LYDKuKBWFSaev^k1mV{=PAV($;>M)4o)q~Ow)DB&q>ksOi9fv$t5UtPpKz26AsKNKZ(9XkKP=eoCr>A=ndK zc6Nwh1}Ost23{vSd%A#(CC%j^tDQYvf-8$lQgc1?(()C+b|@(52c@QG7MB!NDrh*S ztyru#38dM^LGA&0x+t@tB)>?( z5FGI!372rND*bSUXi$1HH84;xR4`O9Gc{5GL33jh1!Dy>1ye&41#<;+1tU`f1q%fW z1#=Sv1xp1>1rsB41w#W6GBz?&Ff;@qQzJtKLn9C}Gc;2$GzK9{15*V<6A&`7uv9QK z1tDWo3k8q@i0OvrAXk|hnCe+tT3VWe0^iU=!5E~}Qo+zt!PLM+!N>rFOic|HjKIj) z$W+0|2!u>6EfkE5LCDm^NWsVigiOs06+jA16--Rc6pX;g#K=Oy$Q*=>Ee#bw918_A zLt_OaOArFtW^ABfY@lFnZmwW#2tr0CCJM$zAY^7}sbFjjLgof$3ZQ^7Q2_bD*i-?8 zEDaTm%|OW1)I!179E41a4PsG}4=6z)l8;YnUV2G}f~kQ8C?-J3MM2-$H?aW33-<-3 zKu`qgyJhB-q!uaYyX7R7q`IVnk|xN|;*z4 Xe5Ik}U4^B)-qw7vhs^`5a)?#2yH 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 JRaIAiHvlpJI{E+r literal 0 HcmV?d00001