代码之家  ›  专栏  ›  技术社区  ›  V. Brunelle

如何从Pyomo中的多个函数中获取值

  •  1
  • V. Brunelle  · 技术社区  · 9 年前

    max z(x,y) = f1(x) - f2(y)
    

    哪里 f1 是变量的函数 x f2 是变量的函数 y

    这可以用Pyomo写成

    def z(model):
        return f1(model) - f2(model)
    
    def f1(model):
        return [some summation of x variables with some coefficients]
    
    def f2(model):
        return [some summation of y variables with some coefficients]
    
    model.objective = Objective(rule=z)
    

    z(x,y) 轻松调用(因为这是目标函数):

    print(model.objective())
    

    但是,有没有办法在优化后单独获得这些子函数的数值,即使它们没有明确定义为目标?

    1 回复  |  直到 9 年前
        1
  •  0
  •   Gabe Hackebeil    9 年前

    我将用具体模型来回答你的问题,因为在大多数情况下,Pyomo中的规则只不过是一种延迟构建Concertemodel的机制。目前,他们还需要定义索引对象,但这可能很快就会改变。

    首先,没有什么可以阻止您将这些“规则”定义为接受某些参数并返回值的标准函数。例如。,

    def z(x, y):
        return f1(x) - f2(y)
    def f1(x):
        return x + 1
    def f2(x):
        return y**2
    

    现在,如果您使用内置类型(例如f(1,5))调用这些函数中的任何一个,您都会得到一个数字。然而,如果用Pyomo变量(或Pyomo表达式)调用它们,就会得到一个Pyomo表达式,可以将其分配给目标或约束。这是因为Pyomo建模组件(如变量)会使标准代数运算符(如+、-、*等)过载。下面是一个示例,说明如何使用这些函数构建目标:

    import pyomo.environ as aml
    m = aml.ConcreteModel()
    m.x = aml.Var()
    m.y = aml.Var()
    m.o = aml.Objective(expr= z(m.x, m.y))
    

    None

    aml.value(f1(m.x))
    aml.value(f2(m.y))
    

    或者可以从中提取值并将其传递给子函数(更快)

    f1(m.x.value)
    f2(m.y.value)
    

    您也可以使用 Expression