我的模型有数值问题吗?#

您可以使用以下建议来识别模型是否面临数值问题:

  1. 检查模型统计信息。此Python代码读取模型文件并打印摘要统计信息:

    import gurobipy as gp
    m = gp.read('gurobi.rew')
    m.printStats()
    

    输出将如下所示:

    Statistics for model (null) :
      Linear constraint matrix    : 25050 Constrs, 15820 Vars, 94874 NZs
      Variable types              : 14836 Continuous, 984 Integer
      Matrix coefficient range    : [ 0.00099, 6e+06 ]
      Objective coefficient range : [ 0.2, 65 ]
      Variable bound range        : [ 1, 5e+07 ]
      RHS coefficient range       : [ 1, 5e+07 ]
    

    数值系数的范围是潜在数值问题的一个指标。作为一个非常粗略的指导原则,最大系数与最小系数的比值应小于\(10^9\);理想情况下应小于\(10^6\)

    在这个例子中,矩阵的范围是

    \[6\cdot10^6 / 0.00099 = 6.0606\cdot10^9.\]
  2. 解决模型并查看日志以获取警告信息。 Python函数是:

    m.optimize()
    

    以下是一些提示数值问题的警告信息示例:

    Warning: Model contains large matrix coefficient range
             Consider reformulating model or setting NumericFocus parameter
             to avoid numerical issues.
    Warning: Markowitz tolerance tightened to 0.5
    Warning: switch to quad precision
    Numeric error
    Numerical trouble encountered
    Restart crossover...
    Sub-optimal termination
    Warning: ... variables dropped from basis
    Warning: unscaled primal violation = ... and residual = ...
    Warning: unscaled dual violation = ... and residual = ...
    
  3. optimize函数完成并找到解决方案时,打印解决方案的统计信息。Python函数如下:

    m.printQuality()
    

    提供了解决方案质量的摘要:

    Solution quality statistics for model Unnamed :
      Maximum violation:
        Bound       : 2.98023224e-08 (X234)
        Constraint  : 9.30786133e-04 (C5)
        Integrality : 0.00000000e+00
    

    大于容差的违规是数值问题的另一个迹象。

    此外,对于纯线性规划(没有整数变量),打印条件数 KappaExact,这是一个模型属性,可以通过 Python 访问如下:

    m.KappaExact
    

    条件数衡量了线性计算中误差的潜在可能性;一个大的条件数,例如\(10^{12}\),是可能出现数值问题的另一个迹象,更多详情请参见部分。

  4. 使用不同的参数设置重新解决优化问题,例如更改种子方法的值。如果更改参数导致优化状态不同(例如,Infeasible而不是optimal),或者最优目标值发生变化,这通常是数值问题的迹象。为了进一步评估这一点,您可以收紧容差(到\(10^{-8}\)甚至\(10^{-9}\)的数量级),并查看求解器的行为是否再次变得一致。请注意,收紧容差通常会以更多的计算时间为代价,不应被视为解决数值问题的方法。