将我的变量向量中的一个变量限制为 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 等建模工具使用相同的范例。
话虽如此,让我们专注于您的问题。
解决这个问题的一种方法是:
- 创建单个标量整型变量 y。
- 添加约束条件
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]
是整数。
我有一个最小化问题,目前只有连续变量
min Cx
s.t. Ax <= b
lb <= x <= ub
其中 C 是我的成本向量,A 是我的系数矩阵,b 是我的固定向量。 X是我的连续变量的变量向量。
A = 24x29, x = 29x1, b = 24x1
我想强制其中一个 x 变量为整数,在 Pyomo 中如何实现?
我是这个包的新手,感谢任何帮助
实际上,我们从不将连续变量与整数变量混合使用。所以对于实际模型,我们通过名称声明变量是连续的或整数并不是真正的限制。这条规则不是 Pyomo 独有的。 AMPL 和 GAMS 等建模工具使用相同的范例。
话虽如此,让我们专注于您的问题。
解决这个问题的一种方法是:
- 创建单个标量整型变量 y。
- 添加约束条件
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]
是整数。