尝试使用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来确定每个二进制文件使用的编译器。
谢谢!