将我的变量向量中的一个变量限制为 Pyomo 中的整数

Restricting one variable in my variable vector to integer in Pyomo

我有一个最小化问题,目前只有连续变量

min Cx
s.t. Ax <= b
lb <= x <= ub

其中 C 是我的成本向量,A 是我的系数矩阵,b 是我的固定向量。 X是我的连续变量的变量向量。

A​​ = 24x29, x = 29x1, b = 24x1

我想强制其中一个 x 变量为整数,在 Pyomo 中如何实现?

我是这个包的新手,感谢任何帮助

实际上,我们从不将连续变量与整数变量混合使用。所以对于实际模型,我们通过名称声明变量是连续的或整数并不是真正的限制。这条规则不是 Pyomo 独有的。 AMPL 和 GAMS 等建模工具使用相同的范例。

话虽如此,让我们专注于您的问题。

解决这个问题的一种方法是:

  1. 创建单个标量整型变量 y。
  2. 添加约束条件 y = x[342](或者任何你想要整数值的 x 变量)

这并不像听起来那么疯狂。一个好的 MIP 求解器会预先解决这个问题,因此对性能的影响应该是最小的。

Pyomo 提供了一种设置变量域的方法。让我在这个例子中向您证明,您完全可以在 Python 控制台中使用 copy/paste 运行。

假设您想将 x[1] 更改为整数,您可以使用 (1 being part of set S = {1,2,3}):

from pyomo.environ import ConcreteModel, Set, Var, Integers
# Create your model here (set params, vars, constraint...)
model = ConcreteModel()
model.S = Set(initialize={1,2,3})
model.x = Var(model.S)

让我们暂停示例,然后在 Python 控制台中键入 model.x.display()。您应该看到 model.x 中所有元素的域默认设置为 Real。让我们继续。

# Here, we suppose your model is created.
# You can change the domain of one lement of your var using this line:
model.x[1].domain = Integers

现在,在您的 Python 控制台中输入 model.x.display(),您应该会看到:

x : Size=3, Index=S
Key : Lower : Value : Upper : Fixed : Stale : Domain
  1 :  None :  None :  None : False :  True : Integers
  2 :  None :  None :  None : False :  True :    Reals
  3 :  None :  None :  None : False :  True :    Reals

所以,只有 x[1] 是整数。