如何使用 Pyomo DataPortal 导入具有 3 个索引的参数? (抽象模型,Excel 导入)
How to import a parameter with 3 indizes with Pyomo DataPortal? (Abstract Model, Excel Import)
我有问题。我想描述一个用于一般生产计划的抽象优化模型。我有一个巨大的 excel 数据框,其中包含很多参数值。我想导入它们,但是具有 3 个索引的参数存在构造错误。我不明白失败,因为值的预览是完美的。
仅供参考:如果我导入带有一个或两个索引的参数,则没有错误消息。如果我在我的 jupyter notebook 中初始化参数值(也有 3 个索引),也没有错误。但我的愿望是,data-frame 和 jupyter notebook 是分开的。
这是我的问题的一个简化的虚构示例:
m.K = Set(initialize=['Golf','eGolf'], doc='Produkte K')
m.T = Set(initialize=['1','2','3','4','5','6','7','8','9','10','11','12'], doc='Perioden T')
m.J = Set(initialize=['Seg1','Seg2'], doc='Produktionssegmente J')
m.W = Set(initialize=['WOB','Z','DD'], doc='Werke W')
m.bc = Param(m.W, m.K, doc='var. Fremdbezugskosten im Werk w für das Produkt k')
m.bmax = Param(m.W, m.K, m.T, doc='max. verfügbare Zusatzkapazität im Werk w für Produkt k in Periode t')
m.cmax = Param(m.W, m.J, m.T, doc='verfügbare Normalkapazität im Werk w für Segment J in Periode t')
m.d = Param(m.W, m.K, m.T, doc='Bedarf im Werkw für Produkt k in Periode t')
...
导入参数值:
...
data.load(filename='Dataframe.xlsx',range='A8:D80', param=m.bmax)
data.load(filename='Dataframe.xlsx',range='F8:I80', param='cmax', index=('W','K','T'))
...
错误:
Failed to set value for param=bmax, index=('WOB', 'Golf', 1.0), value=0.0.
source error message="Index '('WOB', 'Golf', 1.0)' is not valid for indexed component 'bmax'"
具有 3 个索引的每个参数都会出现此错误。但是,如果我直接在 jupyter notebook 中初始化此表单,模型将 运行。我不明白其中的逻辑:(
非常感谢,如果你能解决我的问题。
最好的问候 PE
欢迎来到本站。
我认为您在上述模型中的问题是您将集合 m.T
设置为成员 strings
而不是整数。
这是我认为出错的例子,以 ConcreteModel
为例...
from pyomo.environ import *
m = ConcreteModel()
m.I = Set(initialize=[1,'5',10]) # mixed type set for demo only.
m.c = Param(m.I, within=NonNegativeReals, mutable=True)
m.c[1] = 2.4 # OK
m.c[5] = 3.2 # FAILS
m.pprint()
如果您打算在不加载它们的情况下声明您的集合,我会这样声明集合:
m.T = Set(initialize=range(1, 13), doc='Perioden T')
我有问题。我想描述一个用于一般生产计划的抽象优化模型。我有一个巨大的 excel 数据框,其中包含很多参数值。我想导入它们,但是具有 3 个索引的参数存在构造错误。我不明白失败,因为值的预览是完美的。
仅供参考:如果我导入带有一个或两个索引的参数,则没有错误消息。如果我在我的 jupyter notebook 中初始化参数值(也有 3 个索引),也没有错误。但我的愿望是,data-frame 和 jupyter notebook 是分开的。
这是我的问题的一个简化的虚构示例:
m.K = Set(initialize=['Golf','eGolf'], doc='Produkte K')
m.T = Set(initialize=['1','2','3','4','5','6','7','8','9','10','11','12'], doc='Perioden T')
m.J = Set(initialize=['Seg1','Seg2'], doc='Produktionssegmente J')
m.W = Set(initialize=['WOB','Z','DD'], doc='Werke W')
m.bc = Param(m.W, m.K, doc='var. Fremdbezugskosten im Werk w für das Produkt k')
m.bmax = Param(m.W, m.K, m.T, doc='max. verfügbare Zusatzkapazität im Werk w für Produkt k in Periode t')
m.cmax = Param(m.W, m.J, m.T, doc='verfügbare Normalkapazität im Werk w für Segment J in Periode t')
m.d = Param(m.W, m.K, m.T, doc='Bedarf im Werkw für Produkt k in Periode t')
...
导入参数值:
...
data.load(filename='Dataframe.xlsx',range='A8:D80', param=m.bmax)
data.load(filename='Dataframe.xlsx',range='F8:I80', param='cmax', index=('W','K','T'))
...
错误:
Failed to set value for param=bmax, index=('WOB', 'Golf', 1.0), value=0.0.
source error message="Index '('WOB', 'Golf', 1.0)' is not valid for indexed component 'bmax'"
具有 3 个索引的每个参数都会出现此错误。但是,如果我直接在 jupyter notebook 中初始化此表单,模型将 运行。我不明白其中的逻辑:(
非常感谢,如果你能解决我的问题。 最好的问候 PE
欢迎来到本站。
我认为您在上述模型中的问题是您将集合 m.T
设置为成员 strings
而不是整数。
这是我认为出错的例子,以 ConcreteModel
为例...
from pyomo.environ import *
m = ConcreteModel()
m.I = Set(initialize=[1,'5',10]) # mixed type set for demo only.
m.c = Param(m.I, within=NonNegativeReals, mutable=True)
m.c[1] = 2.4 # OK
m.c[5] = 3.2 # FAILS
m.pprint()
如果您打算在不加载它们的情况下声明您的集合,我会这样声明集合:
m.T = Set(initialize=range(1, 13), doc='Perioden T')