Как сохранить (протравить) экземпляр модели в pyomo

Я хочу создать экземпляр модели, а затем сохранить его, чтобы я мог загрузить и решить его позже (инициализация занимает довольно много времени по сравнению с решением). Когда я попробовал это, это дало мне следующую ошибку.

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

AttributeError: Невозможно засечь локальный объект '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)

Кто-нибудь знает, как сохранить конкретную модель?

1 ответ

Решение

Решением является модуль cloudpickle, у обычного консерванта есть проблемы с функциями травления. Пример:

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)

Похоже, что pickle (а также cloudpickle) не будет работать при использовании DerivativeVar.

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)

укроп, кажется, работает вместо того, чтобы засолить слабослых: мариновать слабонервных в Python

Другие вопросы по тегам