更改索引参数值的最佳方法

And*_*uff 3 pyomo

我是 Pyomo 的新手,想知道如何更改具有一个或多个索引的现有模型参数的值。

我看过一些标量参数的示例,即没有索引。例如:

model5 = ConcreteModel()
model5.data2 = Param(initialize=10.0, mutable=True)
print("print data2 before")
model5.data2.pprint()
model5.data2 = 999
print("print data2 after")
model5.data2.pprint()
Run Code Online (Sandbox Code Playgroud)

这会产生输出:

print data2 before
data2 : Size=1, Index=None, Domain=Any, Default=None, Mutable=True
    Key  : Value
    None :  10.0
print data2 after
data2 : Size=1, Index=None, Domain=Any, Default=None, Mutable=True
    Key  : Value
    None :   999
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用具有索引的参数来执行此操作,则会出现错误。以下代码失败,但可能并不奇怪,因为我正在尝试将 Python 对象分配给 Pyomo 对象。使用索引(或多个索引)更新参数的正确方法是什么?

model5 = ConcreteModel()
# Make a small set
myList = ['i1', 'i2', 'i3', 'i4']
model5.i = Set(dimen=1, initialize=myList)
# Make a dict for each element in the set and give it the value 10
dataDict = {}
for  element in myList:
  dataDict[element] = 10
print("print dataDict")
print(dataDict)
# Make the data into a model Param
model5.data = Param(model5.i, initialize=dataDict, mutable=True)
print("print data parameter")
model5.data.pprint()
# Change a values for each element to 999
for  element in myList:
  dataDict[element] = 999
# Try and update the Param
model5.data = dataDict # THIS FAILS <-- how do I do this?
Run Code Online (Sandbox Code Playgroud)

Gio*_*eri 5

tl,dr:使用reconstruct要更新的(可变!)参数的方法。

\n

首先,我的建议是将初始化模型的过程放入一个函数中,以便您可以从不同的地方调用它并重用它。

\n
from pyomo import environ as pe\n\ndef create_model(d: dict) -> pe.ConcreteModel:\n    """Create Pyomo Concrete Model.\n\n    Parameters\n    ----------\n    d : Dictionary with keys corresponding to components names.\n    """\n    model = pe.ConcreteModel()\n    model.I = pe.Set(initialize=d[\'I\'])\n    model.data = pe.Param(model.I, mutable=True, initialize=d[\'data\'])\n    return model\n
Run Code Online (Sandbox Code Playgroud)\n

然后您可以使用您想要的任何数据初始化模型:

\n
d = {}\nd[\'I\'] = [\'i1\', \'i2\', \'i3\', \'i4\']\nd[\'data\'] = {i : 10 for i in d[\'I\']}\n\nmodel = create_model(d)\n\xe2\x80\x8b\nmodel.data.pprint()\n\ndata : Size=4, Index=I, Domain=Any, Default=None, Mutable=True\n    Key : Value\n     i1 :    10\n     i2 :    10\n     i3 :    10\n     i4 :    10\n
Run Code Online (Sandbox Code Playgroud)\n

现在使用以下命令更新值reconstruct

\n
new_values = {i: 5 for i in d[\'I\']} # 5 here is arbitrary, you\nmodel.data.reconstruct(new_values) \n\xe2\x80\x8b\nmodel.data.pprint()\ndata : Size=4, Index=I, Domain=Any, Default=None, Mutable=True\n    Key : Value\n     i1 :     5\n     i2 :     5\n     i3 :     5\n     i4 :     5\n
Run Code Online (Sandbox Code Playgroud)\n

作为旁注,data参数的名称确实令人困惑,您应该找到更具体的名称。

\n