Exemple #1
0
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)

Exemple #3
0
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)