1

尝试使用GLPLK 的 GLPSOL解决线性规划问题时,我们遇到了一个问题,即在非常特定的情况下,使用不同编译器创建的glpsol可执行文件之间的结果是不同的。

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

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

 {(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编译会产生不同的模式。

所以问题主要是,为什么会发生这种情况

我猜这可能是每个编译器如何优化二进制文件的结果,但我不确定,我的目标是获得与Windows的原始可执行文件(使用Visual C++编译的那个)相同的结果和Linux。而且我怀疑使用Visual C++工具链进行交叉编译不会是一种选择。

注意:我通过将它们作为文本打开并在可执行文件中分别引用Visual C++GNU GCC来确定每个二进制文件使用的编译器。

谢谢!

4

1 回答 1

1

使用不同编译器构建的求解器版本在优化过程中可能采用不同的路径,这可能会导致您观察到的行为。可能影响这一点的因素是:浮点语义的差异(可能由 引起-ffast-math),排序的不同实现(qsort通常不是稳定的排序) - Ben Voigt 提到了这一点,标准库中随机数生成器的不同实现。

如果这两种解决方案都是最佳的,我不会太担心这一点。

于 2015-04-24T15:16:37.380 回答