Optimization Pyomo-将Pyomo数值隐式转换为整数

Optimization Pyomo-将Pyomo数值隐式转换为整数,optimization,pyomo,Optimization,Pyomo,我试图优化一个pyomo抽象模型(m)。该模型有一个名为a的(整数)参数。我想在构建模型时计算另一个整数值。让另一个变量为c=a*(a-1)/2。我想要一个大小为c 为此,我写下以下几行: #File - test.py# from pyomo.environ import * m = AbstractModel() m.a = Param() c = m.a*(m.a-1)/2 m.var = Var(range(1,c), within=Binary) m.obj = Objective(e

我试图优化一个pyomo抽象模型(m)。该模型有一个名为
a
的(整数)参数。我想在构建模型时计算另一个整数值。让另一个变量为
c=a*(a-1)/2
。我想要一个大小为
c
为此,我写下以下几行:

#File - test.py#
from pyomo.environ import *
m = AbstractModel()
m.a = Param()
c = m.a*(m.a-1)/2
m.var = Var(range(1,c), within=Binary)
m.obj = Objective(expr = 0)

#File - data.dat#
param a := 5 ;
为了解决这个问题,我运行了-
pyomo solve test.py data.dat--solver=glpk

运行此命令后,我出现以下错误:

Implicit conversion of Pyomo NumericValue type `<class 
'pyomo.core.kernel.expr_coopr3._ProductExpression'>' to an integer 
is disabled. This error is often the result of using Pyomo components as 
arguments to one of the Python built-in math 
module functions when defining expressions. Avoid this error by using Pyomo-
provided math functions.
Pyomo NumericValue类型`'到整数的隐式转换 它是残疾的。此错误通常是使用Pyomo组件作为 Python内置数学函数之一的参数 模块在定义表达式时起作用。通过使用Pyomo避免此错误- 提供了数学函数。 我认为当我尝试取
范围(1,c)
时会出现错误。如果我错了,请纠正我

我有python2.7.12和Pyomo-5.3(Linux上的CPython-2.7.12)。我将不得不在安装时向某人询问安装方法,因此可能需要时间。我会在询问安装人员后更新安装方法


谢谢

这里发生了两件事:

  • 您正在定义参数之前对其求值
  • 您正在将Pyomo表达式隐式转换为整数
  • 问题的根源在于,您将抽象模型视为具体模型。对于抽象模型,当您声明
    m.a
    时,您仅声明参数
    a
    的存在。Python然后继续解析和执行模型的其余部分。当它点击
    c=m.a*(m.a-1)/2
    时,Python会生成一个表示右侧的Pyomo表达式树。最后,当到达
    m.var=var(range(1,c),in=Binary)
    时,Python首先执行
    range(1,c)
    ,然后调用
    var()
    构造函数
    range
    (Python函数)在生成范围列表之前将其参数强制转换为
    int
    。该类型转换是产生错误的原因

    通过使用(Pyomo)
    value(c)
    函数显式计算表达式(
    c
    )的值,可以绕过该错误。但是,这将生成一个不同的错误(可能信息更丰富),即您在构建参数
    a
    之前对其进行评估。这是因为此时模型仍然是抽象的,并且为
    a
    提供值的数据文件甚至还没有被读取

    解决方案是创建一个显式Pyomo
    ,该集将充当表达式的占位符,并且在构建模型的其余部分之前不会被构造(也就是说,表达式
    c
    的计算将延迟到
    a
    的值可用为止)。例如:

    from pyomo.environ import *
    m = AbstractModel()
    m.a = Param()
    c = m.a*(m.a-1)/2
    # Note that RangeSet includes the upper bound, whereas range stops one short
    m.IDX = RangeSet(1,c-1) 
    m.var = Var(m.IDX, within=Binary)
    m.obj = Objective(expr = 0)
    

    您的示例使用master或当前版本(5.3)不会引发任何错误。请提供以下基本信息:平台、python解释器和版本、pyomo版本、安装方法,以及演示错误的(最小)示例。请查看@jsiirola的更改。感谢您的示例仍然没有生成您报告的错误。如果有一个完整的示例(例如,您如何声明
    m.a
    ?)、完整的错误(您的“(此处的某个内容)”实际上是有用的信息!)、平台、python解释器和版本、pyomo版本以及安装方法,这将更简单。感谢您的耐心@jsiirola。请看更新的问题。我试着回答你的问题。