Как можно управлять параметрами и наборами в абстрактной модели pyomo?

#python #mathematical-optimization #pyomo

Вопрос:

Я хотел бы создать параметр из другого параметра в абстрактной модели Pyomo. Давайте рассмотрим следующий пример:

 from pyomo.environ import AbstractModel, Param, minimize, Var, NonNegativeIntegers, 
    NonNegativeReals, RangeSet, Objective, Constraint, SolverFactory, Set, summation

model = AbstractModel ()

model.S = Set()

model.F = Set()

model.a = Param(model.S)

model.b = Param(model.a * 3)
 

Я хочу, чтобы каждое значение индексированного параметра a было умножено на 3, чтобы оно стало параметром b. Другой вопрос: как я могу объединить наборы S и F, чтобы они стали набором SF?

 model.SF = Set(within= model.S   model.F)
 

Таким образом, если набор S будет состоять из 1,2, а набор F будет состоять из 3,4, то набор SF будет состоять из 1,2,3,4.

Спасибо за Вашу поддержку!

Комментарии:

1. Это довольно просто, если вместо этого вы используете a ConcreteModel … Есть ли у вас сильная потребность сделать это в ан AbstractModel ? Вы всегда можете использовать обычный python для чтения в данных -> структуры python ->> инициализировать a >> ConcreteModel

2. Я знаю ConcreteModel , и я, конечно, мог бы просто использовать списки и словари и изменить их заранее. Но если есть решение внутри AbstractModel , я бы предпочел это.

Ответ №1:

Так что, оказывается, ты можешь.

Если вы уже пробовали, вы заметите, что pyomo жалуется, если вы попытаетесь выполнить какие-либо операции над набором до его создания. Итак, загрузите данные (с помощью любых средств, которые вы хотите использовать), а затем создайте модель instance . Обратите внимание, что если вы проверите тип для этой модели instance , вы увидите, что это a ConcreteModel . Таким образом, теперь вы можете просто добавлять/манипулировать его частями ConcreteModel по своему усмотрению, если вы называете его «созданным экземпляром». Вот пример… (Файл данных не отображается, но его легко вывести из распечатки)

 from pyomo.environ import *

model = AbstractModel()

### SETS
model.I  = Set()
model.J  = Set() 

### PARAMS
model.P = Param(model.I)

data = DataPortal()
data.load(filename='data1.yaml')
instance = model.create_instance(data)

instance.IJ = Set(initialize=instance.I)
instance.IJ.update(instance.J)   # make IJ the union of I, J

instance.P_times_3 = Param(instance.I, initialize={k:3*v for k,v in instance.P.items()})

instance.pprint()
 

Доходность

 3 Set Declarations
    I : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    4 : {1, 2, 3, 4}
    IJ : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    6 : {1, 2, 3, 4, 5, 6}
    J : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    2 : {5, 6}

2 Param Declarations
    P : Size=4, Index=I, Domain=Any, Default=None, Mutable=False
        Key : Value
          1 :   100
          2 :   200
          3 :   250
          4 :   300
    P_times_3 : Size=4, Index=I, Domain=Any, Default=None, Mutable=False
        Key : Value
          1 :   300
          2 :   600
          3 :   750
          4 :   900
 

Комментарии:

1. Спасибо за ответ. Я знал, что смогу манипулировать этим, как только экземпляр будет создан. Тем не менее, я надеялся, что, возможно, будет возможность сделать это до этого случая.