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
相关产品推荐
相关产品推荐

