为什么编译器会改变线性规划解的结果? (GLPLK/GLPSOL)

Why does the compiler change the result of a linear programming solution? (GLPLK/GLPSOL)

尝试使用 GLPLK 的 GLPSOL 解决线性规划问题时,我们遇到了一个障碍,即在非常特殊的情况下,glpsol[= 之间的结果59=]不同编译器创建的executable不同

情况是我们有几个有效的解决方案。简单来说,我们有一个 table,其中每一行 (X) 只能分配一列 (Y),并且反之亦然。因此,分配唯一 column/row 对的所有组合都是有效的。

例如,对于 2x2 table,这些是有效的:

 {(X0,Y0),(X1,Y1)}   {(X0,Y1),(X1,Y0)}

现在,我们在 windows 下使用的原始 glpsol 二进制文件按顺序返回结果,如下所示:

 {(X0,Y0),(X1,Y1)...(Xn,Yn)}

我们注意到 Linux 二进制文件存在问题,它以不同的顺序返回解决方案,如下所示:

 {(X0,Y0),(Xn,Y1),(X1,Y2) ....}

请注意顺序不是随机的,每次执行都遵循相同的模式。

经过大量调查,我发现问题出在使用哪个编译器创建每个二进制文件。在我们上面的示例中,Windows 二进制文件是使用 Visual C++ 编译的,而 Linux 使用二进制 GCC.

我已经通过使用 GCC 重新编译 Windows 二进制文件验证了这一点,结果是相同的模式。使用 Borland 编译会产生不同的模式。

所以问题主要是,为什么会这样

我猜这可能是每个编译器如何优化二进制文件的结果,但我不确定,我的 objective 是为了获得与原始 executable(用 Visual C++ 编译的那个)都用于 WindowsLinux。而且我怀疑使用 Visual C++ 工具链进行交叉编译不是一种选择。

注意: 我通过将它们作为文本打开并在引用 的 executable 中定位文本字符串来设法确定每个二进制文件使用的编译器分别是 Visual C++GNU GCC

谢谢!

使用不同编译器构建的求解器版本在优化过程中可能采用不同的路径,这可能会导致您观察到的行为。可能影响这一点的事情是:浮点语义的差异(可能由 -ffast-math), different implementations of sort (qsort is normally not a stable sort 引起)——Ben Voigt 提到了这一点,标准库中随机数生成器的不同实现。

如果两个方案都是最优的,我就不会太在意这个。