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

Python GurobiPy中特定索引变量求和约束代码正确性咨询

分析你的Gurobi约束代码问题

让我们一步步拆解你的问题,看看现有代码里的问题,以及如何修正:

1. 变量定义的匹配问题

你当前定义变量时用了NP作为第一个维度:

xitb = m.addVars(NP, time,number, name = "preventive",vtype=GRB.BINARY)

但你的约束是针对NC集合里的i(也就是['1']),而NP是['2'],这意味着xitb变量里根本没有i='1'对应的条目,后续调用xitb[i,t,b]时Gurobi会直接报错找不到变量。

你需要把变量的第一个维度改成包含NC元素的集合,也就是I(因为I=[1,2]涵盖了NC和NP的元素),同时注意集合元素的类型要统一——如果I是整数类型,那NC和NP也应该用整数(比如把NC=[1]、NP=[2]),避免字符串和整数混用导致的匹配错误。

2. 约束的求和逻辑错误

你当前的约束代码:

addConstrs(gp.quicksum(xitb[i,t,b] for i in NC for t in time)<=20)

会把所有i∈NC和t∈time对应的xitb[i,t,b]全部加起来,然后要求这个总总和≤20,但你实际需要的是每个时间点t,对该t下所有b∈number的xitb[i,t,b]求和≤20(每个t对应一条独立约束)。

修正后的完整代码

import gurobipy as gp
from gurobipy import GRB

# 统一集合元素类型为整数,避免匹配问题
I = [1, 2]
NC = [1]
NP = [2]
time = range(1, 11)  # 生成1到10的时间点
number = range(1, 10) # 生成1到9的number值

m = gp.Model('Offshore')

# 变量第一个维度用I,涵盖所有需要的i值
xitb = m.addVars(I, time, number, name="preventive", vtype=GRB.BINARY)

# 为每个i∈NC、每个t∈time,生成一条约束:该t下所有b的xitb求和≤20
m.addConstrs(
    (gp.quicksum(xitb[i, t, b] for b in number) <= 20 
     for i in NC for t in time),
    name="NC_per_time_limit"
)

这段代码会生成len(NC)*len(time)条约束(这里就是1*10=10条),正好对应你需求里的x₁₁₁+...+x₁₁₉≤20、x₁₂₁+...+x₁₂₉≤20……直到x₁₁₀₁+...+x₁₁₀₉≤20。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:48:24