Pyomo - pyomo 数值到整数的隐式转换

Pyomo - implicit conversion of pyomo numeric value to integer

我正在尝试优化 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.

我认为错误是在我尝试取 range(1,c) 时出现的。如果我错了,请纠正我。

我有 Python 2.7.12,Pyomo-5.3(Linux 上的 CPython-2.7.12)。我在安装时必须向某人询问安装方法,因此可能需要一些时间。安装方法我再问问安装的人再更新

谢谢。

这里发生了两件事:

  1. 您在定义参数之前对其进行评估。
  2. 您正在将 Pyomo 表达式隐式转换为整数。

问题的根源在于您将抽象模型视为具体模型。对于抽象模型,当您声明 m.a 时,您只是在声明参数 a 存在 。 Python 然后继续解析和执行模型的其余部分。当它命中 c = m.a*(m.a-1)/2 时,Python 生成代表 right-hand-side 的 Pyomo 表达式树。最后,当到达m.var = Var(range(1,c), within=Binary)时,Python先执行range(1,c),然后再调用Var()构造函数。 range(Python 函数)在生成范围列表之前将其参数转换为 int。该转换是产生错误的原因。

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

解决方案是制作一个显式的 Pyomo Set 它将作为表达式的占位符,并且在构建模型的其余部分之前不会构建(也就是说,表达式 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)