避免输入四舍五入

避免输入四舍五入

数字问题的一个常见来源是用于表示约束矩阵系数的数字四舍五入。为了说明这个问题,考虑下面的例子:

< span > < /美元跨度> \{数组}{rcl}开始x - 6 y & = & 1 \ \ 0.333 x - 2 y & = &对于brute \结束美元{数组}< span > < / span >
人们可能会说这两个方程是等价的,但是把它们都加到一个模型中会得到一个错误的结果。这对我们的用户来说是很重要的一点:Gurobi将始终信任他们提供的输入数字,并且永远不会更改它们,除非能够显示出更改不会影响解决方案。

因此,考虑到这一点,在解决过程中,Gurobi可以使用第二个约束来确定:

< span > < / span > y:美元= 0.1665 x - 0.1665 < span > < / span >美元
当代入第一个约束时,它产生
<span>$</span>\begin{array}{rcl} x - 6\cdot(0.1665x - 0.1665) &=& 1\\ \Leftrightarrow 0.001x &=& 0.001 \end{array}<span>$</span> .
因此<span>$</span>x = 1,\ y = 0<span>$</span>作为唯一的解决方案。

如果用户提供了以下两个方程:

<span>$</span>\begin{array}{rcl} x - 6y&=&1\\
这将给:
<span>$</span>y:= 0.16666666666667x - 0.16666666666667 <span>$</span>
收益率:
< span > < /美元跨度> \{数组}{rcl} x - 6日开始\ cdot (0.1666666666666667 x - 0.1666666666666667) & = & 1 \ \ \ Leftrightarrow 2 \ cdot10 ^ {-16} x + 1 + 2 \ cdot10 ^{-16} & \大约1 \结束美元{数组}< span > < / span >
即使将系数视为零的阈值很小,这里的结果是第一个约束确实是多余的。任何解决方案<span>$</span>x = 6y + 1<span>$</span>将被认为是可行的。

的主要观点是,约束是完全平行,或线性相关(双精度浮点和小公差内)是无害的,但几乎是相互平行的约束产生微小系数线性系统解决了预处理,可以肆虐的解决方案的过程。在下一节中,我们将对这些限制进行扩展双精度浮点数字,特别是为什么< span > < / span > 1美元\大约1 + 2 \ cdot10 ^ {-16} < span > < / span >美元