我想解决整数编程问题,其中决策变量在特定集合中受到限制。
例如,必须在[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'的变量的域类型无效。变量不是连续的,整数的或二进制的”
以下是我的问题:
感谢您的帮助!
答案 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)
还有其他可以处理此类问题的优化工具吗?
虽然有一些解算器可以处理离散的分类变量,但你可能最好使用上面的重构。