You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:39:52