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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:48:24