我的模型有数字问题吗?

我的模型有数字问题吗?

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

  1. 通过导出模型文件和参数文件来隔离模型以进行测试。最简单的方法是创建一个gurobi.env在您的工作目录中包含以下行:
    记录1
    一旦你这样做了,运行你的程序将产生一个recordingXYZ.grbr文件用于程序创建的每个Gurobi环境(XYZ是一个从000开始增加的三位数字,填充0)。您可以使用gurobi_cl(例如,gurobi_cl recording000.grbr).咨询本节有关录音文件的更多信息。
  2. 使用Gurobi Interactive shell,运行一些简单的Python代码来读取重放生成的模型,并打印汇总统计信息:
    m = read('gurobi.rew')。
    输出如下所示:
    统计模型(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 >;较小的更好。

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

    < span > < / span > 6美元\ cdot10 ^ 6/0.00099 = 6.0606 \ cdot10 ^ 9。< span > < / span >美元
  3. 如果可能的话,使用相同的参数重新解析模型并检查日志。在Python shell中,使用如下代码:
    m.read (gurobi.prm) m.optimize ()
    以下是一些提示数字问题的警告信息的例子:
    警告:模型矩阵系数范围大考虑重新制定模型或设置NumericFocus参数,以避免数值问题。警告:马科维茨公差拧紧到0.5警告:切换到四精度数字误差数字问题遇到重启交叉…次最佳终止警告:…警告:未缩放的原始违反=…和残差=…警告:未缩放的双重违例=…和残差=…
  4. 优化功能完成后,打印解决方案统计信息。在Python shell中,使用如下代码:
    m.printQuality ()
    提供解决方案质量的总结:
    未命名:最大违规:界限: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 >美元),并查看求解器的行为是否再次变得一致。手机万博登录请注意,收紧公差通常是以增加计算时间为代价的,不应将其视为数值问题的解决方案。