def feature_7(self, sudoku): self.arc_consistency(sudoku, 10) counts = dict() for i in range(10): counts[i] = 0 for i in range(9): for j in range(9): domain = sudoku.getLegalMoves(i, j) for d in domain: counts[d] += 1 maxvalue = 0 for key in counts.keys(): if key == 0: continue maxvalue = max(counts[key], maxvalue) return maxvalue
def arc_consistency(self, sudoku, numRounds): domains = dict() for i in range(0, 9): domains[i] = dict() size_of_domain = 0 total_domains = list() for round in range(numRounds): for i in range(9): for j in range(9): domains[i][j] = sudoku.getLegalMoves(i, j) size_of_domain += len(domains[i][j]) if len(domains[i][j]) == 1: sudoku.setSquare(i, j, domains[i][j][0]) total_domains.append(size_of_domain) size_of_domain = 0 return total_domains
def isSolvableByAC(self, sudoku): domains = dict() for i in range(0, 9): domains[i] = dict() prev_domain = None size_of_domain = 0 while True: self.arcConsistencyCounter += 1 for i in range(9): for j in range(9): domains[i][j] = sudoku.getLegalMoves(i, j) size_of_domain += len(domains[i][j]) if len(domains[i][j]) == 1: sudoku.setSquare(i, j, domains[i][j][0]) if (prev_domain == domains): return False if (sudoku.isComplete()): return True prev_domain = domains
def isSolvableByAC(self, sudoku): domains = dict() for i in range(0, 9): domains[i] = dict() prev_domain = None size_of_domain = 0 while True: self.arcConsistencyCounter += 1 for i in range(9): for j in range(9): domains[i][j] = sudoku.getLegalMoves(i, j) size_of_domain += len(domains[i][j]) if len(domains[i][j]) == 1: sudoku.setSquare(i, j, domains[i][j][0]) if prev_domain == domains: return False if sudoku.isComplete(): return True prev_domain = domains
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