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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:13:12