【问题标题】:How to save (pickle) a model instance in pyomo如何在 pyomo 中保存(腌制)模型实例
【发布时间】:2018-11-22 20:38:44
【问题描述】:

我想创建一个模型实例,然后保存它,以便稍后加载和求解(与求解相比,初始化需要很长时间)。 当我尝试这个时,它给了我以下错误。

with open('model.pickle', 'w') as f:
    pickle.dump(instance, f)

属性错误: 无法腌制本地对象 'Euphemia.init..obj_expression

目标函数是这样的:

    def obj_expression(model):
        curve = sum(model.x[area, hour, Type, index] * model.Q[area, hour, Type, index] * 
                    ( model.P1[area, hour, Type, index] + model.P0[area, hour, Type, index] ) / 2  
                        for (area, hour, Type, index) in model.Curve )
        bids = sum(model.y[area, index] * model.PB[area, index] * 
                       sum( model.QB[area, index, hour] for (hour) in model.Hours ) 
                               for (area, index) in model.Bids  )
        return curve + bids
    self.model.OBJ = pe.Objective(rule = obj_expression, sense = pe.maximize)

有人知道如何保存混凝土模型吗?

【问题讨论】:

  • 你有 lambda 函数之类的吗?这些可能很难腌制。
  • 不,它们都是常规函数。
  • 如果不查看模型的详细信息,就不可能知道导致 pickle 失败的原因。 Pyomo 模型应该是可腌制的,并且有单元测试可以验证这一点:github.com/Pyomo/pyomo/blob/master/pyomo/core/tests/unit/…
  • 我添加了目标函数

标签: python pyomo


【解决方案1】:

解决方法是 cloudpickle 模块,普通 pickle 酸洗功能有问题。一个例子:

import cloudpickle

with open('test.pkl', mode='wb') as file:
   cloudpickle.dump(instance, file)


with open('test.pkl', mode='rb') as file:
   instance = cloudpickle.load(file)

【讨论】:

    【解决方案2】:

    使用 DerivativeVar 时,pickle(以及 cloudpickle)似乎不起作用。

    from pyomo.environ import *
    from pyomo.dae import *
    import pickle
    import dill
    model = ConcreteModel()
    model.x = ContinuousSet(initialize=(0., 1.))
    model.y = Var(model.x, initialize=1.)
    with open('model1.pickle', 'wb') as f:
        pickle.dump(model, f)
    
    model.dydx = DerivativeVar(model.y, wrt=model.x)
    with open('model2.pickle', 'wb') as f:
        try:
            pickle.dump(model, f)
        except TypeError:
            dill.dump(model, f)
    

    dill 似乎可以代替酸洗弱引用:Pickling weakref in Python

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 2018-03-21
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      相关资源
      最近更新 更多