使用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
错误原因
- 生成器表达式逻辑混乱:原代码将条件
n < m and m < p直接拼接在生成器外部,导致生成器输出的不是合法约束表达式,而是布尔值与约束对象的混合结果,Gurobi无法识别该无效输入。 - 循环顺序错误:循环嵌套顺序不符合变量依赖关系,
n、m、p的定义顺序混乱,可能导致条件判断时变量未定义。 - 索引合法性风险:未验证
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
相关产品推荐
相关产品推荐

