CP-SAT中除构造补域外,是否有内置方式为AddLinearExpressionInDomain添加Not约束?
更简洁的OR-Tools SAT实现方式
你当前的实现确实可以简化,OR-Tools的CP-SAT库提供了更直接的内置方法来关联布尔变量与变量的域成员关系,无需手动构造补域:
from ortools.sat.python import cp_model model = cp_model.CpModel() x = model.NewIntVar(0, 20, 'x') x_is_in_the_domain = model.NewBoolVar('indicator') # 直接定义目标域 target_domain = cp_model.Domain.FromIntervals([[1, 3], [5, 7]]) # 核心:将布尔变量与x是否属于目标域直接等价关联 model.AddEquality(x_is_in_the_domain, x.IsInDomain(target_domain)) solver = cp_model.CpSolver() status = solver.Solve(model=model)
说明
x.IsInDomain(target_domain)会返回一个线性约束表达式,代表x属于指定域的条件AddEquality方法直接将布尔变量的取值与该条件的真假绑定,等价于你之前写的双向Implication约束,且无需手动处理补域,代码更简洁易维护
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

