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

使用Gurobipy添加约束时遇Invalid value for Model.addConstr错误求助

Gurobi约束编写报错排查:Invalid value for Model.addConstr

现有模型代码

electric = gp.Model('electric')
# Gurobi Variables
supply = electric.addVars(fuel, time_hour, name='supply')
delay = electric.addVars(work_type, time_hour, period_index, name='delay')
# Gurobi Constraints
electric.update()
electric.addConstrs(supply[0, t] <= 1000*float(renewable_supply_hour[t]) for t in range(24))
electric.update()
electric.addConstrs((gp.quicksum(supply[f, t] for f in fuel for t in range(int(period_hours_start[i]),int(period_hours_end[i]))) >= (int(high_urgency_period[i])*80 + int(med_urgency_period[i])*50 + int(low_urgency_period[i])*30)) for i in range(len(time_period)))
electric.update()

出错的约束代码

electric.addConstrs(((((((((delay[i, n, m] + int(high_urgency_period[i])*80 + int(med_urgency_period[i])*50 + int(low_urgency_period[i])*30)) == delay[i, m, p] + gp.quicksum(supply[1, t] +supply[0,t]for t in range(int(period_hours_start[m-1]), int(period_hours_end[m-1])))) ))  for i in range(3)) ) and n < m and m < p for m in range(1,len(time_period)) for n in range(len(time_period)-1)) for p in range(2, len(time_period)+1) )

报错信息

Traceback (most recent call last):
  File "/Users/jiangjie/PycharmProjects/pythonProject9/main.py", line 66, in <module>
    electric.addConstrs(((((((((delay[i, n, m] + int(high_urgency_period[i])*80 + int(med_urgency_period[i])*50 + int(low_urgency_period[i])*30)) == delay[i, m, p] + gp.quicksum(supply[1, t] +supply[0,t]for t in range(int(period_hours_start[m-1]), int(period_hours_end[m-1])))) ))  for i in range(3)) ) and n < m and m < p for m in range(1,len(time_period)) for n in range(len(time_period)-1)) for p in range(2, len(time_period)+1) )
  File "src/gurobipy/_model.pyx", line 4081, in gurobipy._model.Model.addConstrs
  File "src/gurobipy/_model.pyx", line 3989, in gurobipy._model.Model.addConstr
gurobipy._exception.GurobiError: Invalid value for Model.addConstr

错误原因

  1. 生成器表达式逻辑混乱:原代码将条件n < m and m < p直接拼接在生成器外部,导致生成器输出的不是合法约束表达式,而是布尔值与约束对象的混合结果,Gurobi无法识别该无效输入。
  2. 循环顺序错误:循环嵌套顺序不符合变量依赖关系,n、m、p的定义顺序混乱,可能导致条件判断时变量未定义。
  3. 索引合法性风险:未验证delay变量的索引范围是否匹配循环变量取值,比如period_index若为0-based,m从1开始可能超出索引范围;period_hours_start[m-1]也可能因m=1时访问index=0的合法性存疑。

解决方法

1. 修正生成器结构与循环逻辑

将过滤条件整合到生成器内部作为if判断,调整循环顺序确保变量依赖关系正确,同时简化代码结构:

# 修正后的约束代码
electric.addConstrs(
    (delay[i, n, m] + int(high_urgency_period[i])*80 + int(med_urgency_period[i])*50 + int(low_urgency_period[i])*30 
     == delay[i, m, p] + gp.quicksum(supply[f, t] for f in [0, 1] for t in range(int(period_hours_start[m-1]), int(period_hours_end[m-1])))
     for i in range(3)
     for m in range(1, len(time_period))
     for n in range(m)  # 直接限制n < m,减少无效迭代
     for p in range(m+1, len(time_period)+1)  # 直接限制p > m,减少无效迭代
    )
)

2. 验证变量索引合法性

  • 确认delay的period_index范围是否覆盖n、m、p的取值,若period_index是0-based,需调整循环变量起始值(如m从0开始,对应修改period_hours_start[m]而非m-1)。
  • 检查high_urgency_period等数组长度是否满足i in range(3)的访问需求,避免索引越界。

3. 简化求和表达式

原代码中supply[1,t] + supply[0,t]通过遍历f in [0,1]简化,避免重复代码,同时降低语法错误概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:05:23