预溶

预溶

Gurobi-presolve算法旨在使模型更小、更易于求解。然而,在某些情况下,预解可能会导致数值问题。下面的Python代码可以帮助您确定是否发生了这种情况。首先,读取模型文件并打印预解析模型的摘要统计信息:

m=read('gurobi.rew')p=m.presolve()p.printStats()
如果数值范围看起来比原始模型差得多,请尝试使用参数聚合=0:
m、 重置()m.Params.Aggregate=0 p=m.presolve()p.printStats()
如果生成的模型在数值上仍然存在问题,则可能需要使用参数完全禁用预解算预溶=0; 使用以下命令尝试上述步骤:
m、 重置()m.Params.Presolve=0 p=m.Presolve()p.printStats()

如果统计数据与聚合=0预溶=0,您应该进一步测试这些参数。对于连续(LP)模型,可以直接测试它们。对于MIP,您应该比较有和没有这些参数的LP松弛。以下Python命令创建三个LP松弛:不带预解的模型、带预解的模型和带预解的模型聚合=0:

m=read('gurobi.rew')r=m.relax()r.write('gurobi.relax nopre.rew')p=m.presolve()r=p.relax()r.write('gurobi.relax pre.rew')m.reset()m.Params.Aggregate=0 p=m.presolve()r=p.relax()r.write('gurobi.relax-agg0.rew'))
对于这三个文件,使用前面提到的技术来确定预溶=0聚合=0改进LP松弛的数值计算。

最后,如果聚合=0有助于计算,但会使模型太慢,请尝试AggFill=0相反