#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. Спасибо за ответ. Я знал, что смогу манипулировать этим, как только экземпляр будет создан. Тем не менее, я надеялся, что, возможно, будет возможность сделать это до этого случая.