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

OR-Tool中使用OnlyEnforceIf约束报错:'Constraint'无此属性

解决Gurobi中OnlyEnforceIf调用报错问题

报错原因

你遇到的'Constraint' object has no attribute 'OnlyEnforceIf'错误,核心有两点:

  1. OnlyEnforceIf是Gurobi约束构造器的专属方法,直接调用model.Add()返回的Constraint对象不支持该属性;
  2. OnlyEnforceIf的参数应为布尔变量本身,而非x[e, t - 1] == 1这类布尔表达式。

正确实现代码

以下是满足你需求的完整约束写法:

1. 条件重置约束(x[t-1]=1时p[t]=0)

# 直接传入布尔变量x[e, t-1],当变量取1时约束生效
model.AddConstr(self.p[e, t] == 0).OnlyEnforceIf(x[e, t - 1])

2. 正常递推约束(x[t-1]=0时执行p[t] = p[t-1] + w[t]*constant)

需要结合Not()方法表示布尔变量取0的情况,同时引入大M值避免约束冲突(M需设为大于p的最大可能取值,比如Max_Value + constant * max_w,其中max_w是w[t]的最大可能值):

M = Max_Value + constant * max_w  # 根据实际场景调整大M值

# 当x[e,t-1]为0时,启用递推约束
model.AddConstr(self.p[e, t] == self.p[e, t-1] + w[e, t] * constant).OnlyEnforceIf(x[e, t - 1].Not())

# 全局约束:p[t]不超过最大值
model.AddConstr(self.p[e, t] <= Max_Value)

关键注意事项

  • 确保使用Gurobi 9.0及以上版本,旧版本对条件约束的支持有限;
  • 大M值需合理设置:过大可能导致数值求解不稳定,过小则会限制可行解范围。

内容的提问来源于stack exchange,提问作者Carlos Davalos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:00:05