如何强制 Gurobi 使用预求解阶段?

How to force Gurobi to use presolve phase?

我正在使用 Benders 分解并在每次迭代中求解一个线性子问题。为了节省时间,我在 benders while 循环中生成了子问题。在每次迭代中,我解决主问题并更新其中一个子问题约束,然后优化子问题。由于我的子问题是一个大问题,因此在模型期间预先求解。 optimize() 可能有助于算法。在这方面,我将 model.setParam("presolve",value) 设置为 value=-1,1,2(目前这些选项中的 none 可以帮助我解决问题)。在第一次迭代中,在预求解阶段,删除行和列,并在合理的时间内求解模型。然而,在第二次迭代中,日志没有显示任何预求解阶段,并且由于问题结构,它无法解决 lp 问题。我的问题是:如何在每次迭代期间优化问题的同时强制 Gurobi 运行 预求解阶段?我不想使用 p.model.presolve() 和 p.optimize(),因为这样,求解器会错过问题 p 中已删除约束的对偶信息,我无法将 p 的解映射到问题 p 的解原来的问题。下面是小实例的日志(我在大实例也有同样的问题)。正如您在第二次迭代中看到的那样,我没有预求解阶段。 我将 Gurobi 9.0.1 与 python 3.7.

一起使用

第一次迭代的日志:

Parameter LogToconsole unchanged
Value: 1 Min: 0 Max: 1 Default: 1
Changed value of parameter presolve to 0
Prev: -1 Min: -1 Max: 2 Default: -1
Changed value of parameter presolve to 2
Prev: 0 Min: -1 Max: 2 Default: -1
timesp0 0.015599727630615234
timesp1 0.0
Gurobi Optimizer version 9.0.1 build v9.0.1rc0 (win64)
Optimize a model with 169068 rows, 994898 columns and 413255 nonzeros
Model fingerprint: 0xb25295a2
Coefficient statistics:
Matrix range [1e+00, 1e+00]
Objective range [7e+00, 5e+01]
Bounds range [0e+00, 0e+00]
RHS range [2e+00, 2e+02]

Concurrent LP optimizer: dual simplex and barrier
Showing barrier log only...

Presolve removed 168720 rows and 993466 columns
Presolve time: 0.48s
Presolved: 348 rows, 1432 columns, 3948 nonzeros

Ordering time: 0.00s

Barrier statistics:
AA' NZ : 2.600e+03
Factor NZ : 7.811e+03 (roughly 1 MByte of memory)
Factor Ops : 1.887e+05 (less than 1 second per iteration)
Threads : 1

Objective Residual
Iter Primal Dual Primal Dual Compl Time
0 1.20101504e+06 -7.22191384e+04 1.30e+04 1.81e-01 7.37e+01 0s
1 6.69083915e+05 -2.77917974e+05 3.86e+03 8.88e-16 1.91e+01 0s
2 1.76532366e+05 -1.19739093e+05 4.58e+02 1.36e-13 2.80e+00 0s
3 1.16881480e+05 2.17202950e+04 1.17e+02 3.11e-14 8.29e-01 0s
4 9.96399143e+04 6.74397912e+04 1.72e+01 6.55e-15 1.97e-01 0s
5 9.45489477e+04 8.41843844e+04 1.97e+00 1.61e-15 5.14e-02 0s
6 9.31070029e+04 9.04034661e+04 4.21e-01 5.00e-16 1.30e-02 1s
7 9.24454455e+04 9.22495713e+04 2.43e-03 3.54e-16 9.34e-04 1s
8 9.24011675e+04 9.24005419e+04 9.00e-06 2.98e-16 2.98e-06 1s
9 9.24007899e+04 9.24007893e+04 1.11e-12 4.07e-16 2.98e-09 1s

Barrier solved model in 9 iterations and 0.51 seconds
Optimal objective 9.24007899e+04

Crossover log...

60 DPushes remaining with DInf 0.0000000e+00 1s
0 DPushes remaining with DInf 0.0000000e+00 1s

789 PPushes remaining with PInf 0.0000000e+00 1s
0 PPushes remaining with PInf 0.0000000e+00 1s

Push phase complete: Pinf 0.0000000e+00, Dinf 0.0000000e+00 1s

Iteration Objective Primal Inf. Dual Inf. Time
852 9.2400790e+04 0.000000e+00 0.000000e+00 1s

Solved with barrier
Solved in 852 iterations and 0.75 seconds
Optimal objective 9.240078950e+04

第二次迭代的日志:

Parameter LogToconsole unchanged
Value: 1 Min: 0 Max: 1 Default: 1
Changed value of parameter presolve to 0
Prev: 2 Min: -1 Max: 2 Default: -1
Changed value of parameter presolve to 2
Prev: 0 Min: -1 Max: 2 Default: -1
timesp0 0.03119945526123047
timesp1 0.0
Gurobi Optimizer version 9.0.1 build v9.0.1rc0 (win64)
Optimize a model with 169068 rows, 994898 columns and 413255 nonzeros
Coefficient statistics:
Matrix range [1e+00, 1e+00]
Objective range [7e+00, 5e+01]
Bounds range [0e+00, 0e+00]
RHS range [2e+00, 2e+02]
Iteration Objective Primal Inf. Dual Inf. Time
0 -1.6398982e+03 8.440500e+04 0.000000e+00 0s
5061 8.4524006e+04 0.000000e+00 0.000000e+00 5s

谢谢。

求解器很可能是从之前的优化开始热启动的。如果您只是更改模型的几个部分而不是从头开始构建新模型,就会发生这种情况。也许,您可以尝试调用 Model.reset() 从头开始​​新的优化,并进行完整的预求解。

不过,如果不查看源代码,很难说出您在做什么。