Python-Pyomo:Pyomo中的变量域错误

Python-Pyomo:Pyomo中的变量域错误,python,pyomo,Python,Pyomo,我想解决一个整数规划问题,其中决策变量被限制在一个特定的集合中 例如,在[2,5,7,10]中必须选择决策变量席。< /P> 为了进行测试,我使用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

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

例如,在[2,5,7,10]中必须选择决策变量席。< /P> 为了进行测试,我使用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”的变量的域类型无效。变量不是连续的、整数的或二进制的

以下是我的问题:

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

  • 这个错误的原因是什么

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

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

      • 这个错误的原因是什么

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

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


      使用Var(in=Integers,bounds=(1,3))我没有清楚地描述这个问题。我已经修好了。我已经阅读了你对其他问题的回答。看来你是《俾莫》的作者?非常感谢你的帮助。我该如何处理这个问题@GabeHackebeilUse Var(in=Integers,bounds=(1,3))我没有清楚地描述这个问题。我已经修好了。我已经阅读了你对其他问题的回答。看来你是《俾莫》的作者?非常感谢你的帮助。我该如何处理这个问题@GabeHackebeilThanks非常喜欢。受你对问题2的回答的启发,我通过向变量x添加SOS1约束来重新表述原始问题,并使用Gurobi优化工具解决它。非常感谢。受您对问题2的回答的启发,我通过向变量x添加一个SOS1约束,并使用Gurobi优化工具来解决它,从而重新表述了原始问题。