OR-Tool中使用OnlyEnforceIf约束报错:'Constraint'无此属性
解决Gurobi中
OnlyEnforceIf调用报错问题 报错原因
你遇到的'Constraint' object has no attribute 'OnlyEnforceIf'错误,核心有两点:
OnlyEnforceIf是Gurobi约束构造器的专属方法,直接调用model.Add()返回的Constraint对象不支持该属性;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
相关产品推荐
相关产品推荐

