Esempio n. 1
0
 def doBacktracking(self, sudoku, moveStack):
     empties = sudoku.getEmptySquares()
     if (len(empties) == 0):
         self.backTrackingResult = sudoku
         return True
     else:
         (i, j) = empties[0]
         domain = sudoku.getLegalMoves(i, j)
         moveStack.append(((i, j), sudoku.copy()))
         for value in domain:
             sudoku.setSquare(i, j, value)
             self.backTrackingCounter += 1
             if self.isSolvableByAC(sudoku):
                 self.backTrackingResult = sudoku
                 return True
             if not sudoku.hasEmptyDomain():
                 if self.doBacktracking(sudoku, moveStack):
                     return True
             sudoku = moveStack[-1][1].copy()
         moveStack.pop()
         return False
Esempio n. 2
0
 def doBacktracking(self, sudoku, moveStack):
     empties = sudoku.getEmptySquares()
     if len(empties) == 0:
         self.backTrackingResult = sudoku
         return True
     else:
         (i, j) = empties[0]
         domain = sudoku.getLegalMoves(i, j)
         moveStack.append(((i, j), sudoku.copy()))
         for value in domain:
             sudoku.setSquare(i, j, value)
             self.backTrackingCounter += 1
             if self.isSolvableByAC(sudoku):
                 self.backTrackingResult = sudoku
                 return True
             if not sudoku.hasEmptyDomain():
                 if self.doBacktracking(sudoku, moveStack):
                     return True
             sudoku = moveStack[-1][1].copy()
         moveStack.pop()
         return False
Esempio n. 3
0
 def feature_vector(self, sudoku):
     vector = list()
     #Add the level of the puzzle
     vector.append(sudoku.getIntLevel())
     #there are 7 features in each list that is returned
     #1) the number of given squares
     given_squares = 81 - len(sudoku.getEmptySquares())
     vector.append(given_squares)
     #4) maximum number of squares given in a set (where set is defined as row, column or 3 by 3 square)
     given_in_set = self.feature_4(sudoku)
     vector.append(given_in_set)
     #6) maximum number of rows or columns filled in a square
     max_row_or_cols = self.feature_5(sudoku)
     vector.append(max_row_or_cols)
     #7) maximum number of squares where a digit is in the domain.
     max_in_domain = self.feature_6(sudoku)
     vector.append(max_in_domain)
     #2) the number of domain variables eliminated in the first 10 rules
     eliminated_domains = self.arc_consistency(sudoku, 10)
     size_of_domain_difference = eliminated_domains[0] - eliminated_domains[
         len(eliminated_domains) - 1]
     vector.append(size_of_domain_difference)
     #5) maximum number of squares that can be filled by a single digit after 10 rounds of arc consistency
     squares_filled = self.feature_7(sudoku)
     sudoku.reset()
     vector.append(squares_filled)
     #3) solvable with arc consistency
     self.arcConsistencyCounter = 0
     solvable = self.solvableByAC(sudoku)
     if solvable:
         solvable = self.arcConsistencyCounter
     else:
         solvable = 0
     vector.append(solvable)
     sudoku.reset()
     #8) how many times we have to backtrack to solve
     self.doBacktracking(sudoku, [])
     vector.append(self.backTrackingCounter)
     self.backTrackingCounter = 0
     return vector
Esempio n. 4
0
 def feature_vector(self, sudoku):
     vector = list()
     # Add the level of the puzzle
     vector.append(sudoku.getIntLevel())
     # there are 7 features in each list that is returned
     # 1) the number of given squares
     given_squares = 81 - len(sudoku.getEmptySquares())
     vector.append(given_squares)
     # 4) maximum number of squares given in a set (where set is defined as row, column or 3 by 3 square)
     given_in_set = self.feature_4(sudoku)
     vector.append(given_in_set)
     # 6) maximum number of rows or columns filled in a square
     max_row_or_cols = self.feature_5(sudoku)
     vector.append(max_row_or_cols)
     # 7) maximum number of squares where a digit is in the domain.
     max_in_domain = self.feature_6(sudoku)
     vector.append(max_in_domain)
     # 2) the number of domain variables eliminated in the first 10 rules
     eliminated_domains = self.arc_consistency(sudoku, 10)
     size_of_domain_difference = eliminated_domains[0] - eliminated_domains[len(eliminated_domains) - 1]
     vector.append(size_of_domain_difference)
     # 5) maximum number of squares that can be filled by a single digit after 10 rounds of arc consistency
     squares_filled = self.feature_7(sudoku)
     sudoku.reset()
     vector.append(squares_filled)
     # 3) solvable with arc consistency
     self.arcConsistencyCounter = 0
     solvable = self.solvableByAC(sudoku)
     if solvable:
         solvable = self.arcConsistencyCounter
     else:
         solvable = 0
     vector.append(solvable)
     sudoku.reset()
     # 8) how many times we have to backtrack to solve
     self.doBacktracking(sudoku, [])
     vector.append(self.backTrackingCounter)
     self.backTrackingCounter = 0
     return vector