OR-Tools GLOP求解器与LpSolve求解线性规划问题结果不一致的原因咨询
嗨,针对你遇到的这个问题,我整理了几个可能导致结果不一致的常见原因,你可以逐一排查:
求解器算法实现细节差异
虽然GLOP和LpSolve都基于单纯形法,但两者的具体实现细节有不少区别:比如 pivot 规则的选择(Bland规则/最大增量规则等)、退化问题的处理逻辑、浮点数运算的精度控制方式等。这些细节会影响求解路径,可能导致最终得到的变量取值有细微差异——不过如果问题的最优目标值是唯一的,两个求解器算出的目标函数值应该是一致的。数值精度容差设置不同
所有线性规划求解器都会存在浮点数运算的精度误差,而GLOP和LpSolve默认的精度容差(比如原问题可行性容差、对偶可行性容差)可能不一样。如果你的问题本身接近退化状态,这种精度差异会被放大,看起来结果就会有明显不同。你可以尝试调整其中一个求解器的精度参数,比如GLOP可以通过GLOPSolverParameters来修改容差,看看是否能对齐结果。你可能没正确获取C#代码的求解结果
看你的代码,只调用了solver.Solve()但没有输出变量取值和目标值,有可能求解是正确的,但你没拿到结果。建议在求解后添加结果输出代码:if (resultStatus == Solver.ResultStatus.OPTIMAL) { Console.WriteLine($"最优目标值: {solver.Objective().Value()}"); Console.WriteLine($"x1: {x1.SolutionValue()}"); Console.WriteLine($"x2: {x2.SolutionValue()}"); Console.WriteLine($"x3: {x3.SolutionValue()}"); Console.WriteLine($"t1: {t1.SolutionValue()}"); Console.WriteLine($"t2: {t2.SolutionValue()}"); Console.WriteLine($"u1: {u1.SolutionValue()}"); Console.WriteLine($"v1: {v1.SolutionValue()}"); } else { Console.WriteLine("未找到最优解"); }这样才能和LpSolve的结果做准确对比。
问题本身存在无穷多最优解
如果你的线性规划问题本身有多个最优解(即最优解是一个区间/区域),不同求解器可能会返回这个区域里的不同点,但目标函数值一定是相同的。你可以先对比两个求解器的目标函数值,如果目标值一致,只是变量取值不同,那就是这种情况,属于正常现象。
另外,我仔细核对了你的C#代码和LpSolve脚本,变量上下界、约束条件、目标函数的定义完全一致,这部分应该没有问题~
备注:内容来源于stack exchange,提问作者mantissa

