Pyomo:如何在不声明名称的情况下创建新的模型变量,然后将其存储在字典中?
Pyomo: How to create new a model variable without declaring its name, and then store it in a dictionary?
我想知道是否有一种方法可以在不指定名称的情况下创建附加到模型的变量。或者,如何在 pyomo 中动态创建具有不同名称的变量?
背景:
我目前有一个主问题的具体模型和子问题的另一个具体模型。我的目标是在这个主子问题框架下使用列和约束生成算法解决一个两阶段优化问题。
我正在尝试压缩 while 循环以向主问题添加新变量和约束。具体来说,我试图为 while 循环的每次迭代创建一个新变量。然后我想在主问题中添加一些新的 constraints/cuts ,它涉及每次迭代中的新变量。
为此,我尝试使用 for 循环构建字典。在字典中,每个键对应一个新创建的变量。我写了这样的东西:
for i in I:
xname= 'x' + str(i)
new_x[xname] = model.add_component(xname, pyo.Var())
其中 I 是用于创建新变量并将它们分配给字典键的迭代计数集。
但是,这不起作用,因为 model.add_component(xname, pyo.Var()) 不能分配给键,因为它是一个将新变量直接添加到模型的过程。但是,我不能使用标准语法 model.x = pyo.Var() 来创建新变量,因为这意味着我必须手动完成,这违背了 while 循环的目的。
我想知道是否有一种方法可以在不指定名称的情况下创建附加到模型的变量。或者,如何在 pyomo 中动态创建不同的变量?
谢谢!
一些第一个选项:
您可以在 while 循环中使用 setattr(model, xnnam, pyo.Var)
;
您可以使用 'I' 个元素创建一个集合,然后索引变量
在 I 上并仅在您的 while 循环中为每个 'i' 求解模型。
希望这些有意义。
我想知道是否有一种方法可以在不指定名称的情况下创建附加到模型的变量。或者,如何在 pyomo 中动态创建具有不同名称的变量?
背景: 我目前有一个主问题的具体模型和子问题的另一个具体模型。我的目标是在这个主子问题框架下使用列和约束生成算法解决一个两阶段优化问题。
我正在尝试压缩 while 循环以向主问题添加新变量和约束。具体来说,我试图为 while 循环的每次迭代创建一个新变量。然后我想在主问题中添加一些新的 constraints/cuts ,它涉及每次迭代中的新变量。
为此,我尝试使用 for 循环构建字典。在字典中,每个键对应一个新创建的变量。我写了这样的东西:
for i in I:
xname= 'x' + str(i)
new_x[xname] = model.add_component(xname, pyo.Var())
其中 I 是用于创建新变量并将它们分配给字典键的迭代计数集。
但是,这不起作用,因为 model.add_component(xname, pyo.Var()) 不能分配给键,因为它是一个将新变量直接添加到模型的过程。但是,我不能使用标准语法 model.x = pyo.Var() 来创建新变量,因为这意味着我必须手动完成,这违背了 while 循环的目的。
我想知道是否有一种方法可以在不指定名称的情况下创建附加到模型的变量。或者,如何在 pyomo 中动态创建不同的变量?
谢谢!
一些第一个选项:
您可以在 while 循环中使用
setattr(model, xnnam, pyo.Var)
;您可以使用 'I' 个元素创建一个集合,然后索引变量 在 I 上并仅在您的 while 循环中为每个 'i' 求解模型。
希望这些有意义。