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
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
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
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