编辑:不要混淆数学优化算法,不要与单纯噪声或三角剖分混淆。
我正在实现自己的线性编程求解器,我想使用32位浮点数来实现。我知道Simplex对数字的精度非常敏感,因为它会执行大量计算,并且如果使用的精度太低,则可能会出现舍入误差。但是,我仍然想使用32位浮点数来实现它,因此我可以将指令设置为4宽,也就是说,我可以一次使用SIMD进行4次计算。我知道我可以使用双打并在2宽范围内进行指令,但4大于2:)
我的浮点实现遇到了问题,解决方案不是最理想的,或者说这个问题不可行。对于混合整数线性程序,尤其是这种情况,我用分支定界法解决。
所以我的问题是:如何避免舍入误差导致不可行,无界或次优的解决方案?
我知道我可以做的一件事就是缩放输入值,使它们接近一个(http://lpsolve.sourceforge.net/5.5/scaling.htm)。我还能做些什么吗?
答案 0 :(得分:0)
是的,我尝试使用分支定界法和贪婪算法作为启发式方法来实现扩展背包问题的算法,它是单纯形的精确模拟,并采用了选择最大目标增量的枢轴策略。 >
我对算法的数值稳定性也有疑问。
就个人而言,如果我们继续使用浮点数,我认为没有简单的方法可以消除这些问题,但是有一种方法可以检测分支过程中的不稳定性。
我认为,通过实验而不是稳定性分析中的严格数学,大多数错误会通过非常接近系统约束的整数解决方案传播。
给定任何整数解,我们找出该解的松弛度,如果向量的元素非常小,或者在1e-14至1e-15的范围内,则停止分支并报告不稳定性。 / p>