是否有办法在Pyomo中获取带有变量名的列表?

问题描述 投票:0回答:3

我想将所有整数限制的变量附加到我定义的integer_constraints_list中。有没有一种方法可以获取带有我所有变量名的某种列表或数组,以迭代使用for循环编写的代码?类似于variables_list = [inst.x[i], inst.y[i], inst.z[i]]

我知道pyomo内核有点类似,但是我用environ定义了模型

model.I = RangeSet(1,20)
model.x = Var(model.I, domain=NonNegativeIntegers)
model.y = Var(model.I, domain=NonPositiveIntegers)
model.z = Var(model.I, domain=NonPositiveIntegers)

inst = model.create_instance(data)
integer_constraints_list = []

for i in inst.I:
     if "nonnegativeintegers" in str(inst.x[i].domain).lower():
          integer_constraints_list.append(inst.x[i])
          inst.x[i].domain = NonNegativeReals

类似

variables_list = [inst.x[i], inst.y[i], inst.z[i]]
for v in variables_list:
     for i in inst.I:
          if "nonnegativeintegers" in str(v.domain).lower():
               integer_constraints_list.append(v[i])
               v.domain = NonNegativeReals
python instance-variables pyomo environ
3个回答
0
投票

我建议进行域相等性比较,而不是对字符串表示形式进行比较:

integer_vars = [v for v in inst.component_data_objects(Var) if v.domain == NonNegativeIntegers]
integer_constraints_list.extend(integer_vars)
for v in integer_vars:
    v.domain = NonNegativeReals

0
投票

您可以执行以下操作:

variables_list = ['inst.x', 'inst.y', 'inst.z']
for v in variables_list:
     for i in inst.I:
          if "nonnegativeintegers" in str(vars()[v][i].domain).lower():
               integer_constraints_list.append(v[i])
               vars()[v][i].domain = NonNegativeReals

0
投票

欢迎,解决方案并不像我想的那么复杂

variables_list = [inst.x, inst.y, inst.z]
for v in variables_list:
    for i in inst.I:
        if "nonnegativeintegers" in str(v[i].domain).lower():
           integer_constraints_list.append(v[i])
           v[i].domain = NonNegativeReals
© www.soinside.com 2019 - 2024. All rights reserved.