我的模型有数值问题吗?

我的模型有数值问题吗?

您可以按照以下步骤来帮助确定模型是否遇到数值问题:

  1. 通过导出模型文件和参数文件来隔离用于测试的模型。最简单的方法就是创建一个gurobi.env文件,其中包含以下行:
    记录1
    然后,运行Gurobi程序,它将生成gurobi.rec文件。之后,您可以使用gurobi_cl
  2. 使用Gurobi Interactive shell,运行一些简单的Python代码来读取重播生成的模型,并打印汇总统计信息:
    m = read('gurobi.rew') . printstats ()
    输出如下所示:
    统计模型(null):线性约束矩阵:25050若干,15820 var, 94874年通过变量类型:14836连续984整数矩阵系数范围:[0.00099,6 e + 06]目标系数范围:[0.2,65]变量绑定范围:[1,5 e + 07] RHS系数范围:(1、5 e + 7)
    数值系数的范围是潜在数值问题的一个指示。作为一个非常粗略的准则,最大系数与最小系数的比值应该小于< span > < / span > 10 ^ 9美元美元< span > < / span >;较小的更好。

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

    \begin{displaymath}6\cdot10^6 / 0.00099 = 6.0606\cdot10^9.\end{displaymath}

  3. 如果可能的话,使用相同的参数重新解析模型并检查日志。在Python shell中,使用如下代码:
    m.read (gurobi.prm) m.optimize ()
    以下是一些提示数字问题的警告信息示例:
    考虑重新构造模型或设置NumericFocus参数以避免数值问题。警告:马科维茨公差收紧到0.5警告:切换到四精度数字错误数字故障遇到重新启动交叉…次优终止警告:…Warning: unscaled primal violation =…剩余=…警告:未缩放的双违规=…剩余=…
  4. 优化功能完成后,打印解决方案统计。在Python shell中,使用如下代码:
    m.printQuality ()
    提供了解决方案质量的总结:
    未命名模型的解决方案质量统计:最大违反:Bound: 2.98023224e-08 (X234)约束:9.30786133e-04 (C5)完整性:0.00000000e+00

    超出公差的违规是数字问题的另一个迹象。此外,对于纯LP(不含整型变量),可以通过以下Python命令打印条件号:

    m.KappaExact
    条件数测量线性计算中潜在的误差;大条件数,如< span > < / span > 10美元^ {12}< span > < / span >美元,是可能出现数字问题的另一个迹象章节以了解更多细节。
  5. 如果更改参数(例如,方法种子)会导致不同的优化状态(例如,不可行而不是最优),或者如果最佳目标值发生了变化,这通常是数字问题的标志。为了进一步评估这一点,你可以收紧公差(按照< span > < / span > 10美元^ {8}< span > < / span >美元甚至< span > < / span > 10美元^ {9}< span > < / span >美元),看看求解器的行为是否再次变得一致。手机万博登录请注意,紧致公差通常以更多的计算时间为代价,不应被视为数值问题的解决方案。