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

时间:2019-07-19 15:07:36

标签: optimization pyomo mixed-integer-programming

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

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

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

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

我要强制x变量之一为整数,如何在Pyomo中做到这一点?

我是新手,很感谢您的帮助

2 个答案:

答案 0 :(得分:0)

实际上,我们永远不会将连续变量与整数变量混合使用。因此,对于实际模型,将变量声明为连续变量或整数变量并不是真正的限制。此规则并非Pyomo独有。诸如AMPL和GAMS之类的建模工具使用相同的范例。

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

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

  1. 创建一个标量整数变量y。
  2. 添加约束y = x[342](或任何您想要为整数值的x变量)

这听起来并不疯狂。好的MIP求解器可以解决此问题,因此对性能的影响应最小。

答案 1 :(得分:0)

Pyomo提供了一种设置变量域的方法。在此示例中,让我向您证明,您可以完全在具有复制/粘贴功能的Python控制台中运行。

假设您要将x[1]更改为整数,则可以使用(1是集合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]是整数。