return value_o + value_o == value_c1 * 10 + value_r constraints.append((("O", "R", "c1"), last_column_sum)) # restriction: middle column sum works # restriction: first column sum works def normal_column_sum(variables, values): value_c_in, value_summed_letter, value_result_letter, value_c_out = values return value_summed_letter + value_summed_letter + value_c_in == value_c_out * 10 + value_result_letter constraints.append((("c1", "W", "U", "c2"), normal_column_sum)) constraints.append((("c2", "T", "O", "F"), normal_column_sum)) problem = CspProblem(problem_variables, domains, constraints) solution = backtrack(problem) print("Solution:") print(solution) # 0 0 0 # 1 3 2 # + 1 3 2 # ------------- # 0 2 6 4 # {'T': 1, 'W': 3, 'O': 2, 'F': 0, 'U': 6, 'R': 4, 'c1': 0, 'c2': 0}
def const_different(variables, values): return values[0] == values[ 1] # expect the value of the neighbors to be different constraints = [ (('WA', 'NT'), const_different), (('WA', 'SA'), const_different), (('SA', 'NT'), const_different), (('SA', 'Q'), const_different), (('NT', 'Q'), const_different), (('SA', 'NSW'), const_different), (('Q', 'NSW'), const_different), (('SA', 'V'), const_different), (('NSW', 'V'), const_different), ] my_problem = CspProblem(variables, domains, constraints) print backtrack(my_problem) print backtrack(my_problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE) print backtrack(my_problem, variable_heuristic=HIGHEST_DEGREE_VARIABLE) print backtrack(my_problem, value_heuristic=LEAST_CONSTRAINING_VALUE) print backtrack(my_problem, variable_heuristic=MOST_CONSTRAINED_VARIABLE, value_heuristic=LEAST_CONSTRAINING_VALUE) print backtrack(my_problem, variable_heuristic=HIGHEST_DEGREE_VARIABLE, value_heuristic=LEAST_CONSTRAINING_VALUE) print min_conflicts(my_problem)