首页 > 解决方案 > 集合中的逻辑条件(GAMS) - 在pyomo中如何做到这一点?

问题描述

我正在将代码从 Gams 传递给 pyomo,但我不知道这个访问索引的选项是否在 python 中有。

在游戏中:

k 净化器 /PSA4241, PSA241, PSA241A, PSA3241, NEW/

oldk(k) = yes$(ord(k) le 4) ; newk(k) = yes$(ord(k) eq 5) ;

EL31(i,k,s)$newk(k)..zkns(k,s) =g= ZIK(i,k,s);

$newk(k) 它只是集合 k 的一部分。我怎么能在 pyomo 中使用这个选择?有小费吗?

标签: setconditional-statementspyomogams-math

解决方案


看到您的问题和评论,我的理解是:您在 pyomoSet中有一个完整的(以免将其称为 S),您需要使用其中的一部分(我们称之为 S1)以便将其用于. 您的方法只是创建几个这样的方法来根据需要使用它。ConcreteModel()SetConstraintSetsS = S1∪S2

pyomo约束中,您可以这样做,或者您可以将所需的值传递给Constraint

让我们假设一个问题结构:

import pyomo.environ as pyo

mySet = ['m1', 'm2', 'm3', 'm4', 'm5']
model = pyo.ConcreteModel()
model.s = pyo.Set(initialize=mySet)
model.x = pyo.Var(model.s, domain=pyo.NonNegativeReals)

如果您只想将某个约束应用于集合的最终值,则可以将其传递给一个约束,如下所示

model.const = pyo.Constraint(expr=model.x[model.s[-1]]>=5)

或者你可以使用类的last()方法OrderedSimpleSet

model.const = pyo.Constraint(expr=model.x[model.s.last()]>=5)

以同样的方式,您可以使用该indexedConstraint方法将相同的结构应用于多个值。

def constr2(model, s):
    return model.x[s] >= 5
model.constr2 = pyo.Constraint(model.s.ordered_data()[-2:], )

这会将约束应用于 Set 的最后 2 个值。

如果您确实需要拆分原始数据,您可以创建第一个新数据集,然后应用该difference方法生成其余值

model.s2 = pyo.Set(initialize=['m1','m2'])
model.s1 = model.s.difference(model.s2)

这会给你这个结果

>>>model.s1.display()
s1 : Size=1, Index=None, Ordered=True
    Key  : Dimen : Domain : Size : Members
    None :     1 : s - s2 :    3 : {'m3', 'm4', 'm5'}
>>>model.s2.display()
s2 : Size=1, Index=None, Ordered=Insertion
    Key  : Dimen : Domain : Size : Members
    None :     1 :    Any :    2 : {'m1', 'm2'}

我希望这可以帮助您了解如何处理切片Set以及pyomo为什么使用 Python 等编程语言可以提高建模任务的性能。


推荐阅读