set - 集合中的逻辑条件(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 中使用这个选择?有小费吗?
解决方案
看到您的问题和评论,我的理解是:您在 pyomoSet
中有一个完整的(以免将其称为 S),您需要使用其中的一部分(我们称之为 S1)以便将其用于. 您的方法只是创建几个这样的方法来根据需要使用它。ConcreteModel()
Set
Constraint
Sets
S = 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 等编程语言可以提高建模任务的性能。
推荐阅读
- kubernetes - 使用 oauth2 进行命名空间授权
- javascript - 以编程方式在 material-ui Autocomplete TextField 中设置值
- android - 仅记录到特定的木材树
- visual-studio-code - VSCode - 使用键盘快速突出显示标签?
- android - 具有不同物理尺寸但具有相同像素尺寸和相同 dpi 的设备上的快照图像是否相同
- bash - 如何在os x中将日期的字符串格式转换为毫秒?
- react-admin - SimpleRestProvider 空资源
- python - Pandas 中序列的相似性匹配
- javascript - 如何使用 JavaScript 将一系列 .u3d 模型嵌入 PDF?
- python - 如何为draw.text中的文本分配不同的颜色