1

我有一个没有目标函数的线性程序。所以我只是想测试一下它的可行性。我正在使用 GLPK api for simplex 来做到这一点。当我使用默认方法 (meth=GLP_PRIMAL) 运行单纯形时,求解器无法在 100000 次迭代中收敛(这是我设置的限制)。但是,当我使用 GLP_DUALP 方法时,经过几次迭代后,我收到消息“警告:双重退化;切换到原始单纯形”,并且它继续在合理数量的迭代中收敛。

所以我的问题是,如果它最终在两种情况下都使用原始单纯形,为什么它在第一种情况下不收敛。可能会发生什么。

提前致谢。

4

1 回答 1

0

如果没有有关问题的详细信息,很难说到底发生了什么,但基本上在双重退化情况下的原始单纯形是某种“热启动”。

使用对偶算法时,优化过程会产生对偶问题,该问题将从最优解开始,然后尝试找到仍然包含最优条件的可行解。相反,原始单纯形将从可行的解决方案开始,然后搜索最佳解决方案。

当强对偶定理为真时,两个最优解应该相同。在您的问题中,您会收到“双重退化”警告,这意味着在对偶问题中有一个方程变为 0。因此,该方程中的变量对目标函数没有影响(无论X100还是1) ,这是合理的,因为您没有目标函数。然后 GLPK 切换到原始单纯形,因为对于对偶问题存在替代最优解。使用已经导出的信息,原始单纯形可能会更快。我不知道 GLPK 到底在做什么,但通常可以使用对偶问题的可行解作为原始问题的下限。

使您的原始方法停滞不前的原因可能是同一个问题。问题退化了,单纯形算法卡在一个对目标没有影响的变量上,因此很难找到这个变量的最佳值。

于 2015-03-11T15:17:18.847 回答