首页 > 解决方案 > 在 Pyomo 中使用 core.base 变量向 ConcreteModel 添加二次圆锥约束

问题描述

我目前正在使用Pyomo 6.1.2.我得到一个AbstractModel填充了一些Variablespyomo.core.base.var类创建的实例,因为我正在使用pyomo.environ命名空间

我想在 Pyomo 中创建一个新的圆锥约束,但约束类pyomo.core.kernel.conic.quadratic 似乎只允许内核核心类 ( pyomo.core.kernel.variable) 作为此类约束的参数。

当我尝试使用以下代码时

import pyomo.environ as pyo
import pyomo.kernel as pmo
m = pyo.ConcreteModel(doc='Model from environ namespace')
m.set = pyo.Set(initialize=[1])
m.var = pyo.Var(m.set, domain=pyo.NonNegativeReals)
m.r = pyo.Var(domain=pyo.NonNegativeReals)
m.const = pmo.conic.quadratic(m.r, [m.var[1]])

我收到以下错误:

AssertionError
Traceback (most recent call last)
<ipython-input-17-4a7a701d28ea> in <module>
      5 m.var = pyo.Var(m.set, domain=pyo.NonNegativeReals)
      6 m.r = pyo.Var(domain=pyo.NonNegativeReals)
----> 7 m.const = pmo.conic.quadratic(m.r, [m.var[1]])

C:\ProgramData\Anaconda3\lib\site-packages\pyomo\core\kernel\conic.py in __init__(self, r, x)
    161         self._r = r
    162         self._x = tuple(x)
--> 163         assert isinstance(self._r, IVariable)
    164         assert all(isinstance(xi, IVariable)
    165                    for xi in self._x)

AssertionError:

如果我尝试使用 apyomo.core.kernel.variable而不是pyomo.environ.Var上述m.varm.r变量,则不会引发错误。

import pyomo.environ as pyo
import pyomo.kernel as pmo
m = pyo.ConcreteModel(doc='Model from environ namespace')
m.var = pmo.variable(lb=0)
m.r = pmo.variable(lb=0)
m.const = pmo.conic.quadratic(m.r, [m.var])

为了将这个圆锥约束添加到我的问题中,我应该将所有变量转换为 Kernel.Core Vars 还是我可以做一些其他事情来将pyomo.environ.Var类作为参数传递给pyomo.core.kernel.conic.quadratic,因为我希望在这个版本中尽可能少地更改我以前的代码。

编辑:我最近在这篇文章中看到了这个答案,答案表明,我认为,混合pyomo.kernelpyomo.environ建模层是不可能的。

标签: pythonenvironment-variablesconstraintspyomo

解决方案


推荐阅读