如何在OR-Tools中确保指定值属于决策变量集合
如何在OR-Tools CP-SAT中约束固定值属于决策变量集合
要确保某个固定值是决策变量集合中的成员,核心逻辑是至少有一个决策变量的取值等于该固定值。以下是基于OR-Tools CP-SAT的实现方案:
完整代码示例
from ortools.sat.python import cp_model as cp model = cp.CpModel() # 创建5个取值范围0-10的决策变量 dv = [model.NewIntVar(lb=0, ub=10, name=f"dv[{_+1}]") for _ in range(5)] # 需要确保属于dv集合的值 val = 4 # 添加约束:至少有一个dv[i]等于val model.AddBoolOr([dv[i] == val for i in range(len(dv))]) # 求解并验证结果 solver = cp.CpSolver() status = solver.Solve(model) if status == cp.OPTIMAL or status == cp.FEASIBLE: print("求解成功,决策变量取值:") for var in dv: print(f"{var.name()} = {solver.Value(var)}") else: print("无解")
代码说明
model.AddBoolOr(...):该约束会确保括号内的布尔表达式(每个表达式表示dv[i] == val)至少有一个为真,也就是至少存在一个决策变量的取值等于目标值val。- 如果需要恰好有一个决策变量等于
val,可以改用以下约束组合:# 创建布尔变量列表,每个表示对应dv[i]是否等于val bool_vars = [model.NewBoolVar(f"bool_{i}") for i in range(len(dv))] for i in range(len(dv)): model.Add(dv[i] == val).OnlyEnforceIf(bool_vars[i]) model.Add(dv[i] != val).OnlyEnforceIf(bool_vars[i].Not()) # 约束恰好有一个布尔变量为真 model.AddSumEquality(bool_vars, 1)
内容的提问来源于stack exchange,提问作者bimal
相关产品推荐
相关产品推荐

