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 中定义参数

PyCharm无法识别Pyomo包中的对象

PyOmo/Ipopt 因“无法评估 pow”而失败

皮莫 | Couenne 求解器 |将索引变量域限制为两个整数值

在jupyter笔记本中的pyomo scriting