Pyomo - 是否可以在变量集上定义条件域?

Pyomo - is it possible to define conditional domains on a variable set?

我想定义一个变量数组x,其中一些是整数变量,一些是实数(连续)变量。例如,我有三组:

model    = pyo.AbstractModel()
model.N  = pyo.Set()
model.NL = pyo.Set()
model.NN = pyo.Set()

NLNN是互斥的集合,其并集是N.

我想定义以下变量:

model.x = pyo.Var(model.N, within = pyo.Integers) # if x in NL
model.x = pyo.Var(model.N, within = pyo.Reals)    # if x in NN

我当然可以重命名 xLxN,但是是否可以使用子集相关域设置单个变量集 x

非常感谢。

是的。有几种方法可以做到这一点:

  1. domain(或within)参数可以取一个规则:

    def x_domain(m, i):
        if i in m.NL:
            return pyo.Integers
       else:
            return pyo.Reals
    model.x = pyo.Var(model.N, within=x_domain)
    
  2. 您可以将 Var 设置为一个域,然后在事后更新域:

    model.x = pyo.Var(model.N, within=Reals)
    for i in model.NL:
        model.x[i].domain = Integers