Pyomo Integer Programming - 启发式地将特定变量设置为固定数字

Pyomo Integer Programming - Setting specific variables to fixed numbers heurestically

使用pyomo/cplex:

假设我有一个需要求解 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

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

有经验的大神能不能给我个好的意见,有更好的办法吗?

别担心。 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 可以消除模型的大部分,有时检查模型并查看模型是否真的比需要的大是很有用的。

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