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