避免输入的舍入

避免输入的舍入

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

\\ 0.333 - 2y &=& .333 \end{eqnarray*}


人们可能倾向于认为这两个方程是等价的,但是将这两个方程都添加到一个模型中会导致错误的结果。这对我们的用户来说是很重要的一点:Gurobi将始终信任他们提供的输入数字,并且永远不会更改它们,除非可以证明更改不会影响解决方案。

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

\begin{displaymath} y:= 0.1665x - 0.1665 \end{displaymath}

当代入第一个约束条件时,它产生

\begin{eqnarray*} x - 6\cdot(0.1665x - 0.1665) &=& 1\\ lefrighttarrow 0.001x &=& 0.001 \end{eqnarray*}


因此<span>$</span>x = 1, y = 0<span>$</span>作为唯一的解决办法。

如果用户提供了这两个公式:

\begin{eqnarray*} x - 6y&=&1\ 0.33333333333333x - 2y&=&0.3333333333333333 \end{eqnarray*}


这将给:

\begin{displaymath} y:= 0.16666666666667x - 0.166666666666666767 \end{displaymath}

收益率:

\begin{eqnarray*} x - 6\cdot(0.1666666666666667x - 0.16666666666666666767) &=& 1\\ lefrighttarrow 2\cdot10^{-16} x + 1 + 2\cdot10^{-16} &\ approximate & 1\ end{eqnarray*}


即使用一个非常小的阈值来处理系数为零,这里的结果是第一个约束确实是多余的。任何解决方案<span>$</span>x = 6y + 1<span>$</span>是可行的。

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