Pyomo 无法在抽象 Set 构建之前对其进行迭代
Posted
技术标签:
【中文标题】Pyomo 无法在抽象 Set 构建之前对其进行迭代【英文标题】:Pyomo Cannot iterate over abstract Set before it has been constructed 【发布时间】:2020-11-29 22:05:55 【问题描述】:我在 Pyomo 中构建了一个抽象模型,效果很好。
但是,当我尝试使用字典来实例化抽象模型时,出现以下错误“错误:为目标值生成表达式时规则失败: RuntimeError:无法在抽象集“I”之前对其进行迭代 构造(初始化)。”
具体来说,问题如下:
from pyomo.environ import *
model = AbstractModel()
model.D = Set()
model.I = Set()
model.w = Param(model.D)
model.S_0 = Param(model.D)
model.x = Var(real_model.I, model.D)
def sum_cubic(m):
return sum(w[j]*(m.x[i][j]-m.S_0[j])**3 for i in model.I for j in model.D)
model.value = Objective(rule = sum_cubic, sense = maximize)
model.pprint()
上面的代码运行得很好。但是当我在名称和 S_0 是预定义的字典之后添加以下代码时会出现错误:
data = None:
'D':None: names,
'I':None: list(range(1,4)),
'w':[0.3,0.3,0.4],
'S_0':S_0,
real_model = model.create_instance(data)
错误:为目标值生成表达式时规则失败: RuntimeError:无法在抽象集“I”之前对其进行迭代 构造(初始化)。 错误:从数据构造组件“值”=无失败: RuntimeError:无法在抽象集“I”之前对其进行迭代 构造(初始化)。
谁能帮我解决这个问题?谢谢。
【问题讨论】:
【参考方案1】:你有几件事在这里咬你......
您在函数中混合了m.
和 model.
,您应该在其中使用 m.
,因为这是函数签名的自引用参数
您对m.x
的索引不正确。它应该是元组索引的(见我的)
您的数据字典没有为参数设置正确。 (见我的)
祝你好运!
from pyomo.environ import *
model = AbstractModel()
model.D = Set()
model.I = Set()
model.w = Param(model.D)
model.S_0 = Param(model.D)
model.x = Var(model.I, model.D)
def sum_cubic(m):
return sum(m.w[j]*(m.x[i, j]-m.S_0[j])**3 for i in m.I for j in m.D)
model.value = Objective(rule = sum_cubic, sense = maximize)
model.pprint()
names=['a', 'b', 'c']
data = None:
'D': None: names,
'I': None: [1, 2, 3],
'w': 'a': 0.4, 'b': 0.3, 'c': 0.2,
'S_0': 'a': 1.0, 'b': 2.0, 'c': 3.0
real_model = model.create_instance(data)
【讨论】:
以上是关于Pyomo 无法在抽象 Set 构建之前对其进行迭代的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Google Colab 中使用 Pyomo 解决抽象模型
从 pandas DataFrame 在 pyomo 中定义参数