首页 > 解决方案 > 如何使用 Pyomo DataPortal 导入具有 3 个 indizes 的参数?(抽象模型,Excel 导入)

问题描述

我有个问题。我想描述一个用于一般生产计划的抽象优化模型。我有一个巨大的 excel 数据框,其中包含很多参数值。我想导入它们,但是具有 3 个索引的参数存在构造错误。我不理解失败,因为值的预览是完美的。

仅供参考:如果我使用一个或两个索引导入参数,则没有错误消息。如果我在我的 jupyter 笔记本中初始化参数值(也有 3 个索引),也没有错误。但我的愿望是,数据框和 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

标签: pyomoimport-from-excel

解决方案


欢迎来到该网站。

我相信您在上述模型中的问题是您将集合设置m.Tstrings成员而不是整数。

这是一个我认为出错的例子,以 aConcreteModel为例......

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')

推荐阅读