python-3.x 在Gurobi中使用addVars,元组作为索引

5m1hhzi4  于 2023-04-08  发布在  Python
关注(0)|答案(1)|浏览(263)

我对Gurobi/python接口建模还很陌生,我想创建一些有两个indinces的变量,比如x[k,i],而k和i是元组,就像这样

arcs1 = [('G1', 'source', 'node1'), ('G2', 'source', 'node2')]   #list, with the elements consist of a single tuple
arcs2 = [(('G3', 'node1', 'node3'), ('G4', 'node2', 'node5')), (('G5', 'node1', 'node6'), ('G7', 'node4', 'node5'))]    #a list of tuples of tuples                                         
EK, EA = tuplelist(arcs1), tuplelist(arcs2)

让我困惑的是,如果我使用addVars创建EK和EA变量,x = m.addVars(EK, EA, vtype=GRB.INTEGER, name="x")
我得到的变量的键是
('G1', 'source', 'node1', ('G3', 'node1', 'node3'), ('G4', 'node2', 'node5'))
而不是
(('G1', 'source', 'node1'), ('G3', 'node1', 'node3'), ('G4', 'node2', 'node5'))
当我设定目标或限制时,比如我分享的部分,

m.setObjective((quicksum(x[k,i] for k in EK for i in EA)), name="obj1")

我得到了一个Keyerror说“Keyerror:(('G1','source','node 1'),('G3','node 1','node 3'),('G4','node 2','node 5')”我应该怎么做才能确保我创建的变量的形式是第二个?thx帮助

11dmarpk

11dmarpk1#

特别是如果你刚刚开始学习如何使用gurobipy来建模你的问题,我建议你使用更简单的数据结构,而不是嵌套的元组和列表。一般来说,你不应该在同一个列表中混合不同的数据类型。虽然在Python中是可能的,但你几乎肯定会在某个时候遇到问题。
也许这个教程对入门有帮助:https://www.gurobi.com/documentation/current/quickstart_linux/cs_python_dictionary_examp.html#subsection:pythondictionary

相关问题