1

我想解决一个整数规划问题,其中决策变量被限制在一个特定的集合中。

例如,必须在 [2,5,7,10] 中选择决策变量 xi。

为了测试,我使用 Pyomo 编写了 python 代码,如下所示:

from pyomo.environ import *
model = AbstractModel()
model.X = Set(initialize=[2, 5, 7, 10])
model.x = Var(within=model.X)
model.obj = Objective(expr=model.x+1)
m = model.create_instance()
opt = SolverFactory("glpk")
results = opt.solve(m)

执行这些代码时,我收到一条错误消息:“TypeError: Invalid domain type for variable with name 'x'. Variable is not Continuous, integer, or binary”

以下是我的问题:

  • 这个错误的原因是什么?
  • 如何处理?
  • 是否有任何其他优化工具可以处理此类问题?

感谢您的帮助!

4

1 回答 1

3
  • 这个错误的原因是什么?

    如错误所示,像 GLPK 这样的混合整数线性求解器只能处理连续、二进制和一般整数变量。当您指定

    model.X = Set(initialize=[2, 5, 7, 10])
    model.x = Var(within=model.X) 
    

    您正在尝试创建一个离散的分类变量,虽然 Pyomo 可以在内部表示,但它无法传递给特定的求解器。

  • 如何处理?

    有一个使用一组二进制变量的标准重新表述:

    model.X = Set(initialize=[2, 5, 7, 10])
    model.select_x = Var(model.X, domain=Binary)
    model.x = Var()
    def pick_one(m):
        return 1 == sum(m.selext_x[i] for i in m.X)
    model.pick_one = Constraint(rule=pick_one)
    def set_x(m):
        return m.x == sum(i*m.select_x[i] for i in m.X)
    model.set_x = Constraint(rule=set_x)
    
  • 是否有任何其他优化工具可以处理此类问题?

    虽然有一些求解器可以处理离散的分类变量,但使用上述重新表述可能会更好。

于 2016-10-28T05:09:58.930 回答