Python OR-Tools CP-SAT中AddModuloEquality函数无法正常使用问题
OR-Tools CP-SAT 中
AddModuloEquality 函数使用错误排查 你的问题核心是**AddModuloEquality的参数顺序搞反了**,导致约束逻辑完全不符合预期。
问题原因
OR-Tools CP-SAT中AddModuloEquality的函数定义是:
model.AddModuloEquality(target, expr, modulus)
它表达的约束是:expr mod modulus == target
你原来的代码写的是:
model.AddModuloEquality(sum_of_row_vars, 0,12)
这相当于要求0 mod 12 == sum_of_row_vars,也就是sum_of_row_vars = 0,但你的变量取值范围是10-14,显然不可能满足,所以没有解。
修正方案
把参数顺序调整为target在前,expr在后,正确的约束写法应该是:
model.AddModuloEquality(0, sum_of_row_vars, 12)
这才表示sum_of_row_vars mod 12 == 0,符合你原本的需求。
修正后的完整代码
from ortools.sat.python import cp_model def basic_mod(rows, columns, mod=None): # Create the model. model = cp_model.CpModel() ay = [] row = list(range(rows)) col = list(range(columns)) # Create variables grid = {} for i in row: for j in col: grid[(i, j)] = model.NewIntVar(10, 14, f"grid {i} {j}") # Constraints # No repeats in row for i in row: model.AddAllDifferent([grid[(i, j)] for j in col]) # No repeats in column for j in col: model.AddAllDifferent([grid[(i, j)] for i in row]) # Sum of row mod 12 equals 0 for i in row: sum_of_row_vars = sum(grid[(i, j)] for j in col) model.AddModuloEquality(0, sum_of_row_vars, 12) # No repeats in whole array array = [grid[(i, j)] for i in row for j in col] model.AddAllDifferent(array) # Solve and print the first solution solver = cp_model.CpSolver() status = solver.Solve(model) if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE: for i in row: row_values = [int(solver.Value(grid[(i, j)])) for j in col] print(row_values) ay.append(row_values) else: print("no solution") return ay rows = 2 cols = 2 mod = 12 basic_mod(rows, cols, mod)
验证结果
修正后运行代码,会输出你预期的结果:
[10, 14] [11, 13]
因为10+14=24,24 mod12=0;11+13=24,24 mod12=0,完全符合约束条件。
内容的提问来源于stack exchange,提问作者sarl
相关产品推荐
相关产品推荐

