首页 > 解决方案 > 如何强制 Gurobi 使用预求解阶段?

问题描述

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

谢谢。

标签: algorithmsolvergurobi

解决方案


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

但是,如果不查看源代码,很难判断您在做什么。


推荐阅读