【问题标题】:Multidimensional Variable with Different index length in Pyomo or GurobiPyomo或Gurobi中具有不同索引长度的多维变量
【发布时间】:2019-05-16 15:55:00
【问题描述】:

我想用 Python 解决一个优化问题。我试图定义一个变量 x_{g,h},其中索引 g 属于集合 G,索引 h 属于集合 H(g),即索引 h 的集合因不同的索引 g 而异。有没有办法在 Pyomo 或 Gurobi-Python 中使用这些索引定义变量 x?

在 Pyomo 中,我尝试在循环中定义它,例如

for g in p.keys():
    for h in range(0,p.rop[g].npairs,1):
        model.x_gen_h = Var(g,h,within=NonNegativeReals)

我收到了这个错误:

TypeError: 'int' object is not iterable.

感谢任何帮助或评论!

【问题讨论】:

  • G 或 H(g) 中的一个实际上只是一个 int,而不是您认为的那样。你能分享完整的回溯吗?
  • 感谢您的评论@Paritosh。我修改了问题以准确显示循环。我认为错误无关紧要。这一定与我们在 Pyomo 中如何定义变量有关。事实上,我的问题是:我们如何在 Pyomo 或 Gurobi 中定义变量时进行列表理解

标签: python optimization gurobi pyomo


【解决方案1】:

诀窍在于定义用于索引变量的索引集。 Pyomo 不支持循环遍历单个索引并将它们一次添加到 Var 中。您应该使用一些聪明的 Python 代码来构建整个索引集。例如,您可以使用这样的方法来过滤掉您想要的索引:

m = ConcreteModel()

m.g = Set(initialize=[1,2,3])

h = {1:['a','b'], 2:['b','c'], 3:['c','d']}
m.h_all = Set(initialize=set(sum(h.values(),[]))) # Extract unique h values

# Initialize set to be entire cross product of g and h and then filter desired values
m.hg = Set(initialize=m.g*m.h_all, filter=lambda m,g,hi:hi in h[g])
m.x = Var(m.hg, within=NonNegativeReals)

更好的选择是:

h = {1:['a','b'], 2:['b','c'], 3:['c','d']}
m.hg = Set(initialize=list((i,j) for i in h.keys() for j in h[i])

【讨论】:

    【解决方案2】:

    我会看一下 Pyomo 文档中引用的一些示例模型:https://pyomo.readthedocs.io/en/latest/tutorial_examples.html

    您不需要使用for 循环来构造变量。

    【讨论】:

    • 感谢您的评论,但我在那里找不到我的问题的答案。换句话说,我的问题是:我们可以在定义变量时进行列表理解吗?例如,有什么方法可以实现:model.x = Var( G.keys() , H[g] for g in G.keys() ) 其中 G.keys() 是索引列表,H[g ] 是每个 g 的索引列表。在 Pyomo 教科书或 Pyomo 网站上提供的所有示例中,这两个索引列表是独立的。
    • 对于变量,对锯齿集的支持令人怀疑(因为如果有任何开发人员当前使用该功能,我不会提出异议)。如果你小心的话,你可以使用Var(dense=False) 来玩花样,但由于未使用的变量(那些没有出现在约束中的变量)不会传递给大多数求解器,你应该安全地定义独立集,除非有真正的内存限制.
    猜你喜欢
    • 2020-11-28
    • 2019-05-31
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多