Python Pyomo:Pyomo中的变量域错误

时间:2016-10-28 02:24:07

标签: python pyomo

我想解决整数编程问题,其中决策变量在特定集合中受到限制。

例如,必须在[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:名称为'x'的变量的域类型无效。变量不是连续的,整数的或二进制的”

以下是我的问题:

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

  • 出现此错误的原因是什么?

    如错误所示,像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)
    
  • 还有其他可以处理此类问题的优化工具吗?

    虽然有一些解算器可以处理离散的分类变量,但你可能最好使用上面的重构。