Gurobi约束编写求助:两类约束实现疑问与报错解决
Gurobi约束代码验证与问题解决
一、第一类约束(R4)代码验证与修正
你的现有代码存在逻辑错误:
T = range(25) TL = range(21) X=model.addVars(E,T,S,vtype=GRB.BINARY, name="X") model.addConstrs((quicksum(X[e,t,s] for t in T) <= 3 for e in E for t in TL for s in S), name="R4")
这段代码中,quicksum遍历了所有时间点t∈T,但结合TL的范围(21个时间点)推断,约束应该是滑动窗口求和:对每个e∈E、s∈S、t∈TL,求和t到t+3这4个连续时间点的X[e,t',s],结果≤3。
修正后的代码:
model.addConstrs( (quicksum(X[e, t_prime, s] for t_prime in range(t, t+4)) <= 3 for e in E for t in TL for s in S), name="R4" )
这样就实现了每个起始时间t∈TL对应的4个连续时间窗口内,X的和不超过3的约束。
二、第二类约束(R6)报错解决
报错TypeError: unsupported operand type(s) for *: 'range' and 'Var'的原因是:你直接用range对象T和Gurobi变量Z[e]相乘,Python不支持范围对象与Gurobi变量的运算。
你需要用T的长度(即时间点总数)替代T本身,修正后的代码:
T = range(25) S = range(10) X=model.addVars(E,T,S,vtype=GRB.BINARY, name="X") # 用len(T)获取时间点总数,替代range对象T model.addConstrs( (quicksum(X[e,t,s] for t in T for s in S) <= len(T) * Z[e] for e in E), name="R6" )
如果确定T的长度固定为25,也可以直接写25 * Z[e],效果一致。
内容的提问来源于stack exchange,提问作者BENJAMÍN IBÁÑEZ
相关产品推荐
相关产品推荐

