我有一个最小化问题,目前只有连续变量
min Cx
s.t. Ax <= b
lb <= x <= ub
其中C是我的成本向量,A是我的系数矩阵,b是我的固定向量。 X是我的连续变量的变量向量。
A = 24x29,x = 29x1,b = 24x1
我要强制x变量之一为整数,如何在Pyomo中做到这一点?
我是新手,很感谢您的帮助
答案 0 :(得分:0)
实际上,我们永远不会将连续变量与整数变量混合使用。因此,对于实际模型,将变量声明为连续变量或整数变量并不是真正的限制。此规则并非Pyomo独有。诸如AMPL和GAMS之类的建模工具使用相同的范例。
话虽如此,让我们专注于您的问题。
解决这个问题的一种方法是:
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]
是整数。