15

当我向我的问题添加特定约束时,解决更改为“未定义”后问题的 LpStatus(没有此约束,它是“最佳”)。在此页面的顶部,显示了返回状态的可能性,但似乎没有解释它们的含义。谁能解释“未定义”状态的含义?它类似于指定约束时的语法错误吗?

4

2 回答 2

16

PuLP中的求解器可以返回五个状态代码:

  1. 最佳
  2. 未解决
  3. 不可行
  4. 无界
  5. 不明确的

最佳

存在并找到最优解。

未解决

是解决问题之前的默认设置。

不可行

问题没有可行的解决方案。

无界

成本函数是无界的。

不明确的

尚未找到可行的解决方案(但可能存在)。

它们似乎是来自GPLK的状态代码的映射。

大部分信息来自阅读和这个资源

于 2014-07-23T19:02:19.470 回答
3

“未定义”意味着 PuLP 不知道如何解释求解器的输出,但似乎在某些混合整数程序不可行时会发生。

你得到“未定义”还是“不可行”取决于 PuLP 使用的求解器,例如 CBC、GLPK、COIN 等。这些求解器有一个“预求解”步骤,然后是一个求解步骤;如果在预求解中检测到不可行,它将返回“未定义”,如果在求解步骤中检测到,它将返回“不可行”。

我只使用过 CBC 和 GLPK 求解器,而且我只看到过 CBC 求解器的这个特殊问题。该线程表明 GLPK 求解器中的相同错误已在 GLPK 版本 4.53 中修复。

以下是有关“未定义”来自何处的一些附加技术信息:

我的假设是“未定义”状态意味着 CBC 以某种奇怪的方式终止,使 PuLP 为松弛子问题提供了中间解决方案。(因为当 PuLP 的 readsol_MPS 方法无法在 CBC 解决方案文件中找到任何其他 PuLP 状态时,“未定义”是默认状态。我在 PuLP 的solver.py 中发现了这一点。)

这是预解决问题的来源

当 mip 预处理器(而不是 mip 求解器)检测到不可行时,可能会发生这种情况,它错误地不会更改 mip 求解状态,因此它保持未定义。

于 2017-05-06T19:49:02.657 回答