class SudokuProblem(GenericSatProblem): def __init__(self, file_name, cnf_filename=None): if cnf_filename is None: #-- Set up and load in puzzle self.sudoku = Sudoku() self.puzzle_name = str(file_name[:-4]) self.solution_filename = self.puzzle_name + ".sol" self.cnf_filename = self.puzzle_name + ".cnf" self.sudoku.load(file_name) self.sudoku.generate_cnf(self.cnf_filename) else: self.puzzle_name = str(file_name[:-4]) self.solution_filename = self.puzzle_name + ".sol" self.cnf_filename = cnf_filename #-- Load in clauses clauses = [] with open(self.cnf_filename, 'r') as cnf: lines = cnf.readlines() for line in lines: clause = list(map(int, line.rstrip('\n').strip().split(' '))) clauses.append(clause) #-- Make sudoku variables variables = [ int(''.join(str(x) for x in var)) for var in itertools.product(range(1, 10), repeat=3) ] #-- Set up generic class super().__init__(variables, clauses, problem_name='Sudoku')
from Sudoku import Sudoku import sys if __name__ == "__main__": test_sudoku = Sudoku() test_sudoku.load(sys.argv[1]) print(test_sudoku) puzzle_name = sys.argv[1][:-4] cnf_filename = puzzle_name + ".cnf" test_sudoku.generate_cnf(cnf_filename) print("Output file: " + cnf_filename)
import sys from SAT import SAT if __name__ == "__main__": # for testing, always initialize the pseudorandom number generator to output the same sequence # of values: random.seed(1) sudoku_problem = Sudoku(int(sys.argv[3]) == 1) sudoku_problem.load(sys.argv[1]) puzzle_name = str(sys.argv[1][:-4]) cnf_filename = "cnfs/{}.cnf".format(puzzle_name) sol_filename = puzzle_name + ".sol" sudoku_problem.generate_cnf(cnf_filename) if int(sys.argv[2]) == 1: solver = SAT(cnf_filename) result = solver.gsat() elif int(sys.argv[2]) == 2: solver = SAT(cnf_filename) result = solver.walksat() else: solver = DPLL(cnf_filename) result = solver.dpll_satisfiable() if result: solver.write_solution(sol_filename) display_sudoku_solution(sol_filename)