Pyomo整数编程-启发式地将特定变量设置为固定数

时间:2019-12-26 23:57:44

标签: cplex pyomo

使用pyomo / cplex:

假设我有一个cost函数,需要求解25个整数,每个整数可以是(0到4)

实际模型比这要复杂得多,但我正在尝试将其最小化。

model.x = Var(range(25), range(5), domain=Binary, initialize=0)

for i in range(25):
    model.constraint.add(sum([model.x[i, j] for j in range(5)]) == 1)

假设我发现使用不同的逻辑方法,整数0、1、2应该等于4。 我所做的是我将约束设置如下:

model.constraint.add(model.x[0, 4]) == 1
model.constraint.add(model.x[1, 4]) == 1
model.constraint.add(model.x[2, 4]) == 1

我的想法是我想将预定义的整数设置为通过其他方法发现的固定解,以加快计算时间。但是,我读到,通过添加更多约束,您应该花更多时间来找到解决方案。

如果有更好的方法,有经验的人可以给我好的意见吗?

1 个答案:

答案 0 :(得分:1)

不用担心。 Cplex将解决此问题。在Cplex开始迭代之前,这些变量将从模型中删除。

Cplex日志将显示一些有关预解析成功的消息。您应该看到如下消息:

MIP Presolve eliminated 497 rows and 497 columns.
MIP Presolve modified 8530 coefficients.
Reduced MIP has 8556 rows, 8915 columns, and 34502 nonzeros.
Reduced MIP has 8915 binaries, 0 generals, 0 SOSs, and 0 indicators.

这将显示在预求解阶段之后模型变小了多少。

如果生成大量这些单例约束,则指定边界可能更有效。这可以为Pyomo生成模型节省时间。在很多情况下,这并不是真正要担心的事情,并且使用边界而不是约束更多是一个品味问题。

如果Cplex可以消除模型的大部分内容,则有时检查模型并查看模型是否确实超出所需范围很有用。

当然,直接使用整数变量可能要比使用一系列二进制变量更好。我认为有充分的理由使用这些二进制变量。