/
debugging.py
139 lines (109 loc) · 3.94 KB
/
debugging.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 9 19:19:26 2019
@author: pablo
SUDOKU SOLVER
run this program from the terminal using 'python driver.py <string_sudoku>'
to solve the sudoku
"""
import os
from copy import deepcopy
import sys
import time
import AC3
import BTS
import sudoku
################################################################################
# DEFINE WORKING DIRECTORY #
################################################################################
directory = r'/Users/pablo/Desktop/edx/artificial_intelligence/week8_sudoku/sudoku_solver'
# directory = r'C:\Users\Spare 3\Sudoku_solver'
os.chdir(directory)
################################################################################
# IMPORT LIST OF SUDOKUS TO SOLVE #
################################################################################
sudoku_start_file = open('data/sudokus_start.txt')
sudoku_start = sudoku_start_file.readlines()
sudoku_solutions = open('data/sudokus_finish.txt').readlines()
################################################################################
# DEBUGGING #
################################################################################
string = sudoku_start[10]
# string = list(solvable.keys())[1]
sudoku = sudoku_board(string)
csp = csp_sudoku(sudoku)
csp.domain
# AC3(csp)
csp.domain
a = Backtracking_Search(csp)
sudoku.solved_board.update(a)
sudoku.print_board('board')
print()
sudoku.print_board('solved_board')
solution = solvable[string]
sudoku = sudoku_board(string)
sudoku.print_board('board')
sudoku_solved = deepcopy(sudoku)
sudoku_solved.board.update(a)
print()
sudoku_solved.print_board()
################################################################################
# SOLVE ALL SUDOKUS WITH AC3 #
################################################################################
solvable = {}
count = 0
for string in sudoku_start:
sudoku = sudoku_board(string)
# sudoku.print_board()
csp = csp_sudoku(sudoku)
if AC3(csp):
count += 1
if csp.solved():
solvable.update({string: csp})
else:
if any(csp.domain[key] == [] for key in csp.domain):
print('The problem cannot be solved as it is not arc-consistent')
csp.domain
string = list(solvable.keys())[1]
solution = solvable[string]
sudoku = sudoku_board(string)
sudoku.print_board()
sudoku_solved = sudoku
sudoku_solved.board = solution.domain
print()
sudoku_solved.print_board()
not any(len(solution.domain[key]) > 1 for key in solution.domain)
################################################################################
# SOLVE ALL SUDOKUS WITH BTS #
################################################################################
solvable = {}
count = 0
for string in sudoku_start:
sudoku = sudoku_board(string)
csp = csp_sudoku(sudoku)
a = Backtracking_Search(csp)
if a != False:
count += 1
sudoku.solved_board.update(a)
solvable.update({string: sudoku})
else:
print('The problem cannot be solved by BTS')
################################################################################
# CHECK SOLUTIONS #
################################################################################
def gen_string_sol(sudoku):
sol = ''
for letter in sudoku.rows:
for digit in sudoku.cols:
sol += str(sudoku.solved_board[letter + digit])
return sol
solutions = []
for key in solvable.keys():
sol = gen_string_sol(solvable[key])
solutions.append(sol)
errors = 0
for i in range(len(solutions)):
if solutions[i] != sudoku_solutions[i][:-1]:
errors += 1
print('Error in solution')