Gurobi Python接口中使用addVars创建元组索引变量的问题
解决Gurobi双索引变量键格式问题
问题原因
Gurobi的addVars方法在传入多个集合参数时,会自动解包每个集合中的元组元素,将元组内的子元素拆解为独立的索引维度。你的代码中,EK的元素是三元组(如('G1', 'source', 'node1')),addVars会把它拆成三个独立索引部分,再和EA的元素(二元组)组合,最终生成的变量键是展开后的多元素元组,而非你预期的“(k, i)”形式(k和i作为整体元组)。
解决方案
直接生成包含所有目标索引对的列表,将每个索引对(k, i)作为单个元素传入addVars,这样变量键会保留k和i的元组结构:
步骤1:生成索引对列表
先通过列表推导式生成EK和EA的笛卡尔积索引对:
index_pairs = [(k, i) for k in EK for i in EA]
步骤2:创建变量
用addVars传入这个索引对列表:
x = m.addVars(index_pairs, vtype=GRB.INTEGER, name="x")
步骤3:设置目标函数
此时原目标函数代码可以正常运行,因为x[k,i]的键格式与变量定义完全匹配:
m.setObjective(quicksum(x[k,i] for k in EK for i in EA), name="obj1")
验证
打印变量键可以确认格式符合预期:
print(list(x.keys())) # 输出示例:[(('G1', 'source', 'node1'), (('G3', 'node1', 'node3'), ('G4', 'node2', 'node5'))), ...]
内容的提问来源于stack exchange,提问作者CangWangu
相关产品推荐
相关产品推荐

